VIM高階實用技巧

也許是Vim的幫助已經很詳細,關於VIM的書籍比較少,
這本【Practical Vim】,中文譯名【Vim實用技巧】(書名太樸實)中描述了很多技巧和思路,
對有一定經驗的Vim使用者而言,是非常好的提高資料。以下內容是書中摘錄和部分總結。

--------------------------------------------------------------
文本對象操作

文本對象
[i|a]{obj}
a表示包含範圍字符,可理解爲all; i表示不包含範圍字符,可理解爲內部。
obj可以是:'"{}[]()<>中的任意1個,還可以是b(代表圓括號),B(代表大括號),t(標籤),ap(段落)

可在文本對象前添加動作命令
比如:

di( di) dib 	刪除內含 '(' ')' 塊, 保留括號
da( da) dab 	刪除一個 '(' ')' 塊
di{ di} diB 	刪除內含 '{' '}' 大塊, 保留括號
da{ da} daB 	刪除一個 '{' '}' 大塊
di[ di]  		刪除內含 '[' ']' 塊, 保留括號
da[ da] 	 	刪除一個 '[' ']' 塊
di> di<  		刪除內含 '<' '>' 塊, 保留括號
da> da< 	 	刪除一個 '<' '>' 塊
dat             刪除標籤內容
dit             刪除標籤內容,不含標籤本身
di" 			刪除當前的第一個字符串,保留引號
da" 			刪除當前的第一個字符串,不保留引號
di’ 			刪除當前的第一個字符串,保留引號
da’ 			刪除當前的第一個字符串,不保留引號
dap 			刪除一個段落

cab             修改()中的內容
dit             刪除標籤中的內容
ci"             修正字符串內容

--------------------------------------------------------------
插入模式下粘貼寄存器文本

<C-r>{register}0

複製專用默認寄存器名爲0,其他寄存器爲a~z
例如,複製當前單詞

普通模式:yaw
插入模式:<C-r>0

例如,使用a寄存器複製當前行
普通模式:"ayy
插入模式:<C-r>a
--------------------------------------------------------------
在插入模式下隨時隨地計算
<C-r>=
=是表達式寄存器

例如,插入模式時計算23小時的秒數:
<C-r>=23*3600=82800

--------------------------------------------------------------
虛擬替換模式

對Tab等進行替換時,如果想保持格式不變化,可以使用gR替換R,
gR虛擬替換模式下視Tab爲空格進行替換
儘量使用gR替換R的使用。

--------------------------------------------------------------
normal命令
normal可以在命令模式下執行若干普通模式命令。

例如,註釋文件的所有內容
:%normal i//
因爲normal在執行普通命令時會移動到行首,所以I和i效果一樣

@: 重複上一次執行的Ex命令, @@用來重複上一次的命令(和宏一樣)

--------------------------------------------------------------
補全Ex命令
例如,列出所有的顏色主題

:colorschema <c-d>
--------------------------------------------------------------
命令行窗口
q: 打開命令行窗口,可在其中瀏覽、編輯、執行歷史命令
q/ 打開搜索歷史命令窗口

--------------------------------------------------------------
打開和當前文件同一目錄下的文件
:e %:h<Tab>
其中%代表當前文件名,:h則會去除文件名本身,剩下路徑
--------------------------------------------------------------
一些快捷鍵
gj 屏幕行下移 (wrap的情況下)
gk 屏幕行上移 (wrap的情況下)

F{char} 反向查找字符
--------------------------------------------------------------
path的設置
find命令、gf命令在尋找文件時從path中按路徑查找

例如增加/usr/include路徑作爲檢索路徑
:set path+=/usr/include/**
:find mong<c-d>
可以顯示出所有mong開頭的頭文件,如果你裝了mongodb的話。

--------------------------------------------------------------
寄存器使用

  1. 顯示寄存器內容
    :reg
    :reg "a
    :reg "0

"0爲複製專用寄存器,d/c/s命令不會覆蓋它的內容,只有y會。
"+爲系統剪切板,”*是linux上的主剪切板,windows下 “+和”*相同

--------------------------------------------------------------
gp和gP

普通的p/P在複製後,光標被置於複製行的首位,複製多行時不方便。
gp和gP複製後,光標處於複製內容之後,方便多次連續複製。

--------------------------------------------------------------
正則表達式的魔術模式

vim的正則表達式對特殊字符如+*.等默認轉義和主流語言不太一樣,
記憶哪些字符需要轉義十分麻煩。

例如,查找附着在行尾的空白符
正常模式:
/\s+$
+必須轉義

應用魔術模式\v,會將_,大小寫字母,數字以外的字符均視爲特殊字符。
魔術模式: /\v\s+$ +已被是爲特殊字符,無需轉義

相反的\V(原義開關)將會把 \以外的所有字符視爲普通字符

--------------------------------------------------------------
自動補全

補全整行文本

{char}<c-x><c-l>

根據正在編輯文件內容補全

{char}<c-x><c-i>

根據tag文件補全

{char}<c-x><c-]>

文件名補全(根據vim的當前工作路徑)

{char}<c-x><c-f>

工作路徑可以通過:cd命令進行變更

上下位置調整可以用
<c-p>和<c-n>

--------------------------------------------------------------
global命令

:global命令允許在某個指定模式的所有匹配行上運行Ex命令
:[range] global[!] /{pattern}/ [cmd]

默認range爲整個文件%,默認命令爲print

例如,刪除以#開頭的行
:g /^#/ de

例如,將#開頭的行都複製到文件末尾
:g /^#/ t$

例如,將#開頭的行都複製寄存器a
:g /^#/ y A

vglobal是global的反向操作

--------------------------------------------------------------
vimgrep和quickfix的配合

:vim[grep][!] /{pattern}/[g][j] {file} ...
			在文件 {file} ... 裏搜索模式 {pattern},並用匹配結果設
			置錯誤列表。
			如果沒有 'g' 標誌位,每行只加一次。
			如果有 'g',每個匹配都被加入。

:vim[grep][!] {pattern} {file} ...
			同上,但不用非 ID 的字符包圍模式,而只用空白分隔。該模
			式必須以 ID 字符開頭。

上面命令1的g如果沒有指定,每行只匹配一次
上面命令1的j如果沒有指定,則有檢索結果的情況下會直接跳轉到第一項
上面命令2的區別在於分隔符,如果不需要檢索空格,則後者更方便些。

:copen 20 打開quickfix窗口,20行高度
:cn
:cp
@: 重複上一次Ex命令(:cn或:cp)
@@ 重複上一次Ex命令

例如,在下層目錄中搜索所有c和文件
搜索
:vimgrep include **/*.c **/*.h
:vimgrep /\cinclude/gj **/*.c **/*.h
\c爲不區分大小寫

查看
:copen 30

移動
:cn

重複移動(先@:,再@@)
@: @@

另外,vimgrep的輸出是quickfix,但quickfix只有一個。
多種輸出的場合下,可以使用lvimgrep,對應的輸出會放到當前窗口列表中
:lvimgrepa[dd][!] /{pattern}/[g][j] {file} ...
:lvimgrepa[dd][!] {pattern} {file} ...
和 “:vimgrepadd” 類似,但使用當前窗口的位置列表而不是quickfix 列表。

另外,輸出內容還可以追加
:vimgrepa[dd][!] /{pattern}/[g][j] {file} ...
:vimgrepa[dd][!] {pattern} {file} ...
和 “:vimgrep” 類似,但不是建立新的錯誤列表,而是附加到現有的列表之後。```

比如還是剛纔的例子:
:vimgrep include **/*.c
:vimgrepadd include **/*.h
--------------------------------------------------------------
關於**

在 Unix、Win32、Mac OS/X 和一些其它系統上,可以擴展 “**”。它允許你在目錄樹裏搜
索。最大深度可以到 100 層目錄。
注意 有些命令的工作方式略有不同。見 |file-searching|。
例如:
:n /*.txt
找到文件:
ttt.txt
subdir/ttt.txt
a/b/c/d/ttt.txt
如果使用了非通配字符,只匹配第一層目錄。例如:
:n /usr/inc
/*.h
找到文件:
/usr/include/types.h
/usr/include/sys/types.h
/usr/inc_old/types.h

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章