1. Vim的幾種模式
- 正常模式:可以使用快捷鍵命令,或按:輸入命令行次屠。
- 插入模式:可以輸入文本,在正常模式下雳刺,按i劫灶、a、o等都可以進(jìn)入插入模式掖桦。
- 可視模式:正常模式下按v可以進(jìn)入可視模式本昏, 在可視模式下,移動(dòng)光標(biāo)可以選擇文本枪汪。按V進(jìn)入可視行模式涌穆, 總是整行整行的選中。ctrl+v進(jìn)入可視塊模式雀久。
- 替換模式:正常模式下宿稀,按R進(jìn)入。
2. 啟動(dòng)Vim
-
vim -c cmd file
: 在打開(kāi)文件前赖捌,先執(zhí)行指定的命令祝沸; -
vim -r file
:恢復(fù)上次異常退出的文件; -
vim -R file:
:以只讀的方式打開(kāi)文件越庇,但可以強(qiáng)制保存罩锐; -
vim -M file
:以只讀的方式打開(kāi)文件,不可以強(qiáng)制保存卤唉; -
vim -y num file
:將編輯窗口的大小設(shè)為num行涩惑; -
vim + file:
:從文件的末尾開(kāi)始; -
vim +num file:
:從第num行開(kāi)始桑驱; -
vim +/string file
:打開(kāi)file境氢,并將光標(biāo)停留在第一個(gè)找到的string上蟀拷。
*vim --remote file
: 用已有的vim進(jìn)程打開(kāi)指定的文件。 如果你不想啟用多個(gè)vim會(huì)話萍聊,這個(gè)很有用问芬。但要注意, 如果你用vim寿桨,會(huì)尋找名叫VIM的服務(wù)器此衅;如果你已經(jīng)有一個(gè)gvim在運(yùn)行了, 你可以用gvim --remote file
在已有的gvim中打開(kāi)文件亭螟。
3. 文檔操作
-
:e file
:關(guān)閉當(dāng)前編輯的文件挡鞍,并開(kāi)啟新的文件。 如果對(duì)當(dāng)前文件的修改未保存预烙,vi會(huì)警告墨微。 -
:e! file
:放棄對(duì)當(dāng)前文件的修改,編輯新的文件扁掸。 -
:e+file
:開(kāi)始新的文件翘县,并從文件尾開(kāi)始編輯。 -
:e+n file
:開(kāi)始新的文件谴分,并從第n行開(kāi)始編輯锈麸。 -
: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
: 打開(kāi)以光標(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ì)打開(kāi)一個(gè)文件瀏覽器讓你選擇要編輯的文件潜慎。 如果是終端中捡多,則會(huì)打開(kāi)netrw的文件瀏覽窗口蓖康; 如果是gvim,則會(huì)打開(kāi)一個(gè)圖形界面的瀏覽窗口垒手。 實(shí)際上:browse后可以跟任何編輯文檔的命令蒜焊,如sp等。 用browse打開(kāi)的起始目錄可以由browsedir來(lái)設(shè)置: -
:set browsedir=last
:用上次訪問(wèn)過(guò)的目錄(默認(rèn))科贬; -
:set browsedir=buffer
:用當(dāng)前文件所在目錄泳梆; -
:set browsedir=current
:用當(dāng)前工作目錄; -
:Sex
:水平分割一個(gè)窗口榜掌,瀏覽文件系統(tǒng)优妙; -
:Vex
:垂直分割一個(gè)窗口,瀏覽文件系統(tǒng)憎账;
4. 光標(biāo)的移動(dòng)
4.1 基本移動(dò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è)單詞開(kāi)頭;W
: 移動(dòng)下一個(gè)單詞開(kāi)頭森渐,但忽略一些標(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è)單詞開(kāi)頭;B
: 移動(dòng)到上一個(gè)單詞開(kāi)頭埠况,忽略一些標(biāo)點(diǎn)耸携;
*ge
: 后移一個(gè)單詞,光標(biāo)停在上一個(gè)單詞末尾辕翰;gE
: 同 ge 夺衍,不過(guò)‘單詞’包含單詞相鄰的標(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)到行尾哟绊。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
: 到文件尾部。
4.2 翻屏
-
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)到屏幕底端鸭巴。
4.3 標(biāo)記
使用標(biāo)記可以快速移動(dòng)眷细。到達(dá)標(biāo)記后,可以用Ctrl+o返回原來(lái)的位置奕扣。 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í)最后離開(kāi)的位置却特。 -
: 移動(dòng)到上次編輯的位置。''也可以筛圆,不過(guò)\
精確到列裂明,而''精確到行 。如果想跳轉(zhuǎn)到更老的位置太援,可以按C-o闽晦,跳轉(zhuǎn)到更新的位置用C-i。 - ``"` :移動(dòng)到上次離開(kāi)的地方提岔。
- ``.` :移動(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í)褒搔。
5. 插入文本
5.1 基本插入
-
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)前文檔焰坪。
5.2 改寫插入
-
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。
6. 剪切復(fù)制和寄存器
6.1 剪切和復(fù)制比勉、粘貼
-
[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ù)制到行尾砖第。 -
y0
: 從光標(biāo)當(dāng)前位置復(fù)制到行首。 -
:m,ny<cr>
:復(fù)制m行到n行的內(nèi)容环凿。 -
y1G或ygg
: 復(fù)制光標(biāo)以上的所有行梧兼。 -
yG
: 復(fù)制光標(biāo)以下的所有行。 -
yaw
和yas
:復(fù)制一個(gè)詞和復(fù)制一個(gè)句子智听,即使光標(biāo)不在詞首和句首也沒(méi)關(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)不在詞首和句首也沒(méi)關(guān)系。 -
d/f<cr>
:這是一個(gè)比較高級(jí)的組合命令腌零,它將刪除當(dāng)前位置 到下一個(gè)f之間的內(nèi)容梯找。 -
p
: 在光標(biāo)之后粘貼。 -
P
: 在光標(biāo)之前粘貼益涧。
6.2 文本對(duì)象
-
aw
:一個(gè)詞 -
as
:一句锈锤。 -
ap
:一段。 -
ab
:一塊(包含在圓括號(hào)中的)闲询。 -
y, d, c, v
:都可以跟文本對(duì)象久免。
6.3 寄存器
-
a-z
:都可以用作寄存器名。"ayy把當(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)剪貼板府瞄。
7. 查找與替換
7.1 查找
-
/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)過(guò),
其中: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è)目錄了黎侈。
7.2 替換
: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,$表示行尾业簿。
所有替換命令末尾加上c蛛碌,每個(gè)替換都將需要用戶確認(rèn)。 如:%s/old/new/gc辖源,加上i則忽略大小寫(ignore)蔚携。
還有一種比替換更靈活的方式,它是匹配到某個(gè)模式后執(zhí)行某種命令克饶,
語(yǔ)法為 :[range]g/pattern/command
例如 :%g/^ xyz/normal dd酝蜒。
表示對(duì)于以一個(gè)空格和xyz開(kāi)頭的行執(zhí)行normal模式下的dd命令。
關(guān)于range的規(guī)定為:
如果不指定range矾湃,則表示當(dāng)前行亡脑。
m,n
: 從m行到n行。
0
: 最開(kāi)始一行(可能是這樣)邀跃。
$
: 最后一行
.
: 當(dāng)前行
%
: 所有行
7.3 正則表達(dá)式
高級(jí)的查找替換就要用到正則表達(dá)式霉咨。
\d
: 表示十進(jìn)制數(shù)(我猜的)
\s
: 表示空格
\S
: 非空字符
\a
: 英文字母
\|
: 表示 或
\.
: 表示.
{m,n}
: 表示m到n個(gè)字符。這要和 \s與\a等連用拍屑,如 \a{m,n} 表示m 到n個(gè)英文字母途戒。
{m,}
: 表示m到無(wú)限多個(gè)字符。
**
: 當(dāng)前目錄下的所有子目錄僵驰。
:help pattern
得到更多幫助喷斋。
8. 排版
8.1 基本排版
-
<<
向左縮進(jìn)一個(gè)shiftwidth -
>>
向右縮進(jìn)一個(gè)shiftwidth -
:ce(nter)
本行文字居中 -
:le(ft)
本行文字靠左 -
:ri(ght)
本行文字靠右 -
gq
對(duì)選中的文字重排唁毒,即對(duì)過(guò)長(zhǎng)的文字進(jìn)行斷行 -
gqq
重排當(dāng)前行 -
gqnq
重排n行 -
gqap
重排當(dāng)前段 -
gqnap
重排n段 -
gqnj
重排當(dāng)前行和下面n行 -
gqQ
重排當(dāng)前段對(duì)文章末尾 -
J
拼接當(dāng)前行和下一行 -
gJ
同J
,不過(guò)合并后不留空格星爪。
8.2 拼寫檢查
-
:set spell
-開(kāi)啟拼寫檢查功能 -
:set nospell
-關(guān)閉拼寫檢查功能 -
]s
-移到下一個(gè)拼寫錯(cuò)誤的單詞 -
[s
-作用與上一命令類似浆西,但它是從相反方向進(jìn)行搜索 -
z=
-顯示一個(gè)有關(guān)拼寫錯(cuò)誤單詞的列表,可從中選擇 -
zg
-告訴拼寫檢查器該單詞是拼寫正確的 -
zw
-與上一命令相反顽腾,告訴拼寫檢查器該單詞是拼寫錯(cuò)誤的
8.3 統(tǒng)計(jì)字?jǐn)?shù)
-
g ^g
可以統(tǒng)計(jì)文檔字符數(shù)近零,行數(shù)。 將光標(biāo)放在最后一個(gè)字符上抄肖,用字符數(shù)減去行數(shù)可以粗略統(tǒng)計(jì)中文文檔的字?jǐn)?shù)秒赤。 以上對(duì) Mac 或 Unix 的文件格式適用。 如果是 Windows 文件格式(即換行符有兩個(gè)字節(jié))憎瘸,字?jǐn)?shù)的統(tǒng)計(jì)方法為: 字符數(shù) - 行數(shù) * 2。
9. 編輯多個(gè)文件
9.1 一次編輯多個(gè)文件
我們可以一次打開(kāi)多個(gè)文件陈瘦,如
-
vi a.txt b.txt c.txt
使用:next(:n)編輯下一個(gè)文件幌甘。 -
:2n
編輯下2個(gè)文件。
使用:previous
或:N
編輯上一個(gè)文件痊项。
使用:wnext
锅风,保存當(dāng)前文件,并編輯下一個(gè)文件鞍泉。
使用:wprevious
皱埠,保存當(dāng)前文件,并編輯上一個(gè)文件咖驮。
使用:args
顯示文件列表边器。
:n filenames
或:args filenames
指定新的文件列表。
vi -o filenames
在水平分割的多個(gè)窗口中編輯多個(gè)文件托修。
vi -O filenames
在垂直分割的多個(gè)窗口中編輯多個(gè)文件忘巧。
9.2 多標(biāo)簽編輯
-
vim -p files:
打開(kāi)多個(gè)文件,每個(gè)文件占用一個(gè)標(biāo)簽頁(yè)睦刃。 -
:tabe, tabnew
-- 如果加文件名砚嘴,就在新的標(biāo)簽中打開(kāi)這個(gè)文件, 否則打開(kāi)一個(gè)空緩沖區(qū)涩拙。 -
^w gf
-- 在新的標(biāo)簽頁(yè)里打開(kāi)光標(biāo)下路徑指定的文件际长。 -
:tabn
-- 切換到下一個(gè)標(biāo)簽。Control + PageDown兴泥,也可以工育。 -
:tabp
-- 切換到上一個(gè)標(biāo)簽。Control + PageUp搓彻,也可以翅娶。 -
[n] gt
-- 切換到下一個(gè)標(biāo)簽文留。如果前面加了 n , 就切換到第n個(gè)標(biāo)簽竭沫。第一個(gè)標(biāo)簽的序號(hào)就是1燥翅。 -
:tab split
-- 將當(dāng)前緩沖區(qū)的內(nèi)容在新頁(yè)簽中打開(kāi)。 -
:tabc[lose]
-- 關(guān)閉當(dāng)前的標(biāo)簽頁(yè)蜕提。 -
:tabo[nly]
-- 關(guān)閉其它的標(biāo)簽頁(yè)森书。 -
:tabs
-- 列出所有的標(biāo)簽頁(yè)和它們包含的窗口。 -
:tabm[ove] [N]
-- 移動(dòng)標(biāo)簽頁(yè)谎势,移動(dòng)到第N個(gè)標(biāo)簽頁(yè)之后凛膏。 如 tabm 0 當(dāng)前標(biāo)簽頁(yè),就會(huì)變成第一個(gè)標(biāo)簽頁(yè)脏榆。
9.3 緩沖區(qū)
-
:buffers
或*:ls
或*:files
顯示緩沖區(qū)列表猖毫。 -
ctrl+^
:在最近兩個(gè)緩沖區(qū)間切換。 -
:bn
-- 下一個(gè)緩沖區(qū)须喂。 -
:bp
-- 上一個(gè)緩沖區(qū)吁断。 -
:bl
-- 最后一個(gè)緩沖區(qū)。 -
:b[n]
或*:[n]b
-- 切換到第n個(gè)緩沖區(qū)坞生。 -
:nbw(ipeout)
-- 徹底刪除第n個(gè)緩沖區(qū)仔役。 -
:nbd(elete)
-- 刪除第n個(gè)緩沖區(qū),并未真正刪除是己,還在unlisted列表中又兵。 -
:ba[ll]
-- 把所有的緩沖區(qū)在當(dāng)前頁(yè)中打開(kāi),每個(gè)緩沖區(qū)占一個(gè)窗口卒废。
10. 分屏編輯
-
vim -o file1 file2
:水平分割窗口沛厨,同時(shí)打開(kāi)file1和file2 -
vim -O file1 file2
:垂直分割窗口,同時(shí)打開(kāi)file1和file2
10.1 水平分割
-
:split(:sp)
-- 把當(dāng)前窗水平分割成兩個(gè)窗口摔认。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在終端下俄烁,CTRL-S可能會(huì)凍結(jié)終端,請(qǐng)按CTRL-Q繼續(xù)级野。 -
:split filename
-- 水平分割窗口页屠,并在新窗口中顯示另一個(gè)文件。 -
:nsplit(:nsp)
-- 水平分割出一個(gè)n行高的窗口蓖柔。 -
:[N]new
-- 水平分割出一個(gè)N行高的窗口辰企,并編輯一個(gè)新文件。 (CTRL-W n或 CTRL-W CTRL-N) -
ctrl+w f
--水平分割出一個(gè)窗口况鸣,并在新窗口打開(kāi)名稱為光標(biāo)所在詞的文件 牢贸。 -
C-w C-^
-- 水平分割一個(gè)窗口,打開(kāi)剛才編輯的文件镐捧。
10.2 垂直分割
-
:vsplit(:vsp)
-- 把當(dāng)前窗口分割成水平分布的兩個(gè)窗口潜索。 (CTRL-W v或CTRL CTRL-V) -
:[N]vne[w]
-- 垂直分割出一個(gè)新窗口臭增。 -
:vertical
水平分割的命令: 相應(yīng)的垂直分割。
10.3 關(guān)閉子窗口
-
:qall
-- 關(guān)閉所有窗口竹习,退出vim誊抛。 -
:wall
-- 保存所有修改過(guò)的窗口。 -
:only
-- 只保留當(dāng)前窗口整陌,關(guān)閉其它窗口拗窃。(CTRL-W o) -
:close
-- 關(guān)閉當(dāng)前窗口,CTRL-W c能實(shí)現(xiàn)同樣的功能泌辫。 (象 :q :x同樣工作 )
10.4 調(diào)整窗口大小
-
ctrl+w +
--當(dāng)前窗口增高一行随夸。也可以用n增高n行。 -
ctrl+w -
--當(dāng)前窗口減小一行震放。也可以用n減小n行宾毒。 -
ctrl+w _
--當(dāng)前窗口擴(kuò)展到盡可能的大。也可以用n設(shè)定行數(shù)殿遂。 -
:resize n
-- 當(dāng)前窗口n行高诈铛。 -
ctrl+w =
-- 所有窗口同樣高度。 -
n ctrl+w _
-- 當(dāng)前窗口的高度設(shè)定為n行勉躺。 -
ctrl+w <
--當(dāng)前窗口減少一列。也可以用n減少n列觅丰。 -
ctrl+w >
--當(dāng)前窗口增寬一列饵溅。也可以用n增寬n列。 -
ctrl+w |
--當(dāng)前窗口盡可能的寬妇萄。也可以用n設(shè)定列數(shù)蜕企。
10.5 切換和移動(dòng)窗口
如果支持鼠標(biāo),切換和調(diào)整子窗口的大小就簡(jiǎn)單了冠句。
-
ctrl+w ctrl+w
: 切換到下一個(gè)窗口轻掩。或者是ctrl+w w懦底。 -
ctrl+w p
: 切換到前一個(gè)窗口唇牧。 -
ctrl+w h(l,j,k)
:切換到左(右,下聚唐,上)的窗口丐重。 -
ctrl+w t(b)
:切換到最上(下)面的窗口。<BR> -
ctrl+w H(L,K,J)
: 將當(dāng)前窗口移動(dòng)到最左(右杆查、上扮惦、下)面。 -
ctrl+w r
:旋轉(zhuǎn)窗口的位置亲桦。 -
ctrl+w T
: 將當(dāng)前的窗口移動(dòng)到新的標(biāo)簽頁(yè)上崖蜜。
11. 快速編輯
11.1 改變大小寫
-
~
: 反轉(zhuǎn)光標(biāo)所在字符的大小寫浊仆。
可視模式下的U或u:把選中的文本變?yōu)榇髮懟蛐憽?br> gu(U)接范圍(如$,或G)豫领,可以把從光標(biāo)當(dāng)前位置到指定位置之間字母全部 轉(zhuǎn)換成小寫或大寫抡柿。如ggguG,就是把開(kāi)頭到最后一行之間的字母全部變?yōu)樾?寫氏堤。再如gu5j沙绝,把當(dāng)前行和下面四行全部變成小寫。
11.2 替換(normal模式)
-
r
: 替換光標(biāo)處的字符鼠锈,同樣支持漢字闪檬。 -
R
: 進(jìn)入替換模式,按esc回到正常模式购笆。
11.3 撤消與重做(normal模式)
-
[n] u
: 取消一(n)個(gè)改動(dòng)粗悯。 -
:undo 5
-- 撤銷5個(gè)改變。 -
:undolist
-- 你的撤銷歷史同欠。 -
ctrl + r
:重做最后的改動(dòng)样傍。 -
U
: 取消當(dāng)前行中所有的改動(dòng)。 -
:earlier 4m
-- 回到4分鐘前 -
:later 55s
-- 前進(jìn)55秒
11.4 宏
-
.
--重復(fù)上一個(gè)編輯動(dòng)作 -
qa
:開(kāi)始錄制宏a(鍵盤操作記錄) -
q
:停止錄制 -
@a
:播放宏a
12. 編輯特殊文件
12.1 文件加解密
-
vim -x file
: 開(kāi)始編輯一個(gè)加密的文件铺遂。 -
:X
-- 為當(dāng)前文件設(shè)置密碼衫哥。 -
:set key=
-- 去除文件的密碼。
這里是 滇狐總結(jié)的比較高級(jí)的vi技巧襟锐。
12.2 文件的編碼
-
:e ++enc=utf8 filename
, 讓vim用utf-8的編碼打開(kāi)這個(gè)文件撤逢。 -
:w ++enc=gbk
,不管當(dāng)前文件什么編碼粮坞,把它轉(zhuǎn)存成gbk編碼蚊荣。 -
:set fenc
或:set fileencoding
,查看當(dāng)前文件的編碼莫杈。
在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936互例,vim會(huì)根據(jù)要打開(kāi)的文件選擇合適的編碼。 注意:編碼之間不要留空格筝闹。 cp936對(duì)應(yīng)于gbk編碼媳叨。 ucs-bom對(duì)應(yīng)于windows下的文件格式。
讓vim 正確處理文件格式和文件編碼关顷,有賴于 ~/.vimrc的正確配置
12.3 文件格式
大致有三種文件格式:unix, dos, mac. 三種格式的區(qū)別主要在于回車鍵的編碼:dos 下是回車加換行肩杈,unix 下只有 換行符,mac 下只有回車符解寝。
-
:e ++ff=dos filename
, 讓vim用dos格式打開(kāi)這個(gè)文件扩然。 -
:w ++ff=mac filename
, 以mac格式存儲(chǔ)這個(gè)文件。 -
:set ff
聋伦,顯示當(dāng)前文件的格式夫偶。
在vimrc中添加set fileformats=unix,dos,mac界睁,讓vim自動(dòng)識(shí)別文件格式。
13. 編程輔助
13.1 一些按鍵
gd
: 跳轉(zhuǎn)到局部變量的定義處兵拢;gD
: 跳轉(zhuǎn)到全局變量的定義處翻斟,從當(dāng)前文件開(kāi)頭開(kāi)始搜索;g;
: 上一個(gè)修改過(guò)的地方说铃;g,
: 下一個(gè)修改過(guò)的地方访惜;[[
: 跳轉(zhuǎn)到上一個(gè)函數(shù)塊開(kāi)始,需要有單獨(dú)一行的{腻扇。]]
: 跳轉(zhuǎn)到下一個(gè)函數(shù)塊開(kāi)始债热,需要有單獨(dú)一行的{。[]
: 跳轉(zhuǎn)到上一個(gè)函數(shù)塊結(jié)束幼苛,需要有單獨(dú)一行的}窒篱。][
: 跳轉(zhuǎn)到下一個(gè)函數(shù)塊結(jié)束,需要有單獨(dú)一行的}舶沿。[{
: 跳轉(zhuǎn)到當(dāng)前塊開(kāi)始處墙杯;]}
: 跳轉(zhuǎn)到當(dāng)前塊結(jié)束處;[/
: 跳轉(zhuǎn)到當(dāng)前注釋塊開(kāi)始處括荡;]/
: 跳轉(zhuǎn)到當(dāng)前注釋塊結(jié)束處高镐;%
: 不僅能移動(dòng)到匹配的(),{}或[]上,而且能在#if畸冲,#else嫉髓, #endif之間跳躍。
下面的括號(hào)匹配對(duì)編程很實(shí)用的召夹。ci', di', yi'
:修改岩喷、剪切或復(fù)制'之間的內(nèi)容恕沫。ca', da', ya'
:修改监憎、剪切或復(fù)制'之間的內(nèi)容,包含'婶溯。ci", di", yi"
:修改鲸阔、剪切或復(fù)制"之間的內(nèi)容。ca", da", ya"
:修改迄委、剪切或復(fù)制"之間的內(nèi)容褐筛,包含"。ci(, di(, yi(
:修改叙身、剪切或復(fù)制()之間的內(nèi)容渔扎。ca(, da(, ya(
:修改、剪切或復(fù)制()之間的內(nèi)容信轿,包含()晃痴。ci[, di[, yi[
:修改残吩、剪切或復(fù)制[]之間的內(nèi)容。ca[, da[, ya[
:修改倘核、剪切或復(fù)制[]之間的內(nèi)容泣侮,包含[]。ci{, di{, yi{
:修改紧唱、剪切或復(fù)制{}之間的內(nèi)容活尊。ca{, da{, ya{
:修改、剪切或復(fù)制{}之間的內(nèi)容漏益,包含{}蛹锰。ci<, di<, yi<
:修改、剪切或復(fù)制<>之間的內(nèi)容遭庶。ca<, da<, ya<
:修改宁仔、剪切或復(fù)制<>之間的內(nèi)容,包含<>峦睡。
13.2 ctags
ctags -R
: 生成tag文件翎苫,-R表示也為子目錄中的文件生成tags:set tags=path/tags
-- 告訴ctags使用哪個(gè)tag文件:tag xyz
-- 跳到xyz的定義處,或者將光標(biāo)放在xyz上按C-]榨了,返回用C-t:stag xyz
-- 用分割的窗口顯示xyz的定義煎谍,或者C-w ], 如果用C-w n ]龙屉,就會(huì)打開(kāi)一個(gè)n行高的窗口:ptag xyz
-- 在預(yù)覽窗口中打開(kāi)xyz的定義呐粘,熱鍵是C-w }。:pclose
-- 關(guān)閉預(yù)覽窗口转捕。熱鍵是C-w z作岖。:pedit abc.h
-- 在預(yù)覽窗口中編輯abc.h:psearch abc
-- 搜索當(dāng)前文件和當(dāng)前文件include的文件,顯示包含abc的行五芝。
有時(shí)一個(gè)tag可能有多個(gè)匹配痘儡,如函數(shù)重載,一個(gè)函數(shù)名就會(huì)有多個(gè)匹配枢步。 這種情況會(huì)先跳轉(zhuǎn)到第一個(gè)匹配處沉删。:[n]tnext
-- 下一[n]個(gè)匹配。:[n]tprev
-- 上一[n]個(gè)匹配醉途。:tfirst
-- 第一個(gè)匹配:tlast
-- 最后一個(gè)匹配:tselect tagname
-- 打開(kāi)選擇列表
tab鍵補(bǔ)齊:tag xyz<tab>
-- 補(bǔ)齊以xyz開(kāi)頭的tag名矾瑰,繼續(xù)按tab鍵,會(huì)顯示其他的隘擎。:tag /xyz<tab>
-- 會(huì)用名字中含有xyz的tag名補(bǔ)全殴穴。
13.3 cscope
cscope -Rbq: 生成cscope.out文件
:cs add /path/to/cscope.out /your/work/dir
-
:cs find c func
-- 查找func在哪些地方被調(diào)用 -
:cw
-- 打開(kāi)quickfix窗口查看結(jié)果
13.4 gtags
Gtags綜合了ctags和cscope的功能。 使用Gtags之前,你需要安裝GNU Gtags采幌。 然后在工程目錄運(yùn)行 gtags 恍涂。
-
:Gtags funcname
定位到 funcname 的定義處。 -
:Gtags -r funcname
查詢 funcname被引用的地方植榕。 -
:Gtags -s symbol
定位 symbol 出現(xiàn)的地方再沧。 -
:Gtags -g string Goto string
出現(xiàn)的地方。 :Gtags -gi string 忽略大小寫尊残。 -
:Gtags -f filename
顯示 filename 中的函數(shù)列表炒瘸。 你可以用 :Gtags -f % 顯示當(dāng)前文件。 -
:Gtags -P pattern
顯示路徑中包含特定模式的文件寝衫。 如 :Gtags -P .h$ 顯示所有頭文件顷扩, :Gtags -P /vm/ 顯示vm目錄下的文件。
13.5 編譯
vim提供了:make來(lái)編譯程序慰毅,默認(rèn)調(diào)用的是make隘截, 如果你當(dāng)前目錄下有makefile,簡(jiǎn)單地:make即可汹胃。
如果你沒(méi)有make程序婶芭,你可以通過(guò)配置makeprg選項(xiàng)來(lái)更改make調(diào)用的程序。 如果你只有一個(gè)abc.java文件着饥,你可以這樣設(shè)置:
set makeprg=javac\ abc.java
然后:make即可犀农。如果程序有錯(cuò),可以通過(guò)quickfix窗口查看錯(cuò)誤宰掉。 不過(guò)如果要正確定位錯(cuò)誤呵哨,需要設(shè)置好errorformat,讓vim識(shí)別錯(cuò)誤信息轨奄。 如::setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
%f表示文件名孟害,%l表示行號(hào), %m表示錯(cuò)誤信息挪拟,其它的還不能理解挨务。 請(qǐng)參考 :help errorformat。
13.6 快速修改窗口
其實(shí)是quickfix插件提供的功能舞丛, 對(duì)編譯調(diào)試程序非常有用 :)
:copen
-- 打開(kāi)快速修改窗口耘子。:cclose
-- 關(guān)閉快速修改窗口果漾。
快速修改窗口在make程序時(shí)非常有用球切,當(dāng)make之后::cl
-- 在快速修改窗口中列出錯(cuò)誤。:cn
-- 定位到下一個(gè)錯(cuò)誤绒障。:cp
-- 定位到上一個(gè)錯(cuò)誤吨凑。:cr
-- 定位到第一個(gè)錯(cuò)誤。
13.7 自動(dòng)補(bǔ)全
C-x C-s
-- 拼寫建議。C-x C-v
-- 補(bǔ)全vim選項(xiàng)和命令鸵钝。C-x C-l
-- 整行補(bǔ)全糙臼。C-x C-f
-- 自動(dòng)補(bǔ)全文件路徑。彈出菜單后恩商,按C-f循環(huán)選擇变逃,當(dāng)然也可以按 C-n和C-p。C-x C-p
和*C-x C-n
-- 用文檔中出現(xiàn)過(guò)的單詞補(bǔ)全當(dāng)前的詞怠堪。 直接按C-p和C-n也可以揽乱。C-x C-o
-- 編程時(shí)可以補(bǔ)全關(guān)鍵字和函數(shù)名啊。C-x C-i
-- 根據(jù)頭文件內(nèi)關(guān)鍵字補(bǔ)全粟矿。C-x C-d
-- 補(bǔ)全宏定義凰棉。C-x C-n
-- 按緩沖區(qū)中出現(xiàn)過(guò)的關(guān)鍵字補(bǔ)全。 直接按C-n或C-p即可陌粹。
當(dāng)彈出補(bǔ)全菜單后:C-p
向前切換成員撒犀;C-n
向后切換成員;C-e
退出下拉菜單掏秩,并退回到原來(lái)錄入的文字或舞;C-y
退出下拉菜單,并接受當(dāng)前選項(xiàng)蒙幻。
13.8 多行縮進(jìn)縮出
正常模式下嚷那,按兩下>;
光標(biāo)所在行會(huì)縮進(jìn)。
如果先按了n
杆煞,再按兩下>;
魏宽,光標(biāo)以下的n行會(huì)縮進(jìn)。
對(duì)應(yīng)的决乎,按兩下<;
队询,光標(biāo)所在行會(huì)縮出。
如果在編輯代碼文件构诚,可以用=進(jìn)行調(diào)整蚌斩。
在可視模式下,選擇要調(diào)整的代碼塊范嘱,按=送膳,代碼會(huì)按書寫規(guī)則縮排好。
或者n =丑蛤,調(diào)整n行代碼的縮排叠聋。
13.9 折疊
-
zf
-- 創(chuàng)建折疊的命令,可以在一個(gè)可視區(qū)域上使用該命令受裹; -
zd
-- 刪除當(dāng)前行的折疊碌补; -
zD
-- 刪除當(dāng)前行的折疊虏束; -
zfap
-- 折疊光標(biāo)所在的段; -
zo
-- 打開(kāi)折疊的文本厦章; -
zc
-- 收起折疊镇匀; -
za
-- 打開(kāi)/關(guān)閉當(dāng)前折疊; -
zr
-- 打開(kāi)嵌套的折行袜啃; -
zm
-- 收起嵌套的折行汗侵; -
zR (zO)
-- 打開(kāi)所有折行; -
zM (zC)
-- 收起所有折行群发; -
zj
-- 跳到下一個(gè)折疊處晃择; -
zk
-- 跳到上一個(gè)折疊處; -
zi
-- enable/disable fold;
14. 命令行
normal模式下按:進(jìn)入命令行模式
14.1 命令行模式下的快捷鍵:
上下方向鍵:上一條或者下一條命令也物。如果已經(jīng)輸入了部分命令宫屠,則找上一 條或者下一條匹配的命令。
左右方向鍵:左/右移一個(gè)字符。
-
C-w
: 向前刪除一個(gè)單詞。 -
C-h
: 向前刪除一個(gè)字符狠怨,等同于Backspace尸执。 -
C-u
: 從當(dāng)前位置移動(dòng)到命令行開(kāi)頭。 -
C-b
: 移動(dòng)到命令行開(kāi)頭。 -
C-e
: 移動(dòng)到命令行末尾。 -
Shift-Left
: 左移一個(gè)單詞。 -
Shift-Right
: 右移一個(gè)單詞缰猴。 -
@:
重復(fù)上一次的冒號(hào)命令。 -
q:
正常模式下疤剑,q然后按':'滑绒,打開(kāi)命令行歷史緩沖區(qū), 可以像編輯文件一樣編輯命令隘膘。
q/和q? 可以打開(kāi)查找歷史記錄疑故。
14.2 執(zhí)行外部命令
-
:!
cmd 執(zhí)行外部命令。 -
:!!
執(zhí)行上一次的外部命令弯菊。 -
:sh
調(diào)用shell纵势,用exit返回vim。 -
:r !cmd
將命令的返回結(jié)果插入文件當(dāng)前位置管钳。 -
:m,nw !cmd
將文件的m行到n行之間的內(nèi)容做為命令輸入執(zhí)行命令钦铁。
15. 其它
15.1 工作目錄
-
:pwd
顯示vim的工作目錄。 -
:cd path
改變vim的工作目錄才漆。 -
:set autochdir
可以讓vim 根據(jù)編輯的文件自動(dòng)切換工作目錄牛曹。
15.2 一些快捷鍵(收集中)
-
K
: 打開(kāi)光標(biāo)所在詞的manpage。 -
*
: 向下搜索光標(biāo)所在詞栽烂。 -
g*
: 同上躏仇,但部分符合即可。 -
#
: 向上搜索光標(biāo)所在詞腺办。 -
g#
: 同上焰手,但部分符合即可。 -
g C-g
: 統(tǒng)計(jì)全文或統(tǒng)計(jì)部分的字?jǐn)?shù)怀喉。
15.3 在線幫助
-
:h(elp)
或F1 打開(kāi)總的幫助书妻。 -
:help user-manual
打開(kāi)用戶手冊(cè)。
命令幫助的格式為:第一行指明怎么使用那個(gè)命令躬拢; 然后是縮進(jìn)的一段解釋這個(gè)命令的作用躲履,然后是進(jìn)一步的信息。 -
:helptags somepath
為somepath中的文檔生成索引聊闯。 -
:helpgrep
可以搜索整個(gè)幫助文檔工猜,匹配的列表顯示在quickfix窗口中。 -
Ctrl+]
跳轉(zhuǎn)到tag主題菱蔬,Ctrl+t 跳回篷帅。 -
:ver
顯示版本信息。
15.4 一些小功能
簡(jiǎn)單計(jì)算器: 在插入模式下拴泌,輸入C-r =魏身,然后輸入表達(dá)式,就能在 光標(biāo)處得到計(jì)算結(jié)果蚪腐。