Vim是號稱“編輯器之神”的文本編輯軟件,自從接觸Vim以來,基本上都是用Vim來修改和編寫代碼和配置文件的。
但是我一直只會用最基本的命令,雖然把HJKL的定位鍵已操縱地很熟練。但是Vim其他強大的地方卻幾乎沒有觸及過。
學一樣東西,就要把它學精。
這裏記錄了一些常用的使用技巧。
零、將VIM打造爲超級IDE
先附上鍊接
手把手教你把Vim改裝成一個IDE編程環境(圖文)
手把手教你把Vim改裝成一個IDE編程環境(圖文) -- 續1
在Fedora下成功將Vim打造成適用於C/C++的IDE
把VIM打造成一個真正的IDE(1) :這是一個系列,後面還有幾篇
一、兩行合併爲一行:
int
main(int argc,char argv)
假如要把上面兩行併爲一行,只需要定位於int這行,然後按J(大寫),即可。
二、撤消和重做
以前很傻,只知道按u來撤消,不知道重做。不一小心,撤消過頭就傻了。原來重做是Ctrl+r。
另外,大寫U用來撤消整行。
三、連續插入n個感嘆號
以前以爲用i/a不能進行連續多個字符的插入,原來錯了!
Hello World
比如要在上面這句話後面插入10個"!",總不能真的打10個吧?
只要在普通模式下把光標定位於d,然後按10a!……不對啊,才一個!,別急,再按兩下Esc!哈哈,出來10個!了吧!這個貌似不太常用,但挺好玩,呵呵~
四、快速保存退出
之前我會用兩個退出方法:
保存並退出:wq
不保存並退出:q!
現在保存並退出有更快的方法──直接在普通模式下按ZZ即可。
另外,用:e!可以不保存文件並重新載入這個文件。
五、移動和滾動
直接按w/b來按單詞滾動,w是向前移動一個單詞,b是向後移動一個單詞,我居然不常用!虧我還常常dwdw的來刪除詞。
另外,Ctrl+D向下滾屏,Ctrl+U向上滾屏,比我之前hjkl(左下右上)的有效率多了……汗
不知道在哪裏?
:set number,來顯示行號,:set nonu取消行號,行號+gg(或者 行號+G)直接到達該行。
六、查找時忽略大小寫和歷史查找
: 行號
如:
:12
就會跳到12行去
有時查找單詞時需要忽略大小寫,只要設置下面的就可以了
:set ignorecase
還有另外一種忽略搜索時大小寫的方法更好用,只要在待搜索字符串後加個\c就可以了
/stringYouWantToSearch\c
假如進行過幾次查找,想繼續以之前查過的關鍵詞查找時,只要按/,然後上下鍵來選擇即可
同理,按下:,然後上下鍵,也可以翻看執行過的歷史紀錄,不過僅限於當前的編輯。
七、快速查找
你要找當前光標定位處的字段,難道要慢吞吞輸入/和字段嗎?不必了!直接按*號,Vim就會把當前的字段作爲查找內容,找下一處。
對了,:set hlsearch可以將查找的內容設置成高亮。這樣就好看了。反之,加上:set nohlsearch就可以了。上面的ignorecase也可以加no。
八、定義標記
現在才發現定義標記這個超有用的東西!真是後悔莫及啊!
以前在一個C文件裏,從一個方法跳到另一個方法,跳來跳去,都是記行數的……
原來,按下ma,就會給光標所在處標記了一個a,接下來可以通過`a來訪問這個地方!注意,符號`是數字1左邊那個符號,此外,通過'a,可以訪問那個位置的行首,注意,符號'是單引號。
打命令:marks可以看到所有的標記。
而''或``,就可以在最近的兩個標記之間相互跳轉!
當你用 "G" 命令跳到另一個地方,Vim 會記住你從什麼地方跳過去的。這個位置成爲一個標記,要回到原來的地方,使用如下命令:'',''命令可以在兩個位置上跳來跳去。而 CTRL-O 命令則跳到一個 "較老" 的地方 (提示: O 表示 older)。CTRL-I 則跳到一個 "較新"
的地方.
:jumps 命令能輸出一個你可以跳往的位置的列表。最後一個你使用的標記會用 ">" 符號標記出來。
Vim 允許你在文本中放置自定義的標記。命令 "ma" 用 a 標記當前的光標位置。你可以在文本中使用 26 個標記 (a 到 z)。這些標記是不可見的,只是一個由 Vim 記住的位置。
要跳到一個你定義的標記,可以使用命令`{mark},這裏 {mark} 是指定義標記的那個字母。所以,移到標記 a 的命令是: `a
你可以用如下命令取得所有的標記的列表::marks
到有一些特殊的標記,包括:
' 跳轉前的光標位置
'' 最後編輯的光標位置
[ 最後修改的開始位置
] 最後修改的結束位置
注:mark僅在當前文件跳轉有效,jumps可在多個文件之間來回跳轉
九、替換文本(這個沒看懂怎麼用................)
* 用cw或ce來將光標所處的單詞替換掉,效果是一樣的;
* 按cc的話,直接替換整行。 另外,用S也能達到同樣的效果;
* 按C=c$,替換當前至行尾的內容;
* s的話,是替換當前的字符,跟r的功能一樣;
* 以前刪除一行至末尾用d$,原來D就行了;
上面的大多數都可以加數字!
十、可視選擇(這個我沒怎麼用過.....)
* 按v進行選擇,如果想控制頭和尾,按o/O進行切換;
* 如果是大寫的V,則按行進行選擇;
十一、刪除單詞和替換句子、複製單詞
* 一般來說,用dw/de刪除單詞需要將光標定位於單詞開頭(de不會刪除單詞後的空格,dw會刪除單詞後的空格),用dw/de時需移到單詞開頭是因爲dw/de會從光標所在的那個字符(包括該字符)開始刪除直到該單詞結束,但是如果用daw,則無需這樣,只要光標在這個單詞上就可以了(daw會將空格一起刪除,daw=Delete
a Word),如果不包括空格,就是diw;
* 替換句子的話,就用cis就行了(目前我試驗出來的可以被用以標示一句話結束的標點符號是英文的問號?和句號. )
接下來看下複製:
yy命令複製當前整行的內容到vi緩衝區
yw複製當前光標所在位置到單詞尾字符的內容到vi緩存區,相當於複製一個單詞,而yaw/yiw也是複製一個單詞,但光標可以處在該單詞的任何位置,比起yw的需要移動到單詞的首字符要方便。
y$複製光標所在位置到行尾內容到緩存區
y^複製光標所在位置到行首內容到緩存區
#yy 例如:5yy就是複製5行
#yw 例如:2yw就是複製兩個單詞
如果要複製第m行到第n行之間的內容,可以在末行模式中輸入m,ny例如:3,5y複製第三行到第五行內容到緩存區。
十二、模式轉換
Vim作爲一種強大的編輯工具,是通過鍵盤來實現,而不是通過鼠標來實現的。這一點很重要。
vim有三種常見的模式,Normail Mode(命令模式),Insert Mode(輸入模式)和Visual Mode(視圖模式)。
這幾種模式的切換是也是很直接方便的,比如在命令模式下,要求輸入字符,只要輸入i就進入輸入模式
而根據要輸入位置和當前光標的關係不同,有不同的切換。
總之可以把命令模式和輸入模式的切換有Append,Insert,Replace,Subsitute 記作AIRS,這種記憶方法特別方便
英文單詞的意思是空氣,vim在命令模式和輸入模式的切換就像空氣一樣,無影無形。
而AIRS的英文字母的大小寫意思是不一樣的。小寫的表示characterwise(字符),大寫的表示linewise(行)
十三、 刪除、複製指定個數個字符
比如 : 5yl 複製光標後的5個字符(包括光標所在的那個字符)
5yh 複製光標前的五個字符(不包括光標所在的那個字符)
5dl 刪除光標後的5個字符(包括光標所在的那個字符)
5dh 刪除光標前的5個字符(不包括光標所在的那個字符)
十四、強大的替換功能
替換::%s/old_string/new_string/g。或者:3,7s/old_string/new_string/g
在一個目錄下替換文本中的某個字符串
sed -i 's/orig_string/new_string/g' *
http://www.nonozone.net/vim-model-commonly-used-in-the-replacement-summary.html
http://gooss.org/vim-tips-replace-the-ingenious-use-of-4/
http://gooss.org/vim-tips-replace-the-ingenious-use-of-3/
十五、同時編輯多個文件
在vim的普通模式下輸入 :e filename,可以打開並編輯新的文件,但如果當前文件還沒有保存的話,會有錯誤提示,這時需使用:w 先將其保存才行。
如果正在用vim編輯着多個文件,可以用 ctrl+^ 在他們之間來回切換,比如現在同時打開了6個文件,則就有6個不同的緩衝區,比如現在在編輯文件1,想切換到文件5去,則需要先把本文件保存(通過 :e ),然後再按5,再按ctrl+^,就切換到文件5了。
:rew 讀入編輯名單中的第一個文件, :last 讀入編輯名單中的最後一個文件。:next 會關閉光前文件打開下個文件開始編輯,但當前文件也需要先:w保存。,但 :set hidden 允許在有未保存的修改時切換緩衝區,此時的修改由 vim 負責保存.
你打開了幾個窗口,現在你想退出 Vim,你可以分別關閉每一個窗口。更快的方法是:
:qall
這表示 "quit all"(全部退出)。如果任何一個窗口沒有存盤,Vim 都不會退出。同時
光標會自動跳到那個窗口,你可以用 ":write" 命令保存該文件或者 ":quit!" 放棄修改。
如果你知道有窗口被改了,而你想全部保存,則執行如下命令:
:wall
這表示 "write all"(全部保存)。但實際上,它只會保存修改過的文件。Vim 知道保
存一個沒有修改過的文件是沒有意義的。
另外,還有 ":qall" 和 "wall" 的組合命令:
:wqall
這會保存所有修改過的文件並退出 Vim 。
最後,下面的命令由於退出 Vim 並放棄所有修改:
:qall!
注意,這個命令是不能撤消的。
或者也可以用多窗口來在一個界面中編輯多個文件,如下:
vim -o a b c 打開多個文件,每個文件一個窗口(水平分割)
vim -O a b c 打開多個文件,每個文件一個窗口(垂直分割)
或者:
打開一個 :sp 另外一個文件 (水平分割) :vsp 文件名(垂直分割)
如此就可以在一個窗口打開2個或多個文件了。可以使用 ctrl + 兩次按 w在多個窗口的文件中切換
窗口大小調整:(輸入順序: ctrl+shift+w 行數 +/-/>/<)
ctrl+shift+w, 5, - 當前窗口縮小5 行(高度,(如不指定行數,默認爲1)
ctrl+shift+w, 5, + 當前窗口增加5 行(高度,(如不指定行數,默認爲1)
ctrl+shift+w, 5, > 當前窗口增加5 列(寬度,(如不指定列數,默認爲1)
ctrl+shift+w, 5, < 當前窗口增加5 列(寬度,(如不指定列數,默認爲1)
ctrl+shift+w, = 使所有窗口幾乎一樣大
ctrl+shift+w, _(下劃線) 使當前窗口最大化
十六、執行shell命令
在 vi 中也可以執行 shell 的命令。在命令模式下,指令:!command,command 是shell 命令。例如指令:!date 會把目前的時間和日期顯示到螢幕上。
要是你想把shell 命令的結果放到文件中,可以用:r !command。比如r !date 會把現在的時間放到光標所在的行的下一行。可以指定行數,例如:20r !date 會把現在的時間放到第二十行。
如果你要下一連串的shell 命令但又不想離開vi,你可以在line mode 下指令sh。這個指令會建立一個shell,如果要離開sh回到vim,可輸入exit,或按ctrl-D 。
也可以選擇檔案中的文字作爲shell 命令的輸入。輸出的結果會把替換掉你輸入的文字。例如:2,5!sort 會把第二列到第五列的文字依序排列,而原來的文字就會被覆蓋。
十七、編輯得更快一點
按詞移動
w
按下w會前進一個詞。
b
按下b會後退一個詞。
這裏,就像在Vim中的大部分情況下一樣,在這兩個命令前面加上一個數字可以讓它們重複做多次。
移動到行首或行末
$
$會讓你移動到所在行的末尾。
^
^會讓你移動到所在行的開始。Home鍵也可以做相似的事。不過^會移動到第一個非空的字符處,而Home會移動到行首。
這兩個命令也接受數字參數,比如
2$
會移動到下一行末。
在行上查找
f要查找的字符
f用來在一行上查找一個字符並移動到該字符所在處。比如
fx
用來移動到此行當標後第一個x處。如果有一個數字參數,就可以指定移動到某個指定的匹配位置。
F
F用來向左查找。
移動到指定行
行號G
G命令會把你帶到用行號指定的行。如果使用沒有行號的G,將會移動到最後一行。
顯示當前所在位置
:set number
Vim的可制定性是很強的,所以你可以通過:set設定很多選項。number就是其中之一。它是一個布爾選項,用來控制是否在最左邊顯示行號。
:set number
可以把它打開。
:set nonumber
則可以關閉此選項。
Ctrl+g
Ctrl+g會顯示當然後在的位置。
向上和向下翻屏
Ctrl+u
會向上翻半屏
Ctrl+d
會向下翻半屏
刪除文本
dw
dw會刪除一個詞。你應該可以看得出來,這裏的w代表的就是word(詞).其實d後面可以加好多東西來控制刪除的對象。比如:
d$
會刪除從當前位置到行末的所有內容,同理,d^會刪除從當前位置到行首的所有內容。
數字放在哪
這裏有一個疑問,如果想刪除三個詞,那麼應該怎麼辦?是d3w,還是3dw。其實它們都能做到,不過原理不太一樣。d3w是一次刪除三個詞,而3dw是執行三次刪除一個詞。其實這兩者可以混起來,比如2d3w。
改變文本
cc
用來刪除一行並進入輸入狀態。
cw
用來刪除一個詞並進入輸入狀態等。
替換字符
r替換的字符
r命令把當標處的字符替換成在r命令中指定的字符。
更改大小寫
~
通過~可以把光標處的字符用它的大寫(如果現在是小寫)或小寫(如果現在是大寫)替換。
宏
Vim有着簡潔而強大的宏功能。
q宏名
按下 q+宏名 後會進入宏錄製狀態,也就是說,此後發生的一切操作都會記錄到名爲“宏名”的宏中。如果名爲“宏名”的宏已經存在,則將它覆蓋。
@宏名
會調用名爲“宏名”的宏。
十八、使用舉例
1.在不是以hello開頭的行裏,如果其行末以old結尾,則將其替換爲new,該命令爲 :
這裏用到了全局命令:g,詳見下圖:
比如想把開頭不是#的行的開頭添加上爲#,可以這樣寫 :g/^[^#]/s/^/#/
(一個不錯的vim學習資源: http://my.donews.com/mingfal/category/vim/)
推薦文章:
vim的保存文件和退出相關命令