儘管網上有成打的Vim在線教程,可是要麼艱深晦澀,要麼太過膚淺。本教程的目標讓每一個階段都有斬獲,從理解它的哲學(將和你終身相伴)到超越如今編輯技巧,成爲其中的牛人。 git
簡單來講,本教程的學習方式將使你終身受益。 github
我相信大多數人可能因爲如下三點緣由而使用vim: 編程
一、vim無所不在。學習vim你無需擔憂到了其餘平臺須要學習新編輯器。 vim
二、可擴展性。你能夠只用它來編輯配置文件,也能夠將它當作你的開發平臺。 緩存
三、功能強大。它的工做方式與天然語言相似。即便一開始你對vim一無所知,通過一段時間的使用學習,很快也會成爲牛人。 sass
一句話,我相信一旦你開始學習,你會以爲就像掌握母語還有基礎數學這些基本技能同樣,也能天然而然地掌握vim。好了,在瞭解這些知識以後,讓咱們正式開始vim技術的學習吧。 安全
Kana大神說過,對vim的掌握有五個層次: 框架
對此我並不瞭解,不過我認爲這種觀點值得咱們注意。畢竟,kana是vim大神。在本教程中,我將經過下面四個主要模塊來向你展現vim。 編程語言
換句話說,若是你已經對vim有所瞭解的話,建議你從具體操做這部分開始。若是你熟練掌握這部分的話,就直接進入進階開始學功夫。假如你看這篇教程是爲了某個具體問題,那麼請進入常見問題章節。
因此呢,創建vim世界觀,vim基本操做,高手進階以及常見問題——這幾部分任君挑選。
我曾說過,不但願這是一本超級vim配置手冊,網上已經有不少這類教程了。本教程的目的在於強化你對vim的理解,幫助你熟練掌握這個工具。不過咱們也會稍微介紹一些基本的配置。
首先,我建議你安裝(幾乎)自我管理的vim。我就曾試過Janus(vim的發行版),可是我沒法肯定它究竟在作什麼,這讓我感到很挫敗。我偏好的配置就像vim自身同樣,簡單而優雅。
爲了達到這個目的,我直接將用戶主目錄下的.vim目錄和.vimrc做爲配置文件。
./vimrc修改經常使用鍵
首先呢,我以爲使用<Esc>鍵來退出插入模式實在是太老土了。Vim關注的是效率,若是不是特殊狀況,手指儘可能不要離開鍵盤中間排。而這種ESC操做實在是沒效率,因此不要用這個。
inoremap jk <ESC>
【注意: 有些人喜歡將<ESC>映射爲jj,可是我以爲映射爲jk可能更天然一點】
反斜槓也一樣存在這種問題,因此就像其它指導文檔推薦的那樣,我也喜歡將引導鍵重映射爲逗號(,)。
let mapleader = 「,」
經過這樣的配置,能夠簡化咱們接下來的命令執行,好比執行映射的縮寫命令時,只需右手中指往下一格就能夠輕鬆輸入逗號,而不須要向上再向右去遠遠地按反斜槓鍵。
大寫鍵不在vim的配置文件中,不過這個鍵的位置比較好,而它的默認功能咱們又經常用不上。對我來講,CAPSLOCK鍵沒啥用處,因此我將它映射爲Ctrl鍵(從操做系統層面來設置)。這樣若是我要執行Ctrl-XX操做時只需將左小指左移就能夠了。
此外,推薦其餘幾項基礎設置,這樣使用更加方便。
filetype plugin indent on
syntax on
set encoding=utf-8
要知道,優化vimrc文件是一個很是值得花時間去研究的問題,這裏說的幾個建議僅僅是皮毛。推薦查看個人設置或者閱讀這幾篇引用文章。
【請注意:若是你不熟悉或者並不喜歡插件,能夠跳過這一節。等你下次想通了再來看看。】
對我來講,Janus最能吸引個人地方在於它的插件管理,不過我能夠經過Pathogen來實現。基本上,經過如下幾步就能夠了:
爲了備份vim設置,我將整個~/.vim目錄經過git庫保存在這裏。這樣即使我新裝了系統,也能夠很方便的使用git clone https://github.com/danielmiessler/vim獲取個人偏好設置。
也許你也會喜歡這樣作。
簡單一步clone以後,將~/.vimrc軟鏈接到~/.vim/vimrc就能夠了。
Vim最成功的閃光點莫過於一旦你開始使用它,它就會讓你欲罷不能。Vim就像語言同樣,擁有名詞、動詞、副詞等屬性。
雖然個人這種說法從技術層面可能並不許確,可是卻能幫助你更好地理解vim的工做機制。重申一次,本教程的目的不是爲了取代其餘教程或幫助手冊——而是爲了幫助你理解其餘這些文檔晦澀難懂的部分。
所謂動詞指的是咱們執行的動做,這些動做能夠施加在名詞之上。能夠看看下面幾個常見的動做:
定語用在名詞以前,代表以哪一種方式來執行動做。幾個例子:
在英語中,名詞用來表示你所操做的對象。它們都是客體。在vim中也是這樣。下面列出vim中的名詞:
一樣,你也能夠將名詞視爲移動動做,這意味着你能夠用名詞表示在文本的跳轉範圍。咱們能夠在「移動」章節中看到例子說明。
好了,如今咱們有句子的不一樣組成部分,該怎樣將這幾部分組成完整的句子呢?就像英語同樣,憑感受將動詞、修飾語和名詞組合起來。
對於下面這些符號,根據顏色的不一樣來區分句子的不一樣組成部分:
刪除兩個單詞
d2w
修改所在的句子(刪除當前句子並進入插入模式)
cis
拷貝當前所在的段落
yip
修改當前光標所在位置到下一個括號之間的文本內容
ct<
記住,這裏的「目標」是尖括號,除此以外還能夠是任意字符。從語法上來講,使用單個字母」t」來表示這個向前查找的「目標」,這樣我就可使用「dt.」表示刪除當前位置到下一個句號之間的內容,」yt;」表示拷貝當前位置到下一個分號之間的內容。
看起來多漂亮!當編輯文本時採用這樣的思惟方式可使得操做更加優雅,符合咱們的直覺思惟,並且就像其餘語言同樣,熟能生巧。
如今,在瞭解這些基本操做後,讓咱們結合具體操做來更進一步學習。
一些對文件的基本操做。
【注意:相比較:wq 我更喜歡使用ZZ,由於我以爲不須要輸入冒號我以爲會快一點。也可使用:x】
對於任意一款編輯器,查找文本都是最基本需求。Vim擁有很強大的文本搜索功能,這一節將着重討論vim的文本搜索。
Vim中最基本也是最強大的搜索方式是」/」命令,在窗口最底端輸入你須要查找的字符串並回車就能夠了。
查找include字符串
/include<CR>
查找結果以下所示,因此匹配結果都被高亮顯示:
搜索完成後,輸入」n」依次向下查找,或者」N」向上查找。若是想要逆向查找字符串也可使用」?」來代替」/」.
Vim有一招特別酷,無論你在哪兒,都能查找特定字符並直接跳轉過去。好比說,我正在編輯HTML文件,
向前查找並直接跳轉到<字符
f<
向前查找並跳轉到<的前一個字符
t<
你能夠這麼理解,第一種找出目標(f),直接定位到查找對象;第二種到達目標(t),向着目標對象前進,定位到目標的前面。
比較怪異的一點是,能夠將它們做爲命令中的名詞。就好比剛纔我在編輯這句時:
修改到下一個」<」之間的內容
ct<
對任意字符均可以這麼作,好比說,句號,尖括號,圓括號,普通字母等等。這樣你就能夠查找文本並跳轉,或者你知道具體位置並直接跳轉。
【注意:當你搜索指定字符時,可使用分號跳轉到下一處——無論是t搜索仍是f搜索。逗號能夠用來反向跳轉到上一處。】
提升編輯效率相當重要的一點是:在文本內的自由移動跳轉。對vim來講,充分利用咱們上文所說的vim語言的基本準則,就能夠既簡單又優雅地作到。首先,介紹基礎概念。
咱們從鍵盤中間排開始介紹。受過訓練的打字員通常都習慣將右手指放在jkl;這幾個鍵上,就讓咱們從這裏開始使用vim。
剛開始可能使用得不太習慣,不過只需幾分鐘的練習以後,就會習慣成天然,你甚至會想要在word文檔裏面也這樣用(順便說一下,word文檔不支持)。
總結起來就是:右手食指和中指用來上移下移,右手食指和無名指用來左移右移。
你能夠在當前行內自由的移動。
【注意: 逗號和分號會重複以前的t和f跳轉】
除了按行和字符移動外,還能夠按單詞移動:
當使用大寫字母時,vim會忽略掉單詞間的分隔符,這樣本來被分隔符隔開的多個單詞會所以被視爲一個大單詞。
這種大寫命令的優點在咱們實際工做中會頻繁地碰到。
在普通模式下,能夠在兩點間來回跳轉,這在實際操做中很是有用。
如今將因此移動動做總結到一塊兒:
【注意:前面說過我將CAPSLOCK鍵映射到Ctrl,全部這些基於Ctrl的命令,我均可以用CASLOCK來代替】
好了,瞭解一堆在文本中移動的命令後,咱們能夠開始學習對文本的修改了。須要記住這一點:這些移動命令會一直陪伴着咱們——它們是vim語言的一部分(它們是上文提到的修飾語)。
首先咱們要弄清楚模式的概念。剛開始說到模式可能有點違反咱們的直覺,不過一旦習慣以後就會使用得很是的天然。不少vim指南都從介紹模式開始,不過我發現若是直接從模式開始有點很差理解,從普通模式與插入模式之間的切換入手會好一點。
除了上面介紹的模式外vim還有一些其餘的模式,不過本教程不作介紹由於它們不是首要任務。
如今讓咱們一塊兒回憶vim語言: 動詞、修飾符、名詞。假設咱們從普通模式開始,如今想要切換到插入模式下修改文本。
動詞能夠實現這種切換,而且有好幾種選擇。咱們能夠修改(c),插入(i),或者追加(a),還有其餘變種。
讓咱們從這幾個可選命令開始。
修改句子
cis
移動到行首並進入插入模式
I
在當前光標位置以後進入插入模式
a
從上面例子可知,有多種方式能夠進入插入模式輸入文本。還有一些簡寫來執行多條操做,好比說刪除並進入刪除模式。
刪除從光標所在位置開始到行末的全部內容,並進入插入模式
C
刪除當前行並進入插入模式
S
能夠經過波浪符來變動大小寫。就像你猜測的那種方式工做:無論你光標所在字符仍是可視模式下選擇的文本均可以。
Vim還能夠快速格式化文本,好比格式化一整段文本,使用下面這個命令就能夠很容易實現:
格式化當前段落
gq ap
gp根據預設的文本寬度testwidth以及參數指定的文本範圍來工做,這意味着對於你指定的任意範圍的文本,gp均可以自動校準寬度,使得文檔看起來乾淨又整潔。
【注意: ap表示文本對象」整個段落」的覆蓋範圍】
在瞭解怎樣修改文本後,接下來看看怎樣直接刪除文本。可能你已經知道了,跟前面差很少——只不過實現的動做不一樣罷了。
足夠簡單吧?
若是一個編輯器連撤銷和重作的功能都沒有,你確定不會用它。vim就像咱們前面注意到的那樣,盡其所能讓咱們更順手地操做,撤銷與重作也不例外。
【注意:記得將CAPSLOCK鍵映射爲Ctrl,這樣你才能更方便快速的使用組合鍵。】
這兩個動做均可以重複操做,你能夠一直撤銷啊撤銷回到最初保存點,也能夠一直重作啊重作到撤銷前的狀態。
Vim全部命令中最強大的那個莫過於點命令,聽起來有點奇怪是否是?解釋一下,經過「.」這個小點可讓你作一些很棒的事情——重複以前你的任何一個操做。
你所作的許多操做可能都有重複的價值。好比進入插入模式添加一些文本內容。你只需執行一次,而後一直執行點命令來重複就能夠了。請看下面的例子。
dw
5.
多麼給力! 若是結合可視化模式,發揮的能力更讓你大開眼界。
快速拷貝與粘貼文本一樣也是文本編輯器的必備功能,vim固然也是這方面的高手。
【注意:除了點命令外,&也是一種強大的重複命令,用於重複ex模式下的上一條命令(還記得ex模式嗎?)】
Vim的拷貝與你們預期的方式可能略有不一樣。拷貝命令不是你們料想的c。不知你還記不記得,上文提到c表示「修改」,已經被佔用了。Vim用拉取來表示拷貝,簡寫爲y。
記住,這種拷貝動做與你熟悉的那種拷貝並沒有不一樣——你只是在目的處複製了一份而已。
剪切很簡單:跟刪除操做差很少。因此呢,剪切實質上就是將刪除的內容挪到緩衝區,而後將這段刪除的內容再粘貼就能夠了。
粘貼跟咱們想的同樣——使用p命令。因此呢,若是你執行dd命令刪除了一行,你能夠用p粘貼回去。
有一點要記住:粘貼的起始位置從你當前光標位置以後開始,根據你拷貝的內容,你要麼粘貼字符或單詞,要麼粘貼行或列。若是想撤銷粘貼,使用通用撤銷命令「u」就能夠了。
交換兩行的位置
ddp
使用這條命令能夠很快速的交換兩行的位置。第一部分刪除你所在的行,第二部分將它粘貼回以前所在位置的下面。(ps:文章中用的是above,可是實際上拷貝回下方位置)
若是沒有拼寫檢查的話,感受會很糟糕,還好vim這方面作得很好。固然咱們須要先在配置文件中配置拼寫檢查選項。
在~/.vimrc的某個位置中添加
找出拼寫錯誤
若是在配置文件中設置了拼寫檢查的選項,那麼拼錯的單詞會自動添加下劃線。你也能夠手動輸入:set spell和:set nospell來啓用或禁用。
無論怎麼說,一旦開啓了拼寫檢查,若是存在拼寫錯誤的話,你就可使用如下命令來跳轉:
跳轉到下一處拼寫錯誤
]s
跳轉到上一處拼寫錯誤
[s
若光標處是錯誤單詞,給出修改建議
z=
將識別的錯誤單詞標記正確
zg
將vim視爲正確的單詞標記爲錯誤單詞
zw
我習慣在~/.vimrc中添加一些拼寫相關的簡寫命令。首先就是讓修正拼寫錯誤的命令變得簡單:
將拼寫修正標記爲<leader>f
在某些狀況下,好比說我須要創造性的拼寫一些單詞時,我會使用下面的命令來取消拼寫檢查。想要從新打開拼寫檢查只要再執行一次這個命令就能夠了。
Toggle spelling visuals with <leader>s
nnoremap <leader>s :set spell!
Vim的另外一個強大的功能是替換。命令分爲三部分,首先指定將要被替換的字符串,以後是替換的新字符串,最後指定替換範圍。
基本設置爲:%s
將每行的foo替換爲bar
:%s /foo/bar/g
將當前行中的foo替換爲bar
:s /foo/bar/g
【注意: 兩個命令的不一樣之處在於,單行替換s前少了%】
還有許多其餘的選項,不過這些是最基本的。
PS: 前面&命令重複此類操做(:進入ex模式後執行的命令)
太棒了。咱們已經討論了大部分文本編輯器的基本功能,以及在vim中如何使用這些功能。如今能夠進行高級vim的任務了——請注意,我說的高級進階是對初學者而言,不是Kana這樣的大神級人物。
在稍早以前咱們討論了「.」點命令的重複功能。有些命令適合使用點命令來重複,有些則不適合,區分這兩種命令很重要。
一般,若是你想要使用「.」(或者如Drew Neil稱之爲點命令)實現命令重複,說明你想用點命令緩存的命令來作比較細緻的操做。
好比說你要向若干行行末添加一些內容,可是添加的前提是被添加的行包含指定的字符串。你可使用以下方式來實現:
搜索字符串
/delinquent
如今,只要你按下「n」鍵都會跳轉到下一個搜索到的實例。那麼,從第一個匹配實例開始,咱們給它追加文本。
在行末添加文本
A[DO NOT PAY] [Esc]
好,這條命令執行完成了。不過接下來還有12個地方須要你來作。點命令容許咱們簡單地重複執行上一條命令,並且咱們還須要保存搜索結果,能夠將這兩條命令結合起來。
跳轉到下一個匹配實例並向行末添加文本
n.
注意,這種方式將動做與緩存的命令結合起來,因此咱們能按照預期地那樣跳轉並執行命令。
文本對象很特殊。這些文本對象的存在使得你能夠操做(動詞)更加複雜的對象(名詞)。比起選中某個單詞並刪除、跳轉到句首並刪除句子等簡單操做來講,無論你在何種文本對象的區域內,你均可以對它們執行這些操做。
說是說不清,實踐出真知嘛,咱們能夠看幾個例子。
首先來看基於單詞的對象
這些都是目標(名詞),因此咱們能夠對它們作一些操做,好比說刪除、修改等等。
刪除單詞(包括單詞周圍的空格)
daw
【注意: 對象內部與對象周圍這二者之間的區別在於單詞旁邊是否有空格】
句子對象的工做原理與單詞對象是一致的,想象一下,你敲了一大段句子,敲了一半後悔了想要刪掉。你就能夠簡單的使用下面這條命令,而不用回到句子開頭來申明刪除整行。
修改整條句子
cis
這條命令殺傷力仍是挺大的,它會刪除整條句子並進入插入模式等待你輸入新的內容。
還有許多其餘的對象類型,我只簡單的來介紹一下。
當我編輯代碼或者HTML文件時,時常會用到這些命令。關鍵是若是這些對象文本存在問題,你甚至並不須要處於這些對象內部就能夠操做它們;若是光標當前位置在雙引號外面(經測試,跟雙引號處於同一行並在雙引號前面),只須要輸入ci」就能夠刪除雙引號內部的全部內容,並將你挪到雙引號中間進入插入模式等待你的輸入。簡直不要太酷。
對其餘類型的某些對象一樣適用,好比說各類括號(圓括號、尖括號、大括號)和標籤(html)。
好比說編輯HTML連接時,URL地址通常在雙引號之間,連接文本在標籤中定義;經過vim這兩條命令能夠很方便地修改:ci」(修改URL)和cit(修改連接文本)。
下面列出常見的文本對象:
總的來講,我使用最多的是單詞,雙引號和標籤。
Vim的有許多迷人之處吸引着咱們,不過它們相比較可視化模式的技能來講,仍是太弱了。
也許可視化模式的最強大之處在於:咱們前面學到的全部的一切命令,經過結合可視化模式使用,能力都會大有提高。這是因爲在可視化模式下選中的高亮文本,能夠所有做爲命令的操做對象。
首先,學會進入可視化模式並選擇文本。經過「v」進入可視化模式,有三種選擇。
有時候你會處於一段文本中,兩頭被,.({[之類的符號所包圍。你可使用下面的命令來選中這部分的內容:
選中圓括號中的內容
vi(
選中中括號之間的內容
vi[
你還能夠加數字限定選擇的層數(好比說你處於嵌套層)
選中兩層大括號之間的全部內容
v2i{
【注意: 你也可使用va來代替vi。請不要被這些迷惑。它們與咱們所知的名詞和動詞沒有什麼不一樣】
從基於字符的可視化開始介紹(從普通模式輸入v進入可視化模式),在這種模式下你能夠選中單個字符、多個字符、單詞等等。相比較行選擇模式來講,我比較少使用這種模式,不過只是相對而言,其實用的也仍是挺多的。
這裏最主要的是要理解這一點: 處於可視化模式中,你的移動動做會修改被高亮選擇的文本。這就意味着,w或)之類的動做也會起做用,它們能夠擴展當前高亮選擇的範圍。以後,這部分高亮文本就能夠做爲命令執行的目標。
普通模式下輸入V進入這種模式,以後咱們會討論在這種模式下的操做。
可視化模式中還能夠垂直地選擇文本,這對操做列數據來講很給力。
對這些文本作什麼操做都是你的自由,不過最廣泛的操做是刪除、拷貝和粘貼。想一下你日常用鼠標選中一片文本會作什麼操做?
進入可視化模式,選中兩個以上單詞並拷貝
vwwy
拷貝以後你能夠在任何你但願的地方輸入p來粘貼。
或者你能夠作一些基於行的操做。
進入行選擇模式,刪除幾行文本
Vjjd
你也可使用文本對象,不過這種操做不太安全,最好別作。
可視化模式下選中一整個段落
vip
可視化模式下選中一整段文本並粘貼到當前段落之下。
vipyjjp
不要由於命令很長而感到崩潰。要記住,這些命令跟咱們日常說話是同樣的。你能夠沒有任何困難地、很隨意地念叨:
我想去商店。
這條命令也是同樣的:
拷貝這一段,下移兩行,再粘貼。
可視化模式還有一個很神奇的地方,對於選中的文本,你能夠經過點命令來執行以前緩存的命令。請看下面這個例子:
foo bar thing other yetanother also
若是想在每行前面都加個冒號,能夠如今第一行foo以前添加,而後可視化模式下選擇之下全部行,執行點命令就能夠了。
:foo :bar :thing :other :yetanother :also
【注意:要想使用這個功能,必需要在配置文件中添加映射 vnoremap . :norm.<CR>】
BAM!
以爲這功能沒有那麼酷炫? 那就想象一下: 你有個六萬行的文件,每行都與例子同樣,須要追加個冒號。你會怎麼作?
對整個文件添加分號
0i:j0vG.
wut
大大簡化了咱們的操做,大殺器一枚。步驟以下:
這樣對六萬行文件的操做就所有完成了。你甚至不須要去記一些亂七八糟的口訣——就像學騎單車會摔倒同樣,摔着摔着你就會了。相信我。
有些人會以爲宏很可怕,其實否則。宏只用來完成這樣一件事: 記錄你作的一切,在你須要的時候幫你再作一次。下面是一個簡單總結:
很簡單啊是否是?你能夠保存多個宏,好比說宏a、宏b、宏c等等。當你須要的時候執行@a或者@c之類的就能夠了。
你可能會問:
既然可視化模式與點命令的結合已經這麼強大了,咱們爲何還要使用宏呢?
問得好,不過答案挺複雜。宏能夠作你所作的一切,來看看這樣一個流程
這麼一堆工做,我們仍是假設文件有六萬行,試着在Microsoft word之類的工具裏完成這些操做,照樣會讓人感到萬分痛苦。
不過在vim中,這都不算事兒,你只須要把這些動做都作一遍(recording模式下),而後對每一行從新執行宏就能夠了。
【注意:若是想要對可視化選中文本執行宏的話,能夠執行:normal @a(或者其餘你所定義的宏的名字),這條命令會臨時將你切換到普通模式,針對每一行執行宏命令】
下面咱們來看一些你們常常問的一些問題,總結出來節約你們時間。
根據打開文件的類型不一樣,可能須要你對回車符和換行符作一些處理。這裏介紹如何刪除行末那些煩人的Ctrl-M字符。
刪除行末的Ctrl-M字符
:%s/s+$//
set ft=unix
set ft=html
set ft=dos
【注意:若是要顯示當前文件類型,在配置文件中添加:set filetype,或者在vim中直接執行這條命令就能夠了】
借用Surround插件,咱們能夠很
經過本教程我但願你們能明白如下兩點:
上面介紹的那些vim基礎用法,即使你只喜歡其中一部分,我想可能也會加深你對編輯文本的熱情——這可不是小事。你對操做的編輯器越熟練,思惟也就愈加散,我想這是堪比史詩級的大事了。
更爲重要的是,這也是爲何要求你得精通你選擇的編輯器。只有精通編輯器,不被編輯器的操做所阻滯,當你腦內思緒奔騰時,你才能激揚文字跟緊思緒跳躍的步伐。
或者,你也能夠將這一切都拋開,成爲那些被人所取笑的人——無論怎樣,我但願本教程能對你有用。
【若是你喜歡這篇文章,能夠去個人地盤看看其餘技術指導文章】