我平常習慣用 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 觸發這個函式。
能顯示 .h 檔案中 c++ nested class ?
回覆刪除目前所在位置是屬於一層class 嗎?