高效使用VIM

高效使用vim (Efficient Editing With vim)

原英文教程見 (Original tutorial in English)

http://jmcpherson.org/editing.html

About copyright: I sent e-mail to Jonathan McPherson (author of this tutorial) to ask whether I could translate this tutorial into Chinese and post it on my web log. Jonathan supported my request. All rights of this tutorial belongs to Jonathan, if you want to redistribute or use it for other purpose, please ask Jonathan. You can find his contact information on his websitehttp://jmcpherson.org/contact.html. Thanks to JonathanMcPherson for his greate tutorial.

聲明: 我給此教程作者Jonathan McPherson發送電子郵件, 詢問是否可以把它翻譯成中文並貼在我的web log上, 他同意了我的要求. 關於此教程, 所有的權利屬於作者Jonathan, 如果你希望轉載或者把此教程用於其它用途, 請與作者Jonathan聯繫, 你可以在他的網站找到他的聯繫方法http://jmcpherson.org/contact.html. 感謝作者Jonathan寫了這篇精彩的教程(至少個人認爲非常有用).

之於我, vi即禪.
用vi如修禪,
vi命令如禪之心印.
用者不可窺其堂奧,
門外漢視其晦澀如天書.
常用之, 實可知其道.
[email protected]

(譯註: 以上爲作者引文, 本人未知reddy何許人也)

此教程假設讀者具備vim的基礎知識, 明白什麼叫插入模式(insert mode), 命令模式(command mode), 載入保存文件等等. 教程的目的是幫助新手們學習vi技巧, 更高效的用vi. (譯註: 原作者在教程中大部分時候混用vi和vim兩個名字, 本人未做更動)

在此教程中, <C-X>表示Ctrl-X – 就是按住Ctrl鍵然後按X. 命令模式下, 你可以在vim中輸入:help command獲得大部分命令的幫助, command是你需要看幫助的命令. (譯註: 比如你想知道x命令的用法, 就輸入:help x, 看完了幫助如果不知道怎麼回到原來的編輯界面, 可以輸入:bd命令, bd的意思是buffer delete, 關於buffer的相關描述請參看相關的vim幫助, 瞭解buffer也是vim用戶必須要乾的)

高效移動

珍愛生命, 遠離插入模式

一般情況下, 你應該儘量少把時間花在插入模式, 因爲在這種模式下vi和其它sb編輯器區別不大. 這也是大部分vim新手把大部分時間花在插入模式的原因 – 插入模式很易用. 但是vim真正的優勢在命令模式. 你會發現越瞭解vim, 你花在插入模式的時間越少.

使用h,j,k, l

高效率用vim編輯的第一步是絕了你用方向鍵(上下左右)的念頭. vim設計出”模式”操作方式的一大優勢就是可以讓你不需要老是把手從方向鍵和字母鍵之間移來移去. 當你在命令模式下, 用字母h, j, k, l對應方向左, 下, 上, 右. 這個需要練習一下才能習慣, 但是你會發現一旦你習慣了它們, 比用方向鍵快多了. (譯註: 這幾個移動鍵一定要動手試, 然後反覆用, 靠記憶忒艱難了)

在你編輯電子郵件或其他段落式文本的時候, 你可能注意到移動方向跳的行數比你料想的多. 這是因爲你的段落對vim來說在很長的同一個行裏. 用h, j, k, l移動前輸入g可以讓移動相對於屏幕看上去的行數而不是vim內部的行數.

用motion在當前行移動 (譯註: 沒想到特別合適的詞翻譯motion, 可以理解爲”高級移動”, 另請注意, motion僅在當前行移動)

大部分編輯器只有簡單的光標移動功能(上下左右, 行首行尾等等). vim有非常高級的光標移動命令, 這些命令叫做Motion. 當用motion把光標從文本中的一個點移動到另一個點的時候, 兩點間的文本(包括兩個點本身)被motion”掠過”. (這個概念在接下來的教程中非常重要.) (譯註: 舉例說明一下”掠過”概念, 比如你有一行文本, 內容是abcdefg, 當前光標在c上, 如果你用motion $, 光標移動到了g上, 那麼從c到g這段文本就被motion $”掠過”了).

以下是一些有用的motion:

fx

在當前行向前移動光標到下一個字符x (很明顯, x可以是任意你想要移動到的字符). 這是一個超級有用的命令. 你可以輸入;來重複前一個f命令.

tx

和上面的命令基本相同, 除了移動光標到字符x之前而不是x字符本身. (這個真的很有用)

Fx

在當前行向後移動光標到上一個字符x.

w

將光標向前移動一個詞.

b

將光標向後移動一個詞.

0

將光標移動到當前行首.

^

將光標移動到當前行的第一個字符. (譯註: 第一個字符可能不是行首, 比如行首有space, tab等不可見符號, 0會把光標停在這些符號之前, 而^會把光標停在這些符號之後的第一個可見字符.)

$

將光標移動到當前行尾.

)

將光標移動到下一個句子. (寫電子郵件或者文本文檔的時候很有用.)

(

將光標移動到上一個句子.

在文件中高效移動

vim有很多命令可以讓你在文件中任意移動光標 – 很少需要手工一頁一頁滾動. 以下按鍵技術上說不算motion, 因爲它們是在文件中移動, 而不是在某一特定的行.

<C-F> 將光標向前(下)移動一頁(屏幕).
<C-B> 將光標向後(上)移動一頁.
G 移動到文件尾
numG 將光標移動到某一行. (例如, 10G是把光標移動到第10行.)
gg 將光標移動到文件開頭
H 將光標移動到當前頁的第一行.
M 將光標移動到當前頁的中間一行.
L 將光標移動到當前頁的最後一行. (譯註: 有了HML3個命令, 可以把鼠標撇了, 爽)
* 讀取光標下的字串, 然後移動到當前文件中下一次出現該字串的位置. (比如說如果你的光標所在的位置的字串爲"bob,", 按了*之後, 光標將移動文件中下一個"bob"出現的位置.)
# 和*命令基本相同, 除了它移動到上一次出現字串的位置.
/text    從當前光標位置開始, 查找下一個含有text的字串並且移動到那裏. 需要按回車(Enter)鍵來執行查找. 如果要重複執行查找, 輸入n(n代表next occurance). (譯註: text指你想搜索的字串, 比如你要在文件查找字串"abc", 就輸入/abc然後回車)
?text    和/text相似, 區別是?text進行反向查找(查找上一個字串).
ma 給當前光標所在位置設置一個名字爲a的書籤. 書籤的名字可以是任何小寫字母. 你看不到書籤, 但它確實在.
`a 移動光標到書籤a. 注意`不是單引號, 大部分鍵盤上它在數字1的左面. (譯註: 本人使用的vim 7.1 windows版本用單引號也能完成同樣功能)
`. 移動到你之前編輯過的行. 這個又是"真有用". 如果你需要在文件中"滾來滾去"查看一些東西, 你可以用這個命令回到你之前編輯的行儘管你沒把它設成書籤.

高效輸入

使用關鍵字自動完成(補全)

vim 有個非常好的關鍵字自動完成系統. 就是說你可以只輸入很長的詞的一部分, 按一個鍵, vim幫你把這個詞自動補全. 比如說在你的代碼中有一個變量叫iAmALongAndAwkwardVarName, 你可能不願意每次用這個變量都把整個詞打一遍, 這時候就可以用自動完成功能.

要使用關鍵字自動完成, 只要輸入一個字串的前幾個字母 (比如 iAmAL) 然後按 <C-N> (按住Ctrl然後按N>)或者<C-P>. 如果vim沒有選擇你需要的字串, 繼續按<C-N>或<C-P> – vim會遍歷所有和你輸入的前幾個字母匹配的字串.

用點腦子開始插入模式

大部分新用戶輸入i來進入插入模式. 這種方法有時候相當低效, vi有一堆可以高效進入插入模式的命令. 這裏是最常用的一些:

i 在當前字符的左側開始插入.
I 在當前行行首開始插入.
a 在當前字符的右側開始插入.
A 在當前行行尾開始插入.
o 在當前行的下一行開始新的一行並在那插入. (譯註, 寫code用這個很爽)
O 在當前行的上一行開始新的一行並在那插入.
c{motion} 刪除(change)motion"掠過"的文本然後插入新文本代替它. 比如說, c$會刪除當前光標位置到當前行尾的文本並開始插入模式. ct!會刪除當前光標位置到下一個!出現位置(不包括!本身)之間的文本並進入插入模式. 刪除的文本會被複制到剪切板可以被粘貼使用. (譯註: 可以到前面複習一下"掠過"的概念, 參考例子. 輸入c{motion}命令的時候, 不需要輸入花括號)
d{motion}    刪除motion"掠過"的文本 -- 和c{motion}相似, 但是不進入插入模式.

高效移動成塊的的文本

用可視化選擇, 用合適的選中模式

和最早的vi不同, vim可以讓你把文本置爲高亮然後對高亮的文本操作. 以下是主要的3個可視化選中模式 (即文本高亮模式).

v 字符選中模式. 大部分人習慣用這個, 所以玩其他模式之前先把這個練熟.
V 行選中模式. 選中整行. 當你需要複製或移動幾行的時候, 這個比字符選中模式要好.
<C-V> 塊選中模式. 超級nb而且很少有其他的編輯器支持(譯註: 還是有一些支持的, 比如ultraedit, 但是得付錢...). 你可以在任何文本中選擇一個矩形塊來操作. (譯註: 在windows版本的vim中<C-V>默認被映射爲粘貼, 可以通過更改鍵盤映射或者使用<C-Q>來進行塊操作)
所有常用的光標移動鍵都可以在可視模式使用, 比如vwww會進入字符選中模式並且選中光標之後的3個詞. Vjj將會進入行選中模式並且選中當前行及之後的兩行.

在可視化選中模式下進行剪切和複製

一旦你有了高亮選擇, 你可能想要乾點啥. 以下是對選中的高亮文本最有用的命令:

d 剪切(刪除)高亮選中的文本到剪切板. (譯註: 據本人所知, vim所有的刪除其實都是剪切)
y 複製 (或者說"拽"(yank), vim用"拽"來表示複製...)高亮選中的文本到剪切板.
c 剪切高亮選中的文本到剪切板. 和d很相似, 只是c會進入插入模式.

在非可視化選擇模式進行剪切和複製

如果你確知你想要複製或者剪切什麼, 你可以不進入可視化選擇模式就完成這些操作. 這樣速度更快.

d{motion} 把由motion"掠過"的文本剪切到剪切板. 比如dw把當前光標開始的一個詞剪切到剪切板, 而dfS把從當前行從光標是到下一個S之間的文本剪切到剪切板.
y{motion}  把motion"掠過"的文本複製到剪切板.
c{motion}  把motion"掠過"的文本剪切到剪切板並且進入插入模式.
dd  剪切當前行到剪切板.
yy 複製當前行到剪切板.
cc 剪切當前行到剪切板並且進入插入模式.
D 剪切光標當前位置到行尾的文本到剪切板.
Y 複製整行到剪切板, 和yy相似. (yes, 這個命令和命令D的操作方式沒保持一致, 你可以用y$完成類似D的操作)
C 剪切光標當前位置到行尾的文本到剪切板並進入插入模式.
x 剪切當前字符. (類似於命令模式的退格(backspace)鍵)
s 剪切當前字符並進入插入模式.

粘貼

粘貼很簡單. 把光標移動到你想要粘貼的位置輸入p. (譯註: 粘貼操作需要在命令模式下, 另外P(大寫)命令把剪切板的內容粘貼到光標當前位置之前, 對用慣其它編輯器的人來說, P命令可能更符合習慣)

使用多個剪切板

大部分編輯器只有一個剪切板. (譯註: 貌似不算太'大部分') vim有多個. 在vim裏剪切板叫做寄存器(regiseter). 你可以輸入:reg列出所有當前定義過的寄存器和它們的內容. 大多數情況下你會使用以小寫字母命名寄存器, 其他的有各自不同的vim內部用途, 偶爾可能會有用.

要使用指定的某個寄存器來完成複製和粘貼, 很簡單, 在複製粘貼操作之前輸入”a, a表示你希望用的寄存器.

舉個例子, 複製當前行到寄存器k, 輸入”kyy. (也可以用V”ky. 想想爲啥這個也成). 那一行就會被存放在寄存器k裏, 直到有其他的東西被複制到到寄存器k覆蓋它. 複製之後可以用”kp來把寄存器k裏存放的內容粘貼到到文本中.

不幹機械勞動

給你驚喜的.命令

在vi中, 輸入.(英文的句號)可以重複上一個你執行過的命令. 比如你上一個命令是dw, 當你輸入.命令, vi會刪除下一個詞.

使用計數器執行重複操作

計數器是vim最nb的提速功能. 任何命令之前都可以加一個數. 這個數告訴vim你想把命令執行多少次. 例如:

3j會把光標向下移動3行.

10dd會刪除10行文本.

y3”在當前行, 把光標當前位置到第三個雙引號之間的文本複製到剪切板. 這種計數器用法可以大大擴展motion的操作範圍. (譯註: 本人認爲y3”不能完成這樣的功能, 對應的命令應該是y3f”, 可能原作者漏寫了f命令, 有空的時候問問原作者)

錄製宏

你可能偶然會發現你對一個文檔中的某塊文本反反覆覆的進行相同的操作. vim可以錄製一個特定的宏來完成這些操作.

qregister  開始錄製一個宏並保存在某個有名字的寄存器. 比如qa開始錄製一個宏並把這個宏存放在寄存器a中.
q 結束錄製
@register 回放存放在某個寄存器的宏. 比如@a播放寄存器a中的宏.
請注意宏只是記錄你的按鍵並且回放; 不是神奇的魔法. 因爲在vim中可以用多個命令執行某個任務, 錄製宏幾乎成了一種藝術形式, 你必須非常小心的選擇要用的命令才能用宏達到你想要的效果.

用vim寫程序代碼

vim是優秀的源代碼編輯器, 有很多的功能是專門爲寫程序設計的. 這裏是一些常用的:

]p 和p相似, 但是它可以自動調整粘貼的代碼和已有的代碼縮進. 試試吧.
% 把光標放在某個花括號{}, 中括號[]或者圓括號()上, 按%會把光標移動到與之對應的花括號, 中括號或者圓括號上. 對於修正多層嵌套邏輯代碼塊的括號解析問題來說, 這個功能堪稱救人於水火之中.
>> 縮進高亮選中的代碼. (對高亮選中請查看前面章節, 如果沒有文本被高亮選中, 則將當前行縮進)
<< 和>>類似, 但是反方向(譯註: 縮進是向右移動行, 反方向既向左移動).
gd 把光標移動到當前光標所在位置的函數或者變量的定義(definition)(或聲明(declaration)).
K 打開當前光標所在詞對應的手冊頁(man page). (比如你的光標當前在sleep這個詞上, vim會顯示sleep的手冊頁) (譯註: 這個功能貌似只對vim的原生OS--unix上有用)

(譯註: 結合ctags, cscope之類的輔助工具, vim可以提供更強大的程序代碼編寫功能)

中文版來源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章