2013年2月11日 星期一

vim 顯示目前函式的名稱

我平常習慣用 gj 跳到某個 symbol 位置, 但接下來上下讀程式時, 有時需要知道目前在那個函式裡, 幸好有前人提供 script 做這件事。省了自己摸索的時間。

藉這機會順便學一些 vim script 的語法:

fun! ShowFuncName()
  let lnum = line(".")  " (1)
  let col = col(".")
  echohl ModeMsg        " (2)
  echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))  " (3)
  echohl None
  call search("\\%" . lnum . "l" . "\\%" . col . "c")  "(4)
endfun
map F :call ShowFuncName() <CR>  " (5)

注意 vim 是用 「"」 表示後面的字為註解

1.

  • let VAR = VALUE: vim 的設值
  • line("."): expression, 取回目前行數
  • col("."): expression, 取回目前欄數

這裡存下目前的位置, 在 (4) 的時候可以跳回原位 (後述)。

2.

  • 切換 echo 字串 highlight 的方式, 比方 echohl WarningMsg 預設會顯示紅字

3.

  • :call FUNCTION(...): 呼叫函式 FUNCTION
  • getline(N): 顯示檔案內第 N 行字串
  • search(REGEXP, FLAG): 搜尋字串, 跳到符合的位置並傳回顯示符合的行數
  • :call search(REGEXP, 'bW'): b 表示往上搜; W 表示搜到底的時候, 不用從頭 (或尾) 繼續搜。見 Searching - Vim Tips Wiki 了解更多 search 技巧
  • 所以這一行的意思是往上找到開頭「兩個字不為空白字元和註解開頭」的行, 並且此行結尾不能是':'
  • 由於 search() 會傳回行數, 搭配 getline() 完成目的

若希望此函式一併支援 Objective-C 的函式, 更改 REGEXP 即可, 雖說會有一些辛苦就是了。

4.

  • 由於 search() 會更動游標位置, 再用 search("\\%Yl\\%Xc") 跳回原本的位置, 其中 (X, Y) 表示原本的游標位置

5.

  • 我平時會用到 f, 所以改用 F 觸發這個函式。

1 則留言:

  1. 能顯示 .h 檔案中 c++ nested class ?

    目前所在位置是屬於一層class 嗎?

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...