
“我學(xué)功夫,從15歲開始,每天揮刀500下,這個(gè)數(shù)管住了我。從今天起,我以你為約束?!?/strong>
--電影《師傅》
看過甄子丹演的《葉問》三部曲,陳國坤演的《李小龍傳奇》最喜歡廖凡演的《師傅》(臺(tái)詞精煉,耐人尋味)。詠春拳給我的印象是招數(shù)簡單實(shí)用,攻防兼?zhèn)洌R运俣戎苿?。這跟 Vim 的哲學(xué)有異曲同工之妙。甚至覺得有時(shí)候用 Vim 編程感覺像練功,沒有 IDE 那樣繁多的提示和功能,純粹的寫代碼。這里總結(jié)點(diǎn)兒我平時(shí)使用 Vim 的竅門,讓你用起 Vim 來像詠春一樣快(快速移動(dòng)光標(biāo)),狠(瘋狂碼字),準(zhǔn)(準(zhǔn)確刪除/修改)
- Part1:手指不要輕易離開主鍵區(qū)
- Part2:讓光標(biāo)跟上眼睛
- Part3:Vim 語熟于心
- Part4:常用 Vim 語實(shí)戰(zhàn)(會(huì)持續(xù)更新)
Part1:手指不要輕易離開主健區(qū)

詠春:中門論 ─人體中門最弱,是攻擊目標(biāo),也是重點(diǎn)守護(hù)的地方。
要提高使用Vim的效率,在保證功能的情況下,盡量縮小打字的范圍,守護(hù)我們的“中門”(主鍵區(qū))。這里有幾點(diǎn)建議:
- 不用 方向鍵,用 <code>hjkl</code> (入門基本素養(yǎng))
- 不用 <code>Esc</code>,用 <code>control + [</code>
- 不用 <code>Back Space</code>,用 <code>x/D/c/C</code> 等
- 把鍵盤上的 <code>Cap Lock</code> 換成 <code>Control</code>
- 常用<code>ctrl + p</code>或<code> ctrl + n</code>補(bǔ)全輸入
- 常用<code>.</code>(英文句號(hào))重復(fù)上一個(gè)命令
- 盲打(進(jìn)階必備素養(yǎng))
-
用<code>set nu</code>和 <code>set rnu</code> 讓行數(shù)行距盡收眼底:
:set nu :set rnu
<br />
Part2:讓光標(biāo)跟上眼睛
| 效果 | 命令 |
|---|---|
| 光標(biāo)置頂 | <code>gg</code> |
| 光標(biāo)至底 | <code>G </code> |
| 光標(biāo)至頁頂 | <code>ctrl + h</code> |
| 光標(biāo)至頁底 | <code>ctrl + m</code> |
| 光標(biāo)至頁中 | <code>ctrl + l</code> |
| 光標(biāo)至句首 | <code>ctrl + ^</code> |
| 光標(biāo)至句尾 | <code>ctrl + $</code> |
| 往下翻頁 | <code>ctrl + d</code> |
| 往上翻頁 | <code>ctrl + p</code> |

<br />
Part3:Vim 語熟于心
Vim 語法結(jié)構(gòu):[數(shù)字]+ 動(dòng)詞 + 介詞 + 名詞/符號(hào)
- 數(shù)字表示重復(fù)命令的次數(shù),省略則表示只執(zhí)行一次。
- 語法結(jié)構(gòu)必須嚴(yán)格遵循:[數(shù)字] + 動(dòng)詞 + 介詞 + 名詞/符號(hào)的順序使用,否則可能沒有意義。
- 語法是死的,語言是活的,結(jié)合具體的情況使用即可使事半功倍。
動(dòng)詞
| 效果 | 命令 |
|---|---|
| 刪除(delete): | <code>d</code> |
| 修改(change): | <code>c</code> |
| 復(fù)制(yank): | <code>y</code> |
| 選取(visual select): | <code>v</code> |
- 替換(replace)命令是 <code>r</code> 不支持 Vim 語法結(jié)構(gòu),修改錯(cuò)別責(zé)的時(shí)候常用,格式是 <code>r</code> + 正確的字母/字符
介詞
| 效果 | 命令 |
|---|---|
| 在...之內(nèi)(inner) | <code>i</code> |
| 在...周圍(around) | <code>a</code> |
| 到...位置前(to) | <code>t</code> |
| 到...位置上(forward) | <code>f</code> |
- 注意:<code>i</code>/<code>a</code>/<code>f</code>在當(dāng)動(dòng)詞使用的時(shí)候分別表示 插入(insert),增補(bǔ)(append),查詢(find),然而 <code>t</code> 只有作介詞(表示 to) 和符號(hào)(表示 tag) 的時(shí)候才有意義,請不要混淆了。
名詞
| 效果 | 命令 |
|---|---|
| 一個(gè)單詞(word) | <code>w</code> |
| 一個(gè)句子(sentence) | <code>s</code> |
| 一個(gè)段落(paragraph) | <code>p</code> |
常用符號(hào)
| 效果 | 命令 |
|---|---|
| 逗號(hào) | <code>,</code> |
| 句號(hào) | <code>.</code> |
| 分號(hào) | <code>;</code> |
| 一個(gè)標(biāo)簽(tag) | <code>t</code> |
| 圓括號(hào) | <code>(</code> 或 <code>)</code> |
| 方括號(hào) | <code>[</code>或 <code>]</code> |
| 花括號(hào) | <code>{</code>或 <code>}</code> |
<br />
Part4:常用 Vim 語實(shí)戰(zhàn)(會(huì)持續(xù)更新)
1. 單詞/段落
| 效果 | 命令 | 記憶竅門 |
|---|---|---|
| 刪除一個(gè)單詞 | <code>daw</code> | delete a word |
| 替換一個(gè)單詞 | <code>caw</code> | change a word |
| 選取一個(gè)單詞 | <code>vaw</code> | visual-select a word |
| 刪除一個(gè)段落 | <code>dap</code> | delete a paragraph |
| 替換一個(gè)段落 | <code>cap</code> | change a paragraph |
| 選取一個(gè)段落 | <code>vap</code> | visual-select a paragraph |
-
delete a word
daw 命令效果 -
change a word
caw 命令效果 -
visual-select a word
vaw 命令效果 -
delete a paragraph
dap 命令效果 -
change a paragraph
cap 命令效果
6.visual-select a paragraph

想一想:如果把命令中的 <code>a</code> 換成 <code>i</code> 會(huì)有什么不同呢?
2. 程序員常用 Vim 語
| 命令 | 效果 | 記憶竅門 |
|---|---|---|
| 清除括號(hào)里的內(nèi)容 | <code>di(/di[/di{</code> 或 <code>di)/di]/di}</code> | delete inside ()/[]/{} |
| 清除整個(gè)括號(hào) | <code>da(/da[/da{</code>或 <code>da)/da]/da}</code> | delete around ()/[]/{} |
| 清除標(biāo)簽里面的內(nèi)容 | <code>dit</code> | delete in tag |
| 清除整個(gè)標(biāo)簽的內(nèi)容 | <code>dat</code> | delete all tag |
-
delete inner bracket/tag
清除括號(hào)/標(biāo)簽里的內(nèi)容 -
delete a bracket/tag
清除整個(gè)括號(hào)/標(biāo)簽
想一想:如果要替換括號(hào)/標(biāo)簽里面的內(nèi)容或者替換整個(gè)括號(hào)/標(biāo)簽應(yīng)該如何做呢?
提速策略
仔細(xì)觀看上面的實(shí)例,你也許會(huì)發(fā)現(xiàn),無論在單詞/段落/標(biāo)簽的任意一個(gè)位置(首部,中間,結(jié)尾)以上命令均可使用。這意味著你可以放心的使用Part1 中的第六條建議:常用<code>.</code>(英文句號(hào))重復(fù)執(zhí)行命令。接下來,你便可以用點(diǎn)點(diǎn)點(diǎn),來刪刪刪,改改改,有沒有像打詠春拳一樣的快感?
3. 句子
|命令|效果|
|:-:|:-:|:-:|
|向后清除到字母/符號(hào)的內(nèi)容|<code>df字母/符號(hào)</code>|
|向前清除到字母/符號(hào)的內(nèi)容|<code>dF字母/符號(hào)</code>|
|向前清除到字母/符號(hào)之前的內(nèi)容|<code>dT字母/符號(hào)</code>|
|向后清除到字母/符號(hào)之前的內(nèi)容|<code>dt字母/符號(hào)</code>|

想一想:如果把命令中的 <code>d</code> 替換成 <code>v</code> 或者 <code>c</code> 會(huì)有什么效果呢?
當(dāng)然,在修改句子的時(shí)候就不能在任意的地方用 <code>.</code>(英文句號(hào))來重復(fù)修改內(nèi)容了。但是我們依然可以使用 <code>.</code> 來快速到達(dá)指定的位置。
希望這篇文章對于喜歡 Vim 的朋友有幫助,這篇文章只包括了 Vim 從初級到進(jìn)階的一部分技巧,大家若有任何意見或建議請多多指教。都看到這兒了,給大家發(fā)個(gè)福利《Vim 實(shí)用技巧》高清英文版PDF(中文版我沒找著,不嫌棄就收了順便練練英文吧)感謝大家聽我嘮叨哈哈,里面有很多實(shí)用有趣的實(shí)例。下載不了的話可以簡信我。
P.S. 特別感謝:
和我一起用 Vim 玩耍的小伙伴 Seven
song4 和他的這篇一起來說Vim語
Drew Neil 的《Vim 實(shí)用技巧》







