vim:常用命令
l 模式切換
在插入模式或命令列模式中按“ESC”或者“Ctrl+[”即可進入普通模式,在普通模式中輸入“i”或者“a”即可進入插入模式,輸入“:”進入命令列模式。
l 開啟檔案
命令列模式中輸入": 檔案路徑+檔名"可開啟檔案。
l 文件編輯
文件編輯是vim最主要的功能,分幾個點來講述。
- 移動游標
在普通模式下,移動游標
按鍵 |
說明 |
h |
左 |
L |
右 |
J |
下 |
K |
上 |
w |
移動到下一個單詞 |
b |
移動到上一個單詞 |
3w |
移動到游標後第三個單詞的首字母 |
e |
將游標移動到下一個單詞的最後一個字元 |
ge |
將游標移動到前一個單詞最後一個字元 |
(n)$ |
將游標移動到當前行(後第n行)行尾 |
^ |
將游標移動到當前行第一個非空白字元上 |
0 |
將游標移動到當前行的首字元上 |
G |
將游標移動到最後一行,(計數n)G移動到第n行 |
gg |
移動到第一行 |
:set number |
顯示行號 |
:set nonumber |
關閉行號 |
:set ruler |
在vim視窗右下角顯示當前游標位置 |
`` |
當使用G命令從一個地方跳轉到另一個地方時,vim會記得起跳的位置,使用``可以在兩個位置間跳轉。鍵盤上``與“~”在同一個按鍵上。 |
CTRL-O |
vim能夠記憶游標位置,該命令可以跳轉到之前的游標位置,而CTRL-I是跳轉到時間靠後的游標位置。 |
具名標記 |
“ma”命令會將當前游標下的位置標記為"a","`a"命令可以將游標跳轉到標記為a的位置所在行行首,“:marks”用來檢視標記的列表,“:delm!”將刪除所有標記。 |
CTRL-U |
顯示文字的視窗向上滾動半屏 |
CTRL-D |
向下滾動半屏 |
CTRL-E |
向上滾動一行 |
CTRL-Y |
向下滾動一行 |
CTRL-F |
向上滾動一整屏 |
CTRL-B |
向下滾動一整屏 |
zz |
將當前行置為螢幕正中央 |
zt |
將當前行置為螢幕頂端 |
zb |
將當前行置為螢幕底端 |
- 插入文字
按以下按鍵將從普通模式進入插入模式,並可從相應位置開始輸入。
命令 |
說明 |
i |
在當前光標出進行編輯 |
I |
在行首插入 |
A |
在行末插入 |
a |
在游標後插入 |
|
在當前行後插入一個新行 |
O |
在當前行前插入一個新行 |
S或cc |
改變整行 |
C或c$ |
改變當前游標到行尾的內容 |
s或cl |
修改一個字元 |
- 選擇文字
在virtual模式下被選中的文字會高亮顯示,可以對選中的文字進行復制貼上及刪除等操作。
命令 |
說明 |
v |
進入可視模式,從游標位置開始,游標所經過的地方被選中,再按一次v結束 |
V |
從當前行開始,游標所經過的行都會被選中,再按一次V結束 |
Ctrl+v |
從游標當前位置開始,選中游標起點和終點所構成的矩形區域,再按一次Ctrl+v結束 |
ggVG |
選中全部文字,gg跳到首行,V選中當前行(首行),G跳到末尾 |
ve |
選中一個單詞 |
- 複製黏貼
命令 |
說明 |
y(n)w |
複製n個字元到暫存器 |
yy或者Y |
複製整行 |
y$ |
複製當前游標至行尾的文字 |
p |
貼上(從暫存器取出) |
"+y |
複製到系統剪貼簿,即vim的+暫存器 |
"+p |
從系統剪貼簿貼上 |
nyy |
n表示大於1的數字,複製n行 |
yw |
從游標處複製至一個單子/單詞的末尾,包括空格 |
ye |
從游標處複製至一個單子/單詞的末尾,不包括空格 |
y$ |
從當前游標複製到行末 |
y0 |
從當前游標位置(不包括游標位置)複製之行首 |
y3l |
從游標位置(包括游標位置)向右複製3個字元 |
y5G |
將當前行(包括當前行)至第5行(不包括它)複製 |
y3B |
從當前游標位置(不包括游標位置)反向複製3個單詞 |
- 刪除文字
命令 |
說明 |
x或diw |
刪除一個字元 |
X |
刪除當前游標之前的字元 |
dd |
刪除整行,下面的行會自動移上來,刪除的內容保留在剪下板中可以貼上到其他地方,其他刪除同 |
J |
刪除換行符,即兩行會合成一行 |
D |
刪除當前游標至行尾的內容 |
dw |
刪除自當前游標至下一個word的開頭 |
dG |
刪除當前行至檔案尾的內容 |
dgg |
刪除當前行至檔案頭的內容 |
dw |
刪除游標之後的單詞剩餘部分 |
d$ |
刪除游標之後的該行剩餘部分 |
- 搜尋和替換
檔案內搜尋字串
命令 |
說明 |
/字串 |
往游標之後尋找該字串 |
?字串 |
往游標之前尋找該字串 |
(計數x)n |
往下繼續尋找一個(第x個)相同的字串 |
(計數x)N |
往上繼續尋找一個(第x個)相同的字串 |
:set ignorecase或:set ic |
匹配的結果忽略大小寫 |
:set noignorecase或:set noic |
精確匹配大小寫的結果 |
:set hlsearch |
高亮顯示搜尋結果,:set nohlsearch可關閉這一功能 |
* |
將游標所在的字元作為目標字元往下查詢,前面可加計數n,代表查詢第三個匹配到的結果,"#"與"*"相同,只是往上查詢 |
目錄下搜尋字串
一些場合,可以用cscope find t可以解決了。可是遇到複雜的模式,該命令就捉襟見肘了。這時候就得用vim自帶的匹配利器---vimgrep。
vimgrep有兩種使用的方式:
1)將匹配模式放到//之間:這樣情況下,使用vim的正則模式來進行匹配
命令格式::vim[grep][!] /{pattern}/[g][j] {file}
例子:
:vim /function demo/ *.c 在當前目錄的.c檔案中,搜尋function demo
:vim /function demo/ **/*.c 在任意目錄的.c檔案中,搜尋function demo
:vim /function demo/ **/*.{h,c} 在任意目錄的.c和.h檔案中,搜尋function demo
:vim /\cfunction demo/ **/*.c 使用\c,不區分大小寫
:vim /\Cfunction demo/ **/*.c 使用\C,區分大小寫
:vim /function demo/j *.c 只更新quickfix,不跳轉到第一個搜尋結果
:vim /function demo/g *.c 一行中若有多個匹配,每個都要單獨顯示一行
2)直接加匹配模式:這種情況下只能搜尋ID,舉個例子,就不詳細說了
:vimgrep Error *.c
vimgrep可以跟split或vsplit結合使用,將結果顯示到單獨的視窗中:
vsp | vimgrep demo *.c
lvimgrep跟vimgrep功能上是一樣的,但該命令更新提本地的視窗列表,而不是quickfix列表
若結果更新到quickfix:
用cw檢視,cn下一條,cp上一條,ccl關閉結果,colder上次搜尋結果,cnewer下次搜尋結果。
若結果更新到本地的視窗列表:
用lopen檢視,lcl關閉,lnext下一條,lpre上一條,lolder上次搜尋結果,lnewer下次搜尋結果。
常用vim文字匹配表示式
匹配符 |
說明 |
\> |
表示一個單詞結尾處,比如/the\>,表示查詢以the結尾的字串 |
\< |
表示一個單詞結尾處,比如/\<the,表示查詢以the開始的字串,那麼/\<the\>,表示查詢以the作為完整單詞的字串 |
^ |
匹配一行的開頭,/^the,表示只匹配一行開始處的the |
% |
匹配一行的結尾,/the$,表示只匹配一行結尾處的the |
. |
匹配任何單字元,比如/c.m,可以匹配到com,cim,cam等 |
\ |
匹配特殊字元,比如查詢中文句號“。”就寫成/\。 |
|
|
替換文字
命令 |
說明 |
:1,$s/舊文字/新文字/g |
將檔案中所有匹配到的就文字替換為新文字 |
:10,20s/舊文字/新文字/ |
將第10行至第20行中匹配的舊文字替換為新文字 |
U |
將選中的文字全部改為大寫 |
u |
將選中的文字全部改為小寫 |
- 重做編輯
命令 |
說明 |
u |
撤銷上一次的操作 |
CTRL-R |
重做,即撤銷的撤銷 |
|
|
- 儲存和放棄編輯
命令 |
說明 |
ZZ |
儲存當前檔案並退出vim |
:q! |
放棄所有修改並退出 |
:e! |
放棄所有修改並重新載入改檔案的原始內容 |
:set aw或:set autowrite |
在執行:next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令時就會自動將修改的內容儲存 |
:set autowriteall或者:set awa |
和:set aw類似,除了以上命令外,執行":edit"、":enew"、":quit"、":qall"、":exit"、":xit"、":recover" 和關閉 Vim 視窗時也都會將修改的內容儲存 |
- 函式跳轉
Ctrl+] |
跳轉到函式定義,Ctrl+t可以調回呼叫處 |
|
|
|
|
- 檢視檔案和檔案間切換
命令 |
說明 |
:e 檔案路徑\檔名A |
編輯檔案A |
:vim 檔案A、檔案B…… |
編輯多個檔案,只顯示第一個檔案,完成該檔案的編輯後使用“:n”可以儲存修改成果,並繼續下一個檔案編輯 |
:args |
顯示當前編輯的檔案 |
:(x)n |
編輯檔案列表後第x個檔案 |
:(x)prev |
編輯檔案列表前第x個檔案 |
:last |
編輯最後一個檔案 |
:first |
編輯第一個檔案 |
:args a b c…… |
重新定義一個檔案列表 |
CTRL-^ |
在檔案間切換 |
檔案標記 |
在編輯檔案a時執行"50%mF"其中F是一個檔案標記,標記的位置是檔案a的中間,或者執行"GnB"表示將檔案a的最後一行標記為B,那麼在其他檔案b中執行F或B就能回到a檔案的中間或最後一行。CTRL-O和CTRL-I可以跳轉到較早的位置和靠後的位置。 |
vim -R file |
以只讀方式開啟檔案 |
vim -M file |
以強制只讀方式開啟檔案 |
:sav a.c |
將當前檔案儲存並改名為a.c |
:f(ile) a.c |
將當前編輯的檔案改名為a.c但是不儲存 |
:split |
分割一個視窗 |
CTRL-W |
切換當前活動視窗 |
:close |
關閉當前視窗 |
:only |
關閉除當前視窗外其他所有視窗 |
: split a.c |
為檔案a.c分割一個視窗作為編輯a的視窗 |
:new |
分割一個視窗並開始編輯一個空緩衝區 |
:vsplit、:vsplit a.c 和:vnew |
垂直分割一個視窗 |
CTRL- W h |
到左邊的視窗 |
CTRL- W j |
到下面的視窗 |
CTRL- W k |
到上面的視窗 |
CTRL- W l |
到右邊的視窗 |
CTRL- W t |
到頂部視窗 |
CTRL- W b |
到底部視窗 |
針對所有視窗的命令 |
":qall"放棄所有操作並退出,":wall"儲存所有,":wqall"儲存所有並退出。 |
l 其他
1、使用vimdiff檢視不同
"vimdiff main.c~ main.c",另一種進入diff模式的辦法可以在Vim執行中操作。編輯檔案"main.c",然後開啟另一個分隔視窗顯示其不同:
":edit main.c"
":vertical diffpatch main.c.diff"。
2、頁籤
命令":tabe(dit) thatfile"在一個視窗中開啟"thatfile",該窗口占據著整個的Vim顯示區域。命令":tab split/new"結果是新建了一個擁有一個視窗的頁籤。以用"gt"命令在不同的頁籤間切換。
最後附上一張vim常用按鍵圖。