vim快捷鍵

vim快捷鍵

vim模式

  1. 正常模式:正則表達式

    可使用快捷鍵命令,或按:輸入命令行。
  2. 插入模式:shell

    能夠輸入文本,在正常模式下,按i、a、o等均可以進入插入模式。
  3. 可視模式編程

    正常模式下按v能夠進入可視模式, 在可視模式下,移動光標能夠選擇文本。按V進入可視行模式, 老是整行整行的選中。ctrl+v進入可視塊模式。
  4. 替換模式vim

    正常模式下,按R進入。

啓動vim

vim -c cmd file         在打開文件前,先執行指定的命令
vim -r file         恢復上次異常退出的文件
vim -R file         以只讀的方式打開文件,但能夠強制保存
vim -M file         以只讀的方式打開文件,不能夠強制保存
vim -y num file     將編輯窗口的大小設爲num行
vim + file          從文件的末尾開始
vim +num file       從第num行開始
vim +/string file   打開file,並將光標停留在第一個找到的string上
vim --remote file   用已有的vim進程打開指定的文件。 若是你不想啓用多個vim會話,這個頗有用。但要注意, 若是你用vim,會尋找名叫VIM的服務器;若是你已經有一個gvim在運行了, 你能夠用gvim --remote file在已有的gvim中打開文件

文檔操做

:e file                 關閉當前編輯的文件,並開啓新的文件 若是對當前文件的修改未保存,vi會警告
:e! file                放棄對當前文件的修改,編輯新的文件
:e+file                 開始新的文件,並從文件尾開始編輯
:e+n file               開始新的文件,並從第n行開始編輯
:enew                   編譯一個未命名的新文檔。(CTRL-W n)
:e                      從新加載當前文檔
:e!                     從新加載當前文檔,並丟棄已作的改動
:e#或ctrl+^              回到剛纔編輯的文件,很實用
:f或ctrl+g               顯示文檔名,是否修改,和光標位置
:f filename             改變編輯的文件名,這時再保存至關於另存爲。
gf                      打開以光標所在字符串爲文件名的文件。
:w                      保存修改
:n1,n2w filename        選擇性保存從某n1行到另n2行的內容
:wq                     保存並退出
ZZ                      保存並退出
:x                      保存並退出
:q[uit]                 退出當前窗口(CTRL-W q或CTRL-W CTRL-Q)
:saveas newfilename     另存爲
:Sex                    水平分割一個窗口,瀏覽文件系統
:Vex                    垂直分割一個窗口,瀏覽文件系統

光標的移動

基本移動

在normal模式下windows

h或退格        左移一個字符
l或空格        右移一個字符
j           下移一行
k           上移一行
gj          移動到一段內的下一行
gk          移動到一段內的上一行
+或Enter     把光標移至下一行第一個非空白字符
-           把光標移至上一行第一個非空白字符
w           前移一個單詞,光標停在下一個單詞開頭
W           移動下一個單詞開頭,但忽略一些標點
e           前移一個單詞,光標停在下一個單詞末尾
E           移動到下一個單詞末尾,若是詞尾有標點,則移動到標點
b           後移一個單詞,光標停在上一個單詞開頭
B           移動到上一個單詞開頭,忽略一些標點
ge          後移一個單詞,光標停在上一個單詞末尾
gE          同 ge ,不過‘單詞’包含單詞相鄰的標點
(           前移1句
)           後移1句
{           前移1段
}           後移1段
fc          把光標移到同一行的下一個c字符處
Fc          把光標移到同一行的上一個c字符處
tc          把光標移到同一行的下一個c字符前
Tc          把光標移到同一行的上一個c字符後
;           配合f & t使用,重複一次
,           配合f & t使用,反向重複一次
0           移動到行首
g0          移到光標所在屏幕行行首
^           移動到本行第一個非空白字符
g^          同 ^ ,可是移動到當前屏幕行第一個非空字符處
$           移動到行尾
g$          移動光標所在屏幕行行尾
n|          把光標移到遞n列上
nG          到文件第n行
:n<cr>      移動到第n行
:$<cr>      移動到最後一行
H           把光標移到屏幕最頂端一行
M           把光標移到屏幕中間一行
L           把光標移到屏幕最底端一行
gg          到文件頭部
G           到文件尾部

翻屏操做

ctrl+f      下翻一屏
ctrl+b      上翻一屏
ctrl+d      下翻半屏
ctrl+u      上翻半屏
ctrl+e      向下滾動一行
ctrl+y      向上滾動一行
n%          到文件n%的位置
zz          將當前行移動到屏幕中央
zt          將當前行移動到屏幕頂端
zb          將當前行移動到屏幕底端

標記

m{a-z}              標記光標所在位置,局部標記,只用於當前文件
m{A-Z}              標記光標所在位置,全局標記。標記以後,退出Vim, 從新啓動,標記仍然有效   
`{a-z}              移動到標記位置
'{a-z}              移動到標記行的行首
`{0-9}              回到上[2-10]次關閉vim時最後離開的位置
``                  移動到上次編輯的位置。''也能夠,不過``精確到列,而''精確到行 。若是想跳轉到更老的位置,能夠按C-o,跳轉到更新的位置用C-i
`"                  移動到上次離開的地方
`.                  移動到最後改動的地方
:marks              顯示全部標記
:delmarks a b       刪除標記a和b
:delmarks a-c       刪除標記a、b和c
:delmarks a c-f         刪除標記a、c、d、e、f
:delmarks!          刪除當前緩衝區的全部標記
:help mark-motions  查看更多關於mark的知識

插入文本

基本插入

i                   在光標前插入;一個小技巧:按8,再按i,進入插入模式,輸入=, 按esc進入命令模式,就會出現8個=。 這在插入分割線時很是有用,如30i+<esc>就插入了36個+組成的分割線
I                   在當前行第一個非空字符前插入
gI                  在當前行第一列插入
a                   在光標後插入
A                   在當前行最後插入
o                   在下面新建一行插入
O                   在上面新建一行插入
:r filename         在當前位置插入另外一個文件的內容
:[n]r filename      在第n行插入另外一個文件的內容
:r !date            在光標處插入當前日期與時間。同理,:r !command能夠將其它shell命令的輸出插入當前文檔

改寫插入

c[n]w       改寫光標後1(n)個詞。
c[n]l       改寫光標後n個字母。
c[n]h       改寫光標前n個字母。
[n]cc       修改當前[n]行。
[n]s        以輸入的文本替代光標以後1(n)個字符,至關於c[n]l。
[n]S        刪除指定數目的行,並以所輸入文本代替之。

剪切複製和寄存器

剪切和複製、粘貼

[n]x        剪切光標右邊n個字符,至關於d[n]l
[n]X        剪切光標左邊n個字符,至關於d[n]h
y           複製在可視模式下選中的文本
yy or Y     複製整行文本
y[n]w       複製一(n)個詞
y[n]l       複製光標右邊1(n)個字符
y[n]h       複製光標左邊1(n)個字符
y$          從光標當前位置複製到行尾
y0          從光標當前位置複製到行首
:m,ny<cr>   複製m行到n行的內容
y1G或ygg     複製光標以上的全部行
yG          複製光標如下的全部行
yaw和yas     複製一個詞和複製一個句子,即便光標不在詞首和句首也不要緊
d           刪除(剪切)在可視模式下選中的文本
d$ or D     刪除(剪切)當前位置到行尾的內容
d[n]w       刪除(剪切)1(n)個單詞
d[n]l       刪除(剪切)光標右邊1(n)個字符
d[n]h       刪除(剪切)光標左邊1(n)個字符
d0          刪除(剪切)當前位置到行首的內容
[n] dd      刪除(剪切)1(n)行
:m,nd<cr>   剪切m行到n行的內容
d1G或dgg     剪切光標以上的全部行
dG          剪切光標如下的全部行
daw和das     剪切一個詞和剪切一個句子,即便光標不在詞首和句首也不要緊
d/f<cr>     這是一個比較高級的組合命令,它將刪除當前位置 到下一個f之間的內容
p           在光標以後粘貼
P           在光標以前粘貼

文本對象

aw      一個詞
as      一句
ap      一段
ab      一塊(包含在圓括號中的)

寄存器

a-z     均可以用做寄存器名。"ayy把當前行的內容放入a寄存器
A-Z     用大寫字母索引寄存器,能夠在寄存器中追加內容。 如"Ayy把當前行的內容追加到a寄存器中
:reg    顯示全部寄存器的內容
""      不加寄存器索引時,默認使用的寄存器
"*      當前選擇緩衝區,"*yy把當前行的內容放入當前選擇緩衝區
"+      系統剪貼板。"+yy把當前行的內容放入系統剪貼板

查找和替換

查找

/something          在後面的文本中查找something
?something          在前面的文本中查找something
/pattern/+number    將光標停在包含pattern的行後面第number行上
/pattern/-number        將光標停在包含pattern的行前面第number行上
n                   向後查找下一個
N                   向前查找下一個

替換

:s/old/new          用new替換當前行第一個old
:s/old/new/g        用new替換當前行全部的old
:n1,n2s/old/new/g   用new替換文件n1行到n2行全部的old
:%s/old/new/g       用new替換文件中全部的old
:%s/^/xxx/g         在每一行的行首插入xxx,^表示行首
:%s/$/xxx/g         在每一行的行尾插入xxx,$表示行尾全部替換命令末尾加上c,每一個替換都將須要用戶確認。 如:%s/old/new/gc,加上i則忽略大小寫(ignore)若是不指定range,則表示當前行。
m,n                 從m行到n行。
0                   最開始一行(多是這樣)。
$                   最後一行
.                   當前行
%                   全部行

正則表達式

\d      表示十進制數
\s      表示空格
\S      非空字符
\a      英文字母
\|      表示 或
\.      表示.
{m,n}   表示m到n個字符。這要和 \s與\a等連用,如 \a\{m,n} 表示m 到n個英文字母
{m,}    表示m到無限多個字符
**      當前目錄下的全部子目錄
:help pattern獲得更多幫助

排版

基本排版

<<          向左縮進一個shiftwidth
>>          向右縮進一個shiftwidth
:ce(nter)   本行文字居中
:le(ft)     本行文字靠左
:ri(ght)    本行文字靠右
gq          對選中的文字重排,即對過長的文字進行斷行
gqq         重排當前行
gqnq        重排n行
gqap        重排當前段
gqnap       重排n段
gqnj        重排當前行和下面n行
gqQ         重排當前段對文章末尾
J           拼接當前行和下一行
gJ          同 J ,不過合併後不留空格

拼寫檢查

:set spell      開啓拼寫檢查功能
:set nospell    關閉拼寫檢查功能
]s              移到下一個拼寫錯誤的單詞
[s              做用與上一命令相似,但它是從相反方向進行搜索
z=              顯示一個有關拼寫錯誤單詞的列表,可從中選擇
zg              告訴拼寫檢查器該單詞是拼寫正確的
zw              與上一命令相反,告訴拼寫檢查器該單詞是拼寫錯誤的

編輯多個文件

一次編輯多個文件

使用:next(:n)編輯下一個文件
:2n 編輯下2個文件
使用:previous或:N編輯上一個文件
使用:wnext,保存當前文件,並編輯下一個文件
使用:wprevious,保存當前文件,並編輯上一個文件
使用:args 顯示文件列表
:n filenames或:args filenames 指定新的文件列表
vi -o filenames 在水平分割的多個窗口中編輯多個文件
vi -O filenames 在垂直分割的多個窗口中編輯多個文件

多標籤編輯

vim -p files            打開多個文件,每一個文件佔用一個標籤頁
:tabe, tabnew       若是加文件名,就在新的標籤中打開這個文件, 不然打開一個空緩衝區
^w gf               在新的標籤頁裏打開光標下路徑指定的文件
:tabn               切換到下一個標籤。Control + PageDown,也能夠
:tabp               切換到上一個標籤。Control + PageUp,也能夠
[n] gt              切換到下一個標籤。若是前面加了 n , 就切換到第n個標籤。第一個標籤的序號就是1
:tab split          將當前緩衝區的內容在新頁籤中打開
:tabc[lose]         關閉當前的標籤頁
:tabo[nly]          關閉其它的標籤頁
:tabs               列出全部的標籤頁和它們包含的窗口
:tabm[ove] [N]      移動標籤頁,移動到第N個標籤頁以後。 如 tabm 0 當前標籤頁,就會變成第一個標籤頁

緩衝區

:buffers或:ls或:files         顯示緩衝區列表
ctrl+^                      在最近兩個緩衝區間切換
:bn                         下一個緩衝區
:bp                         上一個緩衝區
:bl                         最後一個緩衝區
:b[n]或:[n]b                 切換到第n個緩衝區
:nbw(ipeout)                完全刪除第n個緩衝區
:nbd(elete)                 刪除第n個緩衝區,並未真正刪除,還在unlisted列表中
:ba[ll]                     把全部的緩衝區在當前頁中打開,每一個緩衝區佔一個窗口

分屏編輯

vim -o file1 file2      水平分割窗口,同時打開file1和file2
vim -O file1 file2      垂直分割窗口,同時打開file1和file2

水平分割

:split(:sp)         把當前窗水平分割成兩個窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意若是在終端下,CTRL-S可能會凍結終端,請按CTRL-Q繼續
:split filename     水平分割窗口,並在新窗口中顯示另外一個文件
:nsplit(:nsp)       水平分割出一個n行高的窗口
:[N]new             水平分割出一個N行高的窗口,並編輯一個新文件。 (CTRL-W n或 CTRL-W CTRL-N)
ctrl+w f            水平分割出一個窗口,並在新窗口打開名稱爲光標所在詞的文件 
C-w C-^                 水平分割一個窗口,打開剛纔編輯的文件

垂直分割

:vsplit(:vsp)       把當前窗口分割成水平分佈的兩個窗口 (CTRL-W v或CTRL CTRL-V)
:[N]vne[w]          垂直分割出一個新窗口
:vertical           水平分割的命令: 相應的垂直分割

關閉子窗口

:qall       關閉全部窗口,退出vim
:wall       保存全部修改過的窗口
:only       只保留當前窗口,關閉其它窗口(CTRL-W o)
:close      關閉當前窗口,CTRL-W c能實現一樣的功能 (象 :q :x一樣工做 )

調整窗口大小

ctrl+w +        當前窗口增高一行。也能夠用n增高n行
ctrl+w -        當前窗口減少一行。也能夠用n減少n行
ctrl+w _        當前窗口擴展到儘量的大。也能夠用n設定行數
:resize n       當前窗口n行高
ctrl+w =        全部窗口一樣高度
n ctrl+w _      當前窗口的高度設定爲n行
ctrl+w <        當前窗口減小一列。也能夠用n減小n列
ctrl+w >        當前窗口增寬一列。也能夠用n增寬n列
ctrl+w |        當前窗口儘量的寬。也能夠用n設定列數

切換和移動窗口

ctrl+w ctrl+w       切換到下一個窗口或者是ctrl+w w
ctrl+w p            切換到前一個窗口
ctrl+w h(l,j,k)     切換到左(右,下,上)的窗口
ctrl+w t(b)         切換到最上(下)面的窗口<BR>
ctrl+w H(L,K,J)     將當前窗口移動到最左(右、上、下)面
ctrl+w r            旋轉窗口的位置
ctrl+w T            將當前的窗口移動到新的標籤頁上

快速編輯

改變大小寫

~                   反轉光標所在字符的大小寫
可視模式下的U或u       把選中的文本變爲大寫或小寫
gu(U)接範圍(如$,或G),能夠把從光標當前位置到指定位置之間字母所有 轉換成小寫或大寫。如ggguG,就是把開頭到最後一行之間的字母所有變爲小 寫。再如gu5j,把當前行和下面四行所有變成小寫

替換 (normal模式)

r       替換光標處的字符,一樣支持漢字
R       進入替換模式,按esc回到正常模式

撤銷與重作(normal模式)

[n] u           取消一(n)個改動。
:undo 5         撤銷5個改變。
:undolist       你的撤銷歷史。
ctrl + r        重作最後的改動。
U               取消當前行中全部的改動。
:earlier 4m     回到4分鐘前
:later 55s      前進55秒

.       重複上一個編輯動做
qa      開始錄製宏a(鍵盤操做記錄)
q       中止錄製
@a      播放宏a

編輯特殊文件

文件加密

vim -x file     開始編輯一個加密的文件
:X              爲當前文件設置密碼
:set key=       去除文件的密碼

文件的編碼

:e ++enc=utf8 filename              讓vim用utf-8的編碼打開這個文件
:w ++enc=gbk                        無論當前文件什麼編碼,把它轉存成gbk編碼
:set fenc或:set fileencoding         查看當前文件的編碼
 fileencoding=ucs-bom,utf-8,cp936   vim會根據要打開的文件選擇合適的編碼。 注意:編碼之間不要留空格。 cp936對應於gbk編碼。 ucs-bom對應於windows下的文件格式

文件格式

大體有三種文件格式:unix, dos, mac. 三種格式的區別主要在於回車鍵的編碼:dos 下是回車加換行,unix 下只有 換行符,mac 下只有回車符。服務器

:e ++ff=dos filename        讓vim用dos格式打開這個文件
:w ++ff=mac filename        以mac格式存儲這個文件
:set ff                     顯示當前文件的格式
在vimrc中添加set fileformats=unix,dos,mac,讓vim自動識別文件格式

編輯輔助

按鍵

gd      跳轉到局部變量的定義處
gD      跳轉到全局變量的定義處,從當前文件開頭開始搜索
g;      上一個修改過的地方
g,      下一個修改過的地方
[[      跳轉到上一個函數塊開始,須要有單獨一行的{
]]      跳轉到下一個函數塊開始,須要有單獨一行的{
[]      跳轉到上一個函數塊結束,須要有單獨一行的}
][      跳轉到下一個函數塊結束,須要有單獨一行的}
[{      跳轉到當前塊開始處
]}      跳轉到當前塊結束處
[/      跳轉到當前註釋塊開始處
]/      跳轉到當前註釋塊結束處
%       不只能移動到匹配的(),{}或[]上,並且能在#if,#else, #endif之間跳躍
ci', di', yi'       修改、剪切或複製'之間的內容
ca', da', ya'       修改、剪切或複製'之間的內容,包含'
ci", di", yi"       修改、剪切或複製"之間的內容
ca", da", ya"       修改、剪切或複製"之間的內容,包含"
ci(, di(, yi(       修改、剪切或複製()之間的內容
ca(, da(, ya(       修改、剪切或複製()之間的內容,包含()
ci[, di[, yi[       修改、剪切或複製[]之間的內容
ca[, da[, ya[       修改、剪切或複製[]之間的內容,包含[]
ci{, di{, yi{       修改、剪切或複製{}之間的內容
ca{, da{, ya{       修改、剪切或複製{}之間的內容,包含{}
ci<, di<, yi<       修改、剪切或複製<>之間的內容
ca<, da<, ya<       修改、剪切或複製<>之間的內容,包含<>

ctags

ctags -R                    生成tag文件,-R表示也爲子目錄中的文件生成tags
:set tags=path/tags     告訴ctags使用哪一個tag文件
:tag xyz                跳到xyz的定義處,或者將光標放在xyz上按C-],返回用C-t
:stag xyz               用分割的窗口顯示xyz的定義,或者C-w ], 若是用C-w n ],就會打開一個n行高的窗口
:ptag xyz               在預覽窗口中打開xyz的定義,熱鍵是C-w }
:pclose                 關閉預覽窗口。熱鍵是C-w z
:pedit abc.h            在預覽窗口中編輯abc.h
:psearch abc            搜索當前文件和當前文件include的文件,顯示包含abc的行
:[n]tnext               下一[n]個匹配
:[n]tprev               上一[n]個匹配
:tfirst                 第一個匹配
:tlast                  最後一個匹配
:tselect tagname        打開選擇列表
:tag xyz<tab>           補齊以xyz開頭的tag名,繼續按tab鍵,會顯示其餘的
:tag /xyz<tab>          會用名字中含有xyz的tag名補全

cscope

cscope -Rbq             生成cscope.out文件
cs add /path/to/cscope.out /your/work/dir
:cs find c func         查找func在哪些地方被調用
:cw                     打開quickfix窗口查看結果

gtags

Gtags綜合了ctags和cscope的功能。 使用Gtags以前,你須要安裝GNU Gtags。 而後在工程目錄運行 gtags 。ide

:Gtags funcname         定位到 funcname 的定義處
:Gtags -r funcname      查詢 funcname被引用的地方
:Gtags -s symbol        定位 symbol 出現的地方
:Gtags -g string Goto   string 出現的地方。 :Gtags -gi string 忽略大小寫
:Gtags -f filename      顯示 filename 中的函數列表。 你能夠用 :Gtags -f % 顯示當前文件
:Gtags -P pattern       顯示路徑中包含特定模式的文件。 如 :Gtags -P .h$ 顯示全部頭文件, :Gtags -P /vm/ 顯示vm目錄下的文件

快速修改窗口

:copen      打開快速修改窗口
:cclose     關閉快速修改窗口

快速修改窗口在make程序時很是有用,當make以後:函數

:cl      在快速修改窗口中列出錯誤
:cn      定位到下一個錯誤
:cp      定位到上一個錯誤
:cr      定位到第一個錯誤

自動補全

C-x C-s                  拼寫建議
C-x C-v                  補全vim選項和命令
C-x C-l                  整行補全
C-x C-f                  自動補全文件路徑。彈出菜單後,按C-f循環選擇,固然也能夠按 C-n和C-p
C-x C-p 和C-x C-n     用文檔中出現過的單詞補全當前的詞。 直接按C-p和C-n也能夠
C-x C-o                  編程時能夠補全關鍵字和函數名啊
C-x C-i                  根據頭文件內關鍵字補全
C-x C-d                  補全宏定義
C-x C-n                  按緩衝區中出現過的關鍵字補全。 直接按C-n或C-p便可

當彈出補全菜單後:ui

C-p         向前切換成員
C-n         向後切換成員
C-e         退出下拉菜單,並退回到原來錄入的文字
C-y         退出下拉菜單,並接受當前選項

多行縮進縮出

正常模式下,按兩下>;光標所在行會縮進
若是先按了n,再按兩下>;,光標如下的n行會縮進
對應的,按兩下<;,光標所在行會縮出
若是在編輯代碼文件,能夠用=進行調整
在可視模式下,選擇要調整的代碼塊,按=,代碼會按書寫規則縮排好
或者n =,調整n行代碼的縮排

摺疊

zf          建立摺疊的命令,能夠在一個可視區域上使用該命令
zd          刪除當前行的摺疊
zD          刪除當前行的摺疊
zfap        摺疊光標所在的段
zo          打開摺疊的文本
zc          收起摺疊
za          打開/關閉當前摺疊
zr          打開嵌套的折行
zm          收起嵌套的折行
zR (zO)     打開全部折行
zM (zC)     收起全部折行
zj          跳到下一個摺疊處
zk          跳到上一個摺疊處
zi          enable/disable fold

命令行

命令行模式下快捷鍵

上下方向鍵       上一條或者下一條命令。若是已經輸入了部分命令,則找上一 條或者下一條匹配的命令
左右方向鍵       左/右移一個字符
C-w             向前刪除一個單詞
-h              向前刪除一個字符,等同於Backspace
C-u             從當前位置移動到命令行開頭
C-b             移動到命令行開頭
C-e             移動到命令行末尾
Shift-Left      左移一個單詞
Shift-Right     右移一個單詞
@               重複上一次的冒號命令
q               正常模式下,q而後按':',打開命令行歷史緩衝區, 能夠像編輯文件同樣編輯命令
q/和q?           能夠打開查找歷史記錄

執行外部命令

:!          cmd 執行外部命令
:!!         執行上一次的外部命令
:sh         調用shell,用exit返回vim
:r !cmd     將命令的返回結果插入文件當前位置
:m,nw !cmd  將文件的m行到n行之間的內容作爲命令輸入執行命令
相關文章
相關標籤/搜索