vim 學(xué)習(xí)
近期開(kāi)始頻繁使用 Linux 操作系統(tǒng)扔水,學(xué)會(huì)在 shell 上使用命令行進(jìn)行操作菇夸,并使用 vi 或 vim 進(jìn)行文件編輯也成為了一項(xiàng)必不可少的需要學(xué)習(xí)和精進(jìn)的技能该抒。Vim 的學(xué)習(xí)曲線非常陡峭,一開(kāi)始學(xué)習(xí)時(shí)候會(huì)非常痛苦拍棕,需要花很多時(shí)間宇葱,有點(diǎn)像學(xué)習(xí)一個(gè)樂(lè)器演奏,通常需要近 2 周時(shí)間進(jìn)行學(xué)習(xí)往史。但這不正是一個(gè)十分拿來(lái)進(jìn)行技能的刻意練習(xí)的良好素材嘛仗颈,尤其是一旦學(xué)會(huì)將會(huì)受益匪淺的一項(xiàng)技能,那就抓緊時(shí)間學(xué)習(xí)起來(lái)吧椎例。
第一級(jí). 存活技能
基本技能包括:
i
插入模式挨决,輸入ESC
返回普通模式x
刪除當(dāng)前光標(biāo)下的字符:wq
保存與退出(:w
保存:q
退出)dd
刪除(和復(fù)制)當(dāng)前行p
粘貼
推薦:
hjkl
(強(qiáng)烈推薦但并非強(qiáng)制) 基本的光標(biāo)移動(dòng)命令:j
恰好好像一個(gè)向下??的箭頭
:help <command>
顯示關(guān)于<command>
的幫助說(shuō)明,可以使用:help
來(lái)獲得整體的幫助
總共 5 個(gè)命令订歪,這些是你一開(kāi)始需要學(xué)習(xí)掌握并刻意訓(xùn)練到成為一種下意識(shí)狀態(tài)的命令脖祈,主動(dòng)去練,練出肌肉記憶就可以開(kāi)始進(jìn)階第二級(jí)了刷晋。
第二級(jí):感覺(jué)舒適
上面的幾個(gè)命令只是讓你能存活下來(lái)撒犀,接下來(lái)是時(shí)候?qū)W習(xí)一些更多的命令了福压,以下是我的建議:所有命令都需要在普通模式下使用掏秩,如果你不知道現(xiàn)在是什么模式或舞,請(qǐng)狂按幾次 ESC 鍵。
各種插入模式
> a -> 在光標(biāo)后插入
> o -> 在當(dāng)前行后插入一個(gè)新行
> O -> 在當(dāng)前行前插入一個(gè)新行
> cw -> 替換從光標(biāo)所在位置后到一個(gè)單詞結(jié)尾的字符
簡(jiǎn)單的移動(dòng)光標(biāo)
> 0 -> 數(shù)字零蒙幻,到行頭
> ^ -> 到本行第一個(gè)不是 blank 字符的位置 (包括空格映凳、tab、換行邮破、回車等)
> $ -> 到本行行尾
> g_ -> 到本行最后一個(gè)不是 blank 字符的位置
> /pattern -> 搜索 pattern 的字符串(如有多個(gè)诈豌,可按 n 到下一個(gè))
復(fù)制/粘貼
> P -> 粘貼在光標(biāo)前,p 是粘貼在光標(biāo)后
> yy -> 復(fù)制當(dāng)前行抒和,與 ddP 等價(jià)但更簡(jiǎn)單
撤銷/重做
> u -> 撤銷上一次操作
> <C-r> -> 重做
加載/保存/退出/修改文件(Buffer)
> :e -> 打開(kāi)文件
> :w -> 保存文件
> :saveas <path/to/file> -> 保存文件到<path/to/file>
> :x , ZZ 或者 :wq -> 保存并退出 (:x 只在必要時(shí)保存)
> :bn 或 :bp -> 顯示下一個(gè)或上一個(gè)文件
花些時(shí)間來(lái)學(xué)習(xí)這些命令矫渔,一旦你學(xué)會(huì),你基本上可以做任何在其它編輯器上要做的事情摧莽。你可能仍然感到有些笨拙庙洼,但接下來(lái)的幾個(gè)等級(jí)將讓你明白為什么 vim 值得花這些時(shí)間來(lái)學(xué)習(xí)。
第三級(jí):更好镊辕、更強(qiáng)油够、更快
恭喜你來(lái)到了這一步!接下來(lái)我們將開(kāi)始一些有趣的工作征懈,在第三級(jí)石咬,我們將只談?wù)撃切└f的 vi 編輯器兼容的命令。
更好
vim 會(huì)這樣重復(fù)你的動(dòng)作:
-
.
-> (dot)將會(huì)重復(fù)上一個(gè)命令卖哎。 -
N<command>
-> 將重復(fù)命令 N 次鬼悠。
例如:
2dd
-> 刪除兩行3p
-> 粘貼文檔 3 次100idesu [ESC]
-> 在文檔中寫入“desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu desu”.
-> 重復(fù)上一個(gè)命令,再一次寫 100 個(gè) “desu”3.
-> 重復(fù)寫 3 次 “desu” (而不是 300 次亏娜,vim 真聰明)
更強(qiáng)
知道如何高效的在 vim 中移動(dòng)是非常重要的焕窝,不要跳過(guò)這一小節(jié)。
- N
G
-> 去到第 N 行 -
gg
->1G
的快捷方式 - 去到第一行 -
G
-> 去到最后一行 - 單詞移動(dòng):
w
-> 去到下一個(gè)單詞的開(kāi)頭
e
-> 去到本單詞結(jié)尾
默認(rèn)情況下單詞由字母數(shù)字和下劃線字符組成照藻,如果你認(rèn)為單詞由默認(rèn)方式組成袜啃,則使用小寫 e 和 w ,如果你認(rèn)為單詞是由 空格(blank)分隔幸缕,則你需使用大寫 E 和 W群发。
接下來(lái)談?wù)勛钣行实墓鈽?biāo)移動(dòng):
%
:去到對(duì)應(yīng)的(
,{
,[
*
或#
:去到下一個(gè)或前一個(gè)當(dāng)前光標(biāo)所在單詞
相信我,以上三個(gè)命令非常實(shí)用而強(qiáng)大发乔。
更快
一定要記住光標(biāo)的移動(dòng)熟妓,因?yàn)榻^大部分的命令都可以以下面的方式來(lái)使用:
<start position><command><end position>
例如:0y$
的意思是:
-
0
-> 去到本行起始位置 -
y
-> 從這里開(kāi)始復(fù)制 -
$
-> 到本行末尾
同樣可以使用 ye
實(shí)現(xiàn)從當(dāng)前光標(biāo)到本單詞結(jié)尾的復(fù)制。你也可以輸入 y2/foo
來(lái)復(fù)制 2 個(gè) “foo” 之間的字符串栏尚。
還有很多時(shí)候并不一定要按 y
才會(huì)復(fù)制起愈,下面的命令也會(huì)復(fù)制:
d (刪除)
v (可視化的選擇)
gU (變大寫)
gu (變小寫)
···
(可視化選擇是一個(gè)很有意思的命令,你可以先按 v ,然后移動(dòng)光標(biāo)抬虽,你就會(huì)看到文本被選擇官觅,然后,你可能 d阐污,也可以 y休涤,也可以變大小寫等)
第四級(jí):Vim 的超級(jí)能量
你只需要掌握前面的命令,就可以很舒服的使用 VIM 了笛辟,但是功氨,現(xiàn)在,我們向你介紹的是 VIM 殺手級(jí)的功能手幢,下面這些功能是我只用 vim 的原因:
在當(dāng)前行上移動(dòng)光標(biāo)
0 -> 到行頭
^ -> 到本行的第一個(gè)字母
$ -> 到最后一列
g_ -> 到本行最后一個(gè)字母
fa -> 到本行下一個(gè) a 出現(xiàn)的地方捷凄,,
或;
找到下一個(gè)或前一個(gè)
t, -> 去到 , 之前的一個(gè)字符
3fa -> 找到本行第三次出現(xiàn)的 a
F 和 T -> 同 f 與 t 只不過(guò)是相反方向
[圖片上傳失敗...(image-8e529d-1557159121228)]
還有一個(gè)很有用的命令:dt"
-> 刪除所有的內(nèi)容,知道遇到雙引號(hào)--"
區(qū)域選擇
在 visual 模式下围来,這些命令很強(qiáng)大跺涤,其命令格式為:<action>a<object>
和 <action>i<object>
- action 可以是任何的命令,如 d(刪除)管钳,y(拷貝)钦铁,v(可視模式選擇)
object 可能是: w 一個(gè)單詞,W 一個(gè)以空格為分隔的單詞才漆,s 一個(gè)句子牛曹,p 一個(gè)段落。也可以是一個(gè)特別的字符醇滥,如:"
,'
,)
,}
,]
.
假設(shè)你有一個(gè)字符串 (map (+)("foo"))
. 而光標(biāo)鍵在第一個(gè) o 的位置黎比。
vi" -> 會(huì)選擇 foo
va" -> 會(huì)選擇 “foo“
vi) -> 會(huì)選擇 ”foo“
va) -> 會(huì)選擇 ("foo")
v2i) -> 會(huì)選擇 map (+)("foo")
v2a) -> 會(huì)選擇 (map (+)("foo"))
[圖片上傳失敗...(image-60147c-1557159121229)]
塊操作
塊操作,典型的操作:0 < C-v> < C-d> I-- [ESC]
^ -> 到行頭
< C-v> -> 開(kāi)始?jí)K操作
< C-d> -> 向下移動(dòng) > (你也可以使用hjkl來(lái)移動(dòng)光標(biāo)鸳玩,或是使用 %阅虫,或是別的)
I-- [ESC] -> I 是插入,插入“--”不跟,按 ESC 鍵來(lái)為每一行生效颓帝。
在 Windows 下的 vim ,你需要使用<C-q> 而不是 <C-v>
自動(dòng)提示
在 Insert 模式下窝革,你可以輸入一個(gè)詞的開(kāi)頭购城,然后按 <C-p> 或是 <C-n>,自動(dòng)補(bǔ)齊功能就出現(xiàn)了……
宏錄制
qa 把你的操作記錄在寄存器 a
于是 @a 會(huì) replay 被錄制的宏
@@ 是一個(gè)快捷鍵用來(lái) replay 最新錄制的宏
示例
在一個(gè)只有一行且這一行只有“1”的文本中虐译,鍵入如下命令:
qaYp< C-a>q->
:qa 開(kāi)始錄制
:Yp 復(fù)制行
:< C-a> 增加1
:q 停止錄制
@a -> 在 1 下面寫下 2
@@ -> 在 2 下面寫下 3
現(xiàn)在做 100@@ 會(huì)創(chuàng)建新的 100 行瘪板,并把數(shù)據(jù)增加到 103
可視化選擇
前面,我們看到了的示例漆诽,我們可以使用 v 和 V 侮攀,一旦被選好了锣枝,你可以做下面的事情:
J -> 把所有的行連接起來(lái)(變成一行)
< 或 > -> 左右縮進(jìn)
= -> 自動(dòng)給縮進(jìn)
在所有被選擇的行后加上點(diǎn)東西:
<C-v>
選中相關(guān)的行(可使用 j 或 <C-d> 或是 /pattern 或是 % 等……)
$ 到行最后
A 輸入字符串,按 ESC
分屏
下面是主要的命令兰英,你可以使用 VIM 的幫助:help split
撇叁。
:split -> 創(chuàng)建分屏(:vsplit創(chuàng)建垂直分屏)
<C-w><dir> : dir 就是方向,可以是 hjkl 或是 箭頭 中的一個(gè)箭昵,其用來(lái)切換分屏
<C-w>_ (or <C-w>l): 最大化尺寸
<C-w>+ (or <C-w>-): 增加尺寸
總結(jié)
以上是作者最常用的 90% 的命令
建議每天都學(xué) 1 到 2 個(gè)新的命令税朴,兩到三周后,你會(huì)感到 vim 的強(qiáng)大的家制,有時(shí)候,學(xué)習(xí) vim 就像是在死背一些東西泡一,幸運(yùn)的事颤殴, vim 有很多很不錯(cuò)的工具和優(yōu)秀的文檔。運(yùn)行 vimtutor 直到你熟悉了那些基本命令鼻忠,其在線幫助文檔中你應(yīng)該要仔細(xì)閱讀的是:help usr_02.txt涵但,你會(huì)學(xué)習(xí)到諸如!
帖蔓,目錄矮瘟,寄存器,插件等很多其它的功能塑娇,學(xué)習(xí) vim 就像學(xué)彈鋼琴一樣澈侠,一旦學(xué)會(huì),受益無(wú)窮埋酬。