正常模式:可以使用快捷鍵命令,或按:輸入命令行。
插入模式:可以輸入文本,在正常模式下,按i、a、o等都可以進(jìn)入插入模式。
可視模式:正常模式下按v可以進(jìn)入可視模式, 在可視模式下,移動(dòng)光標(biāo)可以選擇文本。按V進(jìn)入可視行模式, 總是整行整行的選中。ctrl+v進(jìn)入可視塊模式。
替換模式:正常模式下,按R進(jìn)入。
vim -c cmd file: 在打開文件前,先執(zhí)行指定的命令;
vim -r file: 恢復(fù)上次異常退出的文件;
vim -R file: 以只讀的方式打開文件,但可以強(qiáng)制保存;
vim -M file: 以只讀的方式打開文件,不可以強(qiáng)制保存;
vim -y num file: 將編輯窗口的大小設(shè)為num行;
vim + file: 從文件的末尾開始;
vim +num file: 從第num行開始;
vim +/string file: 打開file,并將光標(biāo)停留在第一個(gè)找到的string上。
vim –remote file: 用已有的vim進(jìn)程打開指定的文件。 如果你不想啟用多個(gè)vim會(huì)話,這個(gè)很有用。但要注意, 如果你用vim,會(huì)尋找名叫VIM的服務(wù)器;如果你已經(jīng)有一個(gè)gvim在運(yùn)行了, 你可以用gvim –remote file在已有的gvim中打開文件。
:e file –關(guān)閉當(dāng)前編輯的文件,并開啟新的文件。 如果對(duì)當(dāng)前文件的修改未保存,vi會(huì)警告。
:e! file –放棄對(duì)當(dāng)前文件的修改,編輯新的文件。
:e+file – 開始新的文件,并從文件尾開始編輯。
:e+n file – 開始新的文件,并從第n行開始編輯。
:enew –編譯一個(gè)未命名的新文檔。(CTRL-W n)
:e – 重新加載當(dāng)前文檔。
:e! – 重新加載當(dāng)前文檔,并丟棄已做的改動(dòng)。
:e#或ctrl+^ – 回到剛才編輯的文件,很實(shí)用。
:f或ctrl+g – 顯示文檔名,是否修改,和光標(biāo)位置。
:f filename – 改變編輯的文件名,這時(shí)再保存相當(dāng)于另存為。
gf – 打開以光標(biāo)所在字符串為文件名的文件。
:w – 保存修改。
:n1,n2w filename – 選擇性保存從某n1行到另n2行的內(nèi)容。
:wq – 保存并退出。
ZZ – 保存并退出。
:x – 保存并退出。
:q[uit] ——退出當(dāng)前窗口。(CTRL-W q或CTRL-W CTRL-Q)
:saveas newfilename – 另存為
:browse e – 會(huì)打開一個(gè)文件瀏覽器讓你選擇要編輯的文件。 如果是終端中,則會(huì)打開netrw的文件瀏覽窗口; 如果是gvim,則會(huì)打開一個(gè)圖形界面的瀏覽窗口。 實(shí)際上:browse后可以跟任何編輯文檔的命令,如sp等。 用browse打開的起始目錄可以由browsedir來設(shè)置:
:set browsedir=last – 用上次訪問過的目錄(默認(rèn));
:set browsedir=buffer – 用當(dāng)前文件所在目錄;
:set browsedir=current – 用當(dāng)前工作目錄;
:Sex – 水平分割一個(gè)窗口,瀏覽文件系統(tǒng);
:Vex – 垂直分割一個(gè)窗口,瀏覽文件系統(tǒng);
以下移動(dòng)都是在normal模式下。
h或退格: 左移一個(gè)字符;
l或空格: 右移一個(gè)字符;
j: 下移一行;
k: 上移一行;
gj: 移動(dòng)到一段內(nèi)的下一行;
gk: 移動(dòng)到一段內(nèi)的上一行;
+或Enter: 把光標(biāo)移至下一行第一個(gè)非空白字符。
-: 把光標(biāo)移至上一行第一個(gè)非空白字符。
w: 前移一個(gè)單詞,光標(biāo)停在下一個(gè)單詞開頭;
W: 移動(dòng)下一個(gè)單詞開頭,但忽略一些標(biāo)點(diǎn);
e: 前移一個(gè)單詞,光標(biāo)停在下一個(gè)單詞末尾;
E: 移動(dòng)到下一個(gè)單詞末尾,如果詞尾有標(biāo)點(diǎn),則移動(dòng)到標(biāo)點(diǎn);
b: 后移一個(gè)單詞,光標(biāo)停在上一個(gè)單詞開頭;
B: 移動(dòng)到上一個(gè)單詞開頭,忽略一些標(biāo)點(diǎn);
ge: 后移一個(gè)單詞,光標(biāo)停在上一個(gè)單詞末尾;
gE: 同ge,不過‘單詞’包含單詞相鄰的標(biāo)點(diǎn)。
(: 前移1句。
): 后移1句。
{: 前移1段。
}: 后移1段。
fc: 把光標(biāo)移到同一行的下一個(gè)c字符處
Fc: 把光標(biāo)移到同一行的上一個(gè)c字符處
tc: 把光標(biāo)移到同一行的下一個(gè)c字符前
Tc: 把光標(biāo)移到同一行的上一個(gè)c字符后
;: 配合f & t使用,重復(fù)一次
,: 配合f & t使用,反向重復(fù)一次
上面的操作都可以配合n使用,比如在正常模式(下面會(huì)講到)下輸入3h, 則光標(biāo)向左移動(dòng)3個(gè)字符。
0: 移動(dòng)到行首。
g0: 移到光標(biāo)所在屏幕行行首。
^: 移動(dòng)到本行第一個(gè)非空白字符。
g^: 同^,但是移動(dòng)到當(dāng)前屏幕行第一個(gè)非空字符處。
:移動(dòng)到行尾。</li><listyle="list?style:inherit!important">g:移動(dòng)到行尾。g: 移動(dòng)光標(biāo)所在屏幕行行尾。
n|: 把光標(biāo)移到遞n列上。
nG: 到文件第n行。
:n<cr> 移動(dòng)到第n行。
:$<cr> 移動(dòng)到最后一行。
H: 把光標(biāo)移到屏幕最頂端一行。
M: 把光標(biāo)移到屏幕中間一行。
L: 把光標(biāo)移到屏幕最底端一行。
gg: 到文件頭部。
G: 到文件尾部。
ctrl+f: 下翻一屏。
ctrl+b: 上翻一屏。
ctrl+d: 下翻半屏。
ctrl+u: 上翻半屏。
ctrl+e: 向下滾動(dòng)一行。
ctrl+y: 向上滾動(dòng)一行。
n%: 到文件n%的位置。
zz: 將當(dāng)前行移動(dòng)到屏幕中央。
zt: 將當(dāng)前行移動(dòng)到屏幕頂端。
zb: 將當(dāng)前行移動(dòng)到屏幕底端。
使用標(biāo)記可以快速移動(dòng)。到達(dá)標(biāo)記后,可以用Ctrl+o返回原來的位置。 Ctrl+o和Ctrl+i 很像瀏覽器上的后退和前進(jìn)。
m{a-z}: 標(biāo)記光標(biāo)所在位置,局部標(biāo)記,只用于當(dāng)前文件。
m{A-Z}: 標(biāo)記光標(biāo)所在位置,全局標(biāo)記。標(biāo)記之后,退出Vim, 重新啟動(dòng),標(biāo)記仍然有效。
`{a-z}: 移動(dòng)到標(biāo)記位置。
‘{a-z}: 移動(dòng)到標(biāo)記行的行首。
`{0-9}:回到上[2-10]次關(guān)閉vim時(shí)最后離開的位置。
“: 移動(dòng)到上次編輯的位置?!币部梢?,不過“精確到列,而”精確到行 。如果想跳轉(zhuǎn)到更老的位置,可以按C-o,跳轉(zhuǎn)到更新的位置用C-i。
`”: 移動(dòng)到上次離開的地方。
`.: 移動(dòng)到最后改動(dòng)的地方。
:marks 顯示所有標(biāo)記。
:delmarks a b – 刪除標(biāo)記a和b。
:delmarks a-c – 刪除標(biāo)記a、b和c。
:delmarks a c-f – 刪除標(biāo)記a、c、d、e、f。
:delmarks! – 刪除當(dāng)前緩沖區(qū)的所有標(biāo)記。
:help mark-motions 查看更多關(guān)于mark的知識(shí)。
i: 在光標(biāo)前插入;一個(gè)小技巧:按8,再按i,進(jìn)入插入模式,輸入=, 按esc進(jìn)入命令模式,就會(huì)出現(xiàn)8個(gè)=。 這在插入分割線時(shí)非常有用,如30i+<esc>就插入了36個(gè)+組成的分割線。
I: 在當(dāng)前行第一個(gè)非空字符前插入;
gI: 在當(dāng)前行第一列插入;
a: 在光標(biāo)后插入;
A: 在當(dāng)前行最后插入;
o: 在下面新建一行插入;
O: 在上面新建一行插入;
:r filename在當(dāng)前位置插入另一個(gè)文件的內(nèi)容。
:[n]r filename在第n行插入另一個(gè)文件的內(nèi)容。
:r !date 在光標(biāo)處插入當(dāng)前日期與時(shí)間。同理,:r !command可以將其它shell命令的輸出插入當(dāng)前文檔。
c[n]w: 改寫光標(biāo)后1(n)個(gè)詞。
c[n]l: 改寫光標(biāo)后n個(gè)字母。
c[n]h: 改寫光標(biāo)前n個(gè)字母。
[n]cc: 修改當(dāng)前[n]行。
[n]s: 以輸入的文本替代光標(biāo)之后1(n)個(gè)字符,相當(dāng)于c[n]l。
[n]S: 刪除指定數(shù)目的行,并以所輸入文本代替之。
注意,類似cnw,dnw,ynw的形式同樣可以寫為ncw,ndw,nyw。
[n]x: 剪切光標(biāo)右邊n個(gè)字符,相當(dāng)于d[n]l。
[n]X: 剪切光標(biāo)左邊n個(gè)字符,相當(dāng)于d[n]h。
y: 復(fù)制在可視模式下選中的文本。
yy or Y: 復(fù)制整行文本。
y[n]w: 復(fù)制一(n)個(gè)詞。
y[n]l: 復(fù)制光標(biāo)右邊1(n)個(gè)字符。
y[n]h: 復(fù)制光標(biāo)左邊1(n)個(gè)字符。
y:從光標(biāo)當(dāng)前位置復(fù)制到行尾。</li><listyle="list?style:inherit!important">y0:從光標(biāo)當(dāng)前位置復(fù)制到行首。</li><listyle="list?style:inherit!important">:m,ny<cr>復(fù)制m行到n行的內(nèi)容。</li><listyle="list?style:inherit!important">y1G或ygg:復(fù)制光標(biāo)以上的所有行。</li><listyle="list?style:inherit!important">yG:復(fù)制光標(biāo)以下的所有行。</li><listyle="list?style:inherit!important">yaw和yas:復(fù)制一個(gè)詞和復(fù)制一個(gè)句子,即使光標(biāo)不在詞首和句首也沒關(guān)系。</li><listyle="list?style:inherit!important">d:刪除(剪切)在可視模式下選中的文本。</li><listyle="list?style:inherit!important">d:從光標(biāo)當(dāng)前位置復(fù)制到行尾。y0:從光標(biāo)當(dāng)前位置復(fù)制到行首。:m,ny復(fù)制m行到n行的內(nèi)容。y1G或ygg:復(fù)制光標(biāo)以上的所有行。yG:復(fù)制光標(biāo)以下的所有行。yaw和yas:復(fù)制一個(gè)詞和復(fù)制一個(gè)句子,即使光標(biāo)不在詞首和句首也沒關(guān)系。d:刪除(剪切)在可視模式下選中的文本。d?or D: 刪除(剪切)當(dāng)前位置到行尾的內(nèi)容。
d[n]w: 刪除(剪切)1(n)個(gè)單詞
d[n]l: 刪除(剪切)光標(biāo)右邊1(n)個(gè)字符。
d[n]h: 刪除(剪切)光標(biāo)左邊1(n)個(gè)字符。
d0: 刪除(剪切)當(dāng)前位置到行首的內(nèi)容
[n] dd: 刪除(剪切)1(n)行。
:m,nd<cr> 剪切m行到n行的內(nèi)容。
d1G或dgg: 剪切光標(biāo)以上的所有行。
dG: 剪切光標(biāo)以下的所有行。
daw和das:剪切一個(gè)詞和剪切一個(gè)句子,即使光標(biāo)不在詞首和句首也沒關(guān)系。
d/f<cr>:這是一個(gè)比較高級(jí)的組合命令,它將刪除當(dāng)前位置 到下一個(gè)f之間的內(nèi)容。
p: 在光標(biāo)之后粘貼。
P: 在光標(biāo)之前粘貼。
aw:一個(gè)詞
as:一句。
ap:一段。
ab:一塊(包含在圓括號(hào)中的)。
y, d, c, v都可以跟文本對(duì)象。
a-z:都可以用作寄存器名?!盿yy把當(dāng)前行的內(nèi)容放入a寄存器。
A-Z:用大寫字母索引寄存器,可以在寄存器中追加內(nèi)容。 如”Ayy把當(dāng)前行的內(nèi)容追加到a寄存器中。
:reg 顯示所有寄存器的內(nèi)容。
“”:不加寄存器索引時(shí),默認(rèn)使用的寄存器。
“*:當(dāng)前選擇緩沖區(qū),”*yy把當(dāng)前行的內(nèi)容放入當(dāng)前選擇緩沖區(qū)。
“+:系統(tǒng)剪貼板?!?yy把當(dāng)前行的內(nèi)容放入系統(tǒng)剪貼板。
/something: 在后面的文本中查找something。
?something: 在前面的文本中查找something。
/pattern/+number: 將光標(biāo)停在包含pattern的行后面第number行上。
/pattern/-number: 將光標(biāo)停在包含pattern的行前面第number行上。
n: 向后查找下一個(gè)。
N: 向前查找下一個(gè)。
可以用grep或vimgrep查找一個(gè)模式都在哪些地方出現(xiàn)過,
其中:grep是調(diào)用外部的grep程序,而:vimgrep是vim自己的查找算法。
用法為: :vim[grep]/pattern/[g] [j] files
g的含義是如果一個(gè)模式在一行中多次出現(xiàn),則這一行也在結(jié)果中多次出現(xiàn)。
j的含義是grep結(jié)束后,結(jié)果停在第j項(xiàng),默認(rèn)是停在第一項(xiàng)。
vimgrep前面可以加數(shù)字限定搜索結(jié)果的上限,如
:1vim/pattern/ % 只查找那個(gè)模式在本文件中的第一個(gè)出現(xiàn)。
其實(shí)vimgrep在讀純文本電子書時(shí)特別有用,可以生成導(dǎo)航的目錄。
比如電子書中每一節(jié)的標(biāo)題形式為:n. xxxx。你就可以這樣:
:vim/^d{1,}./ %
然后用:cw或:copen查看結(jié)果,可以用C-w H把quickfix窗口移到左側(cè),
就更像個(gè)目錄了。
:s/old/new - 用new替換當(dāng)前行第一個(gè)old。
:s/old/new/g - 用new替換當(dāng)前行所有的old。
:n1,n2s/old/new/g - 用new替換文件n1行到n2行所有的old。
:%s/old/new/g - 用new替換文件中所有的old。
:%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
:%s//xxx/g?在每一行的行尾插入xxx,/xxx/g?在每一行的行尾插入xxx,表示行尾。
所有替換命令末尾加上c,每個(gè)替換都將需要用戶確認(rèn)。 如:%s/old/new/gc,加上i則忽略大小寫(ignore)。
還有一種比替換更靈活的方式,它是匹配到某個(gè)模式后執(zhí)行某種命令,
語法為 :[range]g/pattern/command
例如 :%g/^ xyz/normal dd。
表示對(duì)于以一個(gè)空格和xyz開頭的行執(zhí)行normal模式下的dd命令。
關(guān)于range的規(guī)定為:
如果不指定range,則表示當(dāng)前行。
m,n: 從m行到n行。
0: 最開始一行(可能是這樣)。
$: 最后一行
.: 當(dāng)前行
%: 所有行
高級(jí)的查找替換就要用到正則表達(dá)式。
\d: 表示十進(jìn)制數(shù)(我猜的)
\s: 表示空格
\S: 非空字符
\a: 英文字母
\|: 表示 或
\.: 表示.
{m,n}: 表示m到n個(gè)字符。這要和 \s與\a等連用,如 \a\{m,n} 表示m 到n個(gè)英文字母。
{m,}: 表示m到無限多個(gè)字符。
**: 當(dāng)前目錄下的所有子目錄。
:help pattern得到更多幫助。
轉(zhuǎn)自: