Vim the Six Billion Dollar editor
Better, Stronger, Faster.
學習 vim 并且其會成為你最后一個使用的文本編輯器币喧。沒有比這個更好的文本編輯器了,非常地難學糙麦,但是卻不可思議地好用魔市。
我建議下面這四個步驟:
- 存活
- 感覺良好
- 覺得更好,更強厂抽,更快
- 使用VIM的超能力
當你走完這篇文章浪秘,你會成為一個vim的superstar蒋情。
在開始學習以前埠况,我需要給你一些警告:
- 學習vim在開始時是痛苦的。
- 需要時間
- 需要不斷地練習棵癣,就像你學習一個樂器一樣辕翰。
- 不要期望你能在3天內把vim練得比別的編輯器更有效率。
- 事實上狈谊,你需要2周時間的苦練喜命,而不是3天。
第一級 – 存活
- 安裝 vim
- 啟動 vim
- 什么也別干河劝!請先閱讀
當你安裝好一個編輯器后壁榕,你一定會想在其中輸入點什么東西,然后看看這個編輯器是什么樣子赎瞎。但vim不是這樣的牌里,請按照下面的命令操作:
- 啟 動Vim后,vim在 Normal 模式下务甥。
- 讓我們進入 Insert 模式牡辽,請按下鍵
i
。(注:你會看到vim左下角有一個–insert–字樣敞临,表示态辛,你可以以插入的方式輸入了) - 此時,你可以輸入文本了挺尿,就像你用“記事本”一樣因妙。
- 如果你想返回 Normal 模式,請按
ESC
鍵票髓。
現在,你知道如何在 Insert 和 Normal 模式下切換了铣耘。下面是一些命令洽沟,可以讓你在 Normal模式下幸存下來:
-
i
→ Insert 模式,按ESC
回到 Normal 模式. -
x
→ 刪當前光標所在的一個字符蜗细。 -
:wq
→ 存盤 + 退出 (:w
存盤,:q
退出) (注::w
后可以跟文件名) -
dd
→ 刪除當前行裆操,并把刪除的行存到剪貼板里 -
p
→ 粘貼剪貼板
推薦:
-
hjkl
(強例推薦使用其移動光標,但不必需) →你也可以使用光標鍵 (←↓↑→
). 注:j
就像下箭頭炉媒。 -
:help <command>
→ 顯示相關命令的幫助踪区。你也可以就輸入:help
而不跟命令。(注:退出幫助需要輸入:q
)
你能在vim幸存下來只需要上述的那5個命令吊骤,你就可以編輯文本了缎岗,你一定要把這些命令練成一種下意識的狀態(tài)。于是你就可以開始進階到第二級了白粉。
在你進入第二級時传泊,需要再說一下 Normal 模式鼠渺。在一般的編輯器下,當你需要copy一段文字的時候眷细,你需要使用 Ctrl
鍵拦盹,比如:Ctrl-C
。也就是說溪椎,Ctrl
鍵就好像功能鍵一樣普舆,當你按下了功能鍵Ctrl
后,C就不在是C了校读,而且就是一個命令或是一個快鍵鍵了沼侣,在VIM的Normal模式下,所有的鍵就是功能鍵了地熄。這個你需要知道华临。
標記:
下面的文字中,如果是
Ctrl-λ
我會寫成<C-λ>
.以
:
開始的命令你需要輸入<enter>
回車端考,例如 — 如果我寫成:q
也就是說你要輸入:q<enter>
.
第二級 – 感覺良好
上面的那些命令只能讓你存活下來雅潭,現在是時候學習一些更多的命令了,下面是我的建議:
- 各種插入模式
-
a
→ 在光標后插入 -
o
→ 在當前行后插入一個新行 -
O
→ 在當前行前插入一個新行 -
cw
→ 替換從光標所在位置后到一個單詞結尾的字符
-
- 簡單的移動光標
-
0
→ 數字零却特,到行頭 -
^
→ 到本行第一個不是blank字符的位置(所謂blank字符就是空格扶供,tab,換行裂明,回車等) -
$
→ 到本行行尾 -
g_
→ 到本行最后一個不是blank字符的位置椿浓。 -
/pattern
→ 搜索 pattern 的字符串(注:如果搜索出多個匹配,可按n
鍵到下一個)
-
- 拷貝/粘貼 (注:
p
或P
都可以闽晦,p
是表示在當前位置之后扳碍,P
表示在當前位置之前)-
P
→ 粘貼 -
yy
→ 拷貝當前行當行于 ddP
-
- Undo/Redo
-
u
→ undo -
<C-r>
→ redo
-
- 打開/保存/退出/改變文件(Buffer)
-
:e <path/to/file>
→ 打開一個文件 -
:w
→ 存盤 -
:saveas <path/to/file>
→ 另存為path/to/file -
:x
,ZZ
或:wq
→ 保存并退出 (:x
表示僅在需要時保存仙蛉,ZZ
不需要輸入冒號并回車) -
:q!
→ 退出不保存:qa!
強行退出所有的正在編輯的文件笋敞,就算別的文件有更改。 -
:bn
和:bp
→ 你可以同時打開很多文件荠瘪,使用這兩個命令來切換下一個或上一個文件夯巷。(注:我喜歡使用:n
到下一個文件)
-
花點時間熟悉一下上面的命令,一旦你掌握他們了哀墓,你就幾乎可以干其它編輯器都能干的事了趁餐。但是到現在為止,你還是覺得使用vim還是有點笨拙篮绰,不過沒關系后雷,你可以進階到第三級了。
第三級 – 更好,更強喷面,更快
先恭喜你星瘾!你干的很不錯。我們可以開始一些更為有趣的事了惧辈。在第三級琳状,我們只談那些和vi可以兼容的命令。
更好
下面盒齿,讓我們看一下vim是怎么重復自己的:
-
.
→ (小數點) 可以重復上一次的命令 -
N<command>
→ 重復某個命令N次
下面是一個示例念逞,找開一個文件你可以試試下面的命令:
-
2dd
→ 刪除2行 -
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" -
.
→ 重復上一個命令—— 100 "desu". -
3.
→ 重復 3 次 “desu” (注意:不是 300次,你看边翁,VIM多聰明啊).
更強
你要讓你的光標移動更有效率翎承,你一定要了解下面的這些命令,千萬別跳過符匾。
-
NG
→ 到第 N 行 (注:注意命令中的G是大寫的叨咖,另我一般使用 : N 到第N行,如 :137 到第137行) -
gg
→ 到第一行啊胶。(注:相當于1G甸各,或 :1) -
G
→ 到最后一行。 - 按單詞移動:
-
w
→ 到下一個單詞的開頭 -
e
→ 到下一個單詞的結尾
-
如果你認為單詞是由默認方式焰坪,那么就用小寫的e
和w
趣倾。默認上來說,一個單詞由字母某饰,數字和下劃線組成(注:程序變量)
如果你認為單詞是由blank字符分隔符儒恋,那么你需要使用大寫的E和W。(注:程序語句)
下面黔漂,讓我來說說最強的光標移動:
-
%
: 匹配括號移動诫尽,包括(
,{
,[
. (注:你需要把光標先移到括號上) -
*
和#
: 匹配光標當前所在的單詞,移動光標到下一個(或上一個)匹配單詞(*
是下一個炬守,#
是上一個)
相信我箱锐,上面這三個命令對程序員來說是相當強大的。
更快
你一定要記住光標的移動劳较,因為很多命令都可以和這些移動光標的命令連用。很多命令都可以如下來干:
<start position><command><end position>
例如 0y$
命令意味著:
-
0
→ 先到行頭 -
y
→ 從當前位置開始拷貝 -
$
→ 拷貝到本行最后一個字符
你可可以輸入ye
浩聋,從當前位置拷貝到本單詞的最后一個字符观蜗。
你也可以輸入 y2/foo
來拷貝2個 “foo” 之間的字符串。
還有很多時間并不一定你就一定要按y
才會拷貝衣洁,下面的命令也會被拷貝:
-
d
(刪除 ) -
v
(可視化的選擇) -
gU
(變大寫) -
gu
(變小寫) - 其他等等
(注:可視化選擇是一個很有意思的命令墓捻,你可以先按v
,然后移動光標,你就會看到文本被選擇砖第,然后撤卢,你可能d
,也可y
梧兼,也可以變大寫等)
第四級 – Vim 超能力
你只需要掌握前面的命令放吩,你就可以很舒服的使用VIM了。但是羽杰,現在渡紫,我們向你介紹的是VIM殺手級的功能。下面這些功能是我只用vim的原因考赛。
在當前行上移動光標: 0 ^ $ f F t T , ;
-
0
→ 到行頭 -
^
→ 到本行的第一個非blank字符 -
$
→ 到行尾 -
g_
→ 到本行最后一個不是blank字符的位置惕澎。 -
fa
→ 到下一個為a的字符處,你也可以fs
到下一個為s的字符颜骤。 -
t
, → 到逗號前的第一個字符唧喉。逗號可以變成其它字符。 -
3fa
→ 在當前行查找第三個出現的a忍抽。 -
F
和T
→ 和f
和t
一樣八孝,只不過是相反方向。
還有一個很有用的命令是 dt"
→ 刪除所有的內容梯找,直到遇到雙引號—— "唆阿。
區(qū)域選擇 <action>a<object>
或 <action>i<object>
在visual 模式下,這些命令很強大锈锤,其命令格式為<action>a<object>
和 <action>i<object>
- action可以是任何的命令驯鳖,如
d
(刪除),y
(拷貝),v
(可以視模式選擇)。 - object 可能是:
w
一個單詞久免,W
一個以空格為分隔的單詞浅辙,s
一個句字,p
一個段落阎姥。也可以是一個特別的字符:"
记舆、'
、)
呼巴、}
泽腮、]
。
假設你有一個字符串 (map (+) ("foo")).而光標鍵在第一個 o 的位置衣赶。
-
vi"
→ 會選擇 foo. -
va"
→ 會選擇 "foo". -
vi)
→ 會選擇 "foo". -
va)
→ 會選擇("foo"). -
v2i)
→ 會選擇 map (+) ("foo") -
v2a)
→ 會選擇 (map (+) ("foo"))
塊操作: <C-v>
塊操作诊赊,典型的操作: 0 <C-v> <C-d> I-- [ESC]
-
^
→ 到行頭 -
<C-v>
→ 開始塊操作 -
<C-d>
→ 向下移動 (你也可以使用hjkl
來移動光標,或是使用%
府瞄,或是別的) -
I-- [ESC]
→ I是插入碧磅,插入“--”,按ESC
鍵來為每一行生效。
在Windows下的vim鲸郊,你需要使用 <C-q>
而不是 <C-v>
丰榴,<C-v>
是拷貝剪貼板。
自動提示: <C-n>
和 <C-p>
在 Insert模式下秆撮,你可以輸入一個詞的開頭四濒,然后按<C-p>
或是<C-n>
,自動補齊功能就出現了……
宏錄制: qa
操作序列 q
, @a
, @@
-
qa
把你的操作記錄在寄存器 a像吻。 - 于是
@a
會replay被錄制的宏峻黍。 -
@@
是一個快捷鍵用來replay最新錄制的宏。
示例
在一個只有一行且這一行只有“1”的文本中拨匆,鍵入如下命令:
-
qaYp<C-a>q
→ -
qa
開始錄制 -
Yp
復制行. -
<C-a>
增加1. -
q
停止錄制. -
@a
→ 在1下面寫下 2 -
@@
→ 在2 正面寫下3 - 現在做
100@@
會創(chuàng)建新的100行姆涩,并把數據增加到 103.
可視化選擇: v
, V
, <C-v>
前面,我們看到了 <C-v>
的示例 (在Windows下應該是<C-q>
)惭每,我們可以使用 v
和 V
骨饿。一但被選好了,你可以做下面的事:
-
J
→ 把所有的行連接起來(變成一行) -
<
或>
→ 左右縮進 -
=
→ 自動給縮進 (注:這個功能相當強大台腥,我太喜歡了)
在所有被選擇的行后加上點東西:
<C-v>
- 選中相關的行 (可使用
j
或<C-d>
或是/pattern
或是%
等……) -
$
到行最后 -
A
, 輸入字符串宏赘,按ESC
。
分屏: :split
和 vsplit
.
下面是主要的命令黎侈,你可以使用VIM的幫助 :help split
. 你可以參考本站以前的一篇文章VIM分屏察署。
:split
→ 創(chuàng)建分屏 (:vsplit創(chuàng)建垂直分屏)<C-w><dir>
: dir就是方向,可以是hjkl
或是←↓↑→
中的一個峻汉,其用來切換分屏贴汪。<C-w>_
(或<C-w>|
) : 最大化尺寸 (<C-w>| 垂直分屏)<C-w>+
(或<C-w>-
) : 增加尺寸
結束語
上面是作者最常用的90%的命令。我建議你每天都學1到2個新的命令休吠。在兩到三周后扳埂,你會感到vim的強大的。有時候瘤礁,學習VIM就像是在死背一些東西阳懂。幸運的是,vim有很多很不錯的工具和優(yōu)秀的文檔柜思。運行vimtutor直到你熟悉了那些基本命令岩调。其在線幫助文檔中你應該要仔細閱讀的是 :help usr_02.txt
。你會學習到諸如 !赡盘, 目錄誊辉,寄存器,插件等很多其它的功能亡脑。
學習vim就像學彈鋼琴一樣,一旦學會,受益無窮霉咨。