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