成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vim 的哲學(xué)(四)

xiao7cn / 2584人閱讀

摘要:的哲學(xué)第四篇姍姍來(lái)遲,狗血的原因我就不多說(shuō)了,好消息是我將為這個(gè)系列帶來(lái)一些動(dòng)態(tài)演示。所以目前為止你學(xué)會(huì)上述四個(gè)動(dòng)作指令就足夠了。以詞為單位使得我們可以更精確也是更具語(yǔ)義化的移動(dòng)光標(biāo),并且要比逐個(gè)字符的移動(dòng)要快得多。

Vim 的哲學(xué)第四篇姍姍來(lái)遲,狗血的原因我就不多說(shuō)了,好消息是我將為這個(gè)系列帶來(lái)一些動(dòng)態(tài)演示。原本我打算錄視頻的,但是文章都寫了那么些篇了,現(xiàn)在再錄視頻似乎晚了些,所以我研究了一下如何錄制高質(zhì)量的 GIF 動(dòng)畫(第三方軟件都不好用,最后我還是用 QuickTime 和一段腳本來(lái)完成錄制,挺酷的~)。接下來(lái)先奉上第一彈:

查漏補(bǔ)缺

上一期的基礎(chǔ)配置我遺漏了一個(gè)蠻重要的選項(xiàng):shiftround,這個(gè)選項(xiàng)真的很貼心很好用,遺憾的是官方文檔對(duì)此語(yǔ)焉不詳。我特意 Google 了一下才發(fā)現(xiàn)挺少有人解釋這個(gè)選項(xiàng)的?,F(xiàn)在我也忘記了當(dāng)初我是怎么知道它的,然后我發(fā)現(xiàn)用文字也還挺難解釋清楚,所以還是看動(dòng)畫吧:

round 在這里應(yīng)該是取整的意思。當(dāng)你的縮進(jìn)不成倍時(shí),開啟這個(gè)選項(xiàng)將會(huì)讓 Vim 自動(dòng)幫你把周圍的縮進(jìn)化零為整,你就不需要手動(dòng)去填/刪空格了。順便提前講一下,縮進(jìn)的指令是 <> 鍵,它們支持移動(dòng)指令(馬上講到),也支持?jǐn)?shù)字前綴。對(duì)當(dāng)前行執(zhí)行縮進(jìn)是 <<>>,也就是連按兩次。我們?cè)谝院髸?huì)詳細(xì)介紹關(guān)于縮進(jìn)的知識(shí)。

OK,加上它在你的基礎(chǔ)配置里,我們開始新的旅程!

移動(dòng)與編輯

現(xiàn)在我們知道使用 Vim 的一個(gè)很重要的原則就是遠(yuǎn)離鼠標(biāo),遠(yuǎn)離可視化的定位裝置(當(dāng)然除了鍵盤以外),原因我就不再贅述了。在此原則之下,必然要有一些方式來(lái)幫助我們選中目標(biāo)然后做出我們希望的更改,也就是移動(dòng)和編輯。

在常規(guī)模式里有兩個(gè)很重要的概念,一個(gè)叫做“動(dòng)作”(Motions),另一個(gè)叫做“操作”(Operators)。動(dòng)作,是指你能讓光標(biāo)移動(dòng)到哪里,而操作則需要結(jié)合動(dòng)作來(lái)決定你可以對(duì)文本做什么。通過二者的結(jié)合,我們可以逐漸體會(huì) Vim 是如何貫徹保持簡(jiǎn)單這一原則的。

hjkl 雖然簡(jiǎn)單,但是在很多場(chǎng)合之下它們太沒效率了,對(duì)么?從現(xiàn)在開始我希望你記?。何覀兺ǔ2挥?hjkl 做大量的光標(biāo)移動(dòng)。如果你發(fā)現(xiàn)你經(jīng)常抽瘋似的按這四個(gè)鍵在屏幕里來(lái)回移動(dòng),那你就已經(jīng)錯(cuò)了!這四個(gè)鍵真正的主要用處是作為其他動(dòng)作和操作的輔助鍵來(lái)使用的,隨著我們的深入學(xué)習(xí)你會(huì)越來(lái)越理解這一點(diǎn)。

那么除此之外我們還有什么選擇呢?

橫向移動(dòng) :help left-right-motions

當(dāng)我們以行/段為單位來(lái)審視我們的文本時(shí),Vim 為我們提供了一些橫向移動(dòng)的快捷動(dòng)作。

移動(dòng)指令 移動(dòng)效果
0 移動(dòng)光標(biāo)至行首
$ 移動(dòng)光標(biāo)至行尾
^ 移動(dòng)光標(biāo)至行首的第一個(gè)非空白符的字符
g_ 移動(dòng)光標(biāo)至行尾的最后一個(gè)非空白符的字符
f{char} F{char} 向前(右)或向后(左)移動(dòng)光標(biāo)至指定的字符({char})處,光標(biāo)停留在該字符之上
t{char} T{char} 向前(右)或向后(左)移動(dòng)光標(biāo)至指定的字符({char})處,光標(biāo)停留在該字符前/后面

通過上面這個(gè)表格,我們可以獲取到以下信息:

Vim 的許多指令都是成對(duì)兒的(非常重要),學(xué)習(xí)各種指令時(shí)嘗試成對(duì)兒去練習(xí)會(huì)事半功倍。

空白符(空格,Tab)在 Vim 里是很重要的,許多命令都有不同的版本來(lái)應(yīng)對(duì)有/沒有空白符的狀況。這主要是為了滿足不同的人群習(xí)慣,比如說(shuō)碼字兒的不是很在乎多一兩個(gè)空格,但是寫代碼的就不一樣了。

有些命令脫胎于正則表達(dá)式(相信你注意到了),所以結(jié)合正則來(lái)學(xué)習(xí)也能幫助你理解它們。

最后兩行的那幾個(gè)移動(dòng)指令可能有一點(diǎn)不好理解,但是它們實(shí)在是太有用了,請(qǐng)你親自試一下。以后我再深入介紹它們。

這還沒完,對(duì)于橫向移動(dòng)來(lái)說(shuō),最麻煩的是當(dāng)“回繞”(wrap)出現(xiàn)的時(shí)候。所謂回繞是指,當(dāng)一行(段)的字符數(shù)目超過屏幕的可視寬度范圍時(shí),編輯器會(huì)將超出的部分自動(dòng)轉(zhuǎn)移到下一行來(lái)顯示,但是這并非換行,也就是說(shuō)沒有插入換行符,只是在顯示上不讓字符超出屏幕的最大寬度范圍而已。

這個(gè)特性當(dāng)然不是 Vim 特有的,幾乎所有的編輯器都支持回繞,可是 Vim 對(duì)待回繞是和其他編輯器完全不同的,尤其是在編輯長(zhǎng)文檔時(shí)會(huì)讓你覺得有些古怪。我不會(huì)在本章詳細(xì)介紹關(guān)于回繞的一切,因?yàn)楸鞠盗忻嫦虻淖x者主要是程序員。對(duì)于編寫代碼這樣的工作,只要你遵循良好的編碼規(guī)范(你應(yīng)該這么做),那就很少會(huì)出現(xiàn)應(yīng)對(duì)回繞的情況。所以目前為止你學(xué)會(huì)上述四個(gè)動(dòng)作指令就足夠了。未來(lái)的某一天我會(huì)專門寫一篇如何打造專業(yè)的 Markdown 編輯功能,在那時(shí)候我們?cè)倩剡^頭來(lái)好好談?wù)劵乩@。

現(xiàn)在我列出橫向移動(dòng)時(shí)如果遇到回繞行我們可以做什么,這樣你可以自己試一下:

移動(dòng)指令 移動(dòng)效果
gh gj gk gl 讓光標(biāo)在回繞行內(nèi)做四方向移動(dòng)
g0 移動(dòng)光標(biāo)至當(dāng)前回繞行的行首
g$ 移動(dòng)光標(biāo)至當(dāng)前回繞行的行尾
g^ 移動(dòng)光標(biāo)至當(dāng)前回繞行的行首的第一個(gè)非空白符的字符
gm 移動(dòng)光標(biāo)至當(dāng)前回繞行的中間位置(或盡可能接近中間的位置)
關(guān)于 g

你或許已經(jīng)注意到 g 鍵的多次出現(xiàn)了,似乎它和其他指令相互配合可以產(chǎn)生許多新指令。沒錯(cuò),在 Vim 中有那么幾個(gè)“萬(wàn)能的”指令修飾鍵,g 是其中之一。如果你好奇還有多少指令是用 g 來(lái)修飾的,你可以鍵入 :help g 來(lái)查看一個(gè)列表。另外你應(yīng)該知道這份列表其實(shí)是索引文檔的一部分,你可以時(shí)常打開索引(:help index.text)來(lái)考察下自己對(duì) Vim 到底有多熟悉。

縱向移動(dòng) :help up-down-motions

縱向移動(dòng)的指令比較多,我還是先介紹幾個(gè)簡(jiǎn)單并且最有用的:

移動(dòng)指令 移動(dòng)效果
gg 讓光標(biāo)跳轉(zhuǎn)到文檔的最開始處
G 讓光標(biāo)跳轉(zhuǎn)到文檔的最后一行
{count}G :{count} 讓光標(biāo)跳轉(zhuǎn)到指定的行號(hào),即 {count} 所代表的行號(hào)
{count}% 讓光標(biāo)跳轉(zhuǎn)到指定的百分比位置,比如說(shuō)第一行是 0%,最后一行是 100% 等
H 讓光標(biāo)移動(dòng)到當(dāng)前屏幕的頂部(High Position),不滾屏
M 讓光標(biāo)移動(dòng)到當(dāng)前屏幕的中部(Middle Position),不滾屏
L 讓光標(biāo)移動(dòng)到當(dāng)前屏幕的底部(Low Position),不滾屏

{count} 是一個(gè)前綴標(biāo)記,意思是這個(gè)指令前面可以追加數(shù)字,比如說(shuō)如果你鍵入 25G,那么光標(biāo)就會(huì)移動(dòng)到當(dāng)前文檔的第 25 行去。這個(gè)特性非常重要,Vim 的強(qiáng)大和靈活在很大程度上都仰仗類似的前綴特性。

G{count}G 其實(shí)是同一個(gè)指令,只是帶上數(shù)字前綴與否會(huì)產(chǎn)生不同的效果,所以我分開寫了。這是第一次,一旦你了解了這個(gè)特點(diǎn),以后我就沒必要分開了。

ggG 是一對(duì)經(jīng)典的搭檔,許多非常有用的操作都是它們倆配合完成的。舉個(gè)例子,《Vim 的哲學(xué)》所有的文字都是在Vim 里完成的,每一次到最后我都要把它們復(fù)制粘貼到 SegmentFault 博客的發(fā)表頁(yè)面做最后的檢查并且發(fā)布,如何全部復(fù)制過去?有很多辦法,我一般選擇如下兩種:

如果我使用 MacVim(GUI 環(huán)境),那么我先 command + a,然后 "+y 或者 "*y

如果我使用 CLI Vim(命令行環(huán)境),就變成一串指令:gg"+yG,拆開看:gg + "+y + G

喂喂,command + a 是全選吧,這是 Vim 的指令嗎?你別忽悠我喔~

我可沒有說(shuō)你只能用 Vim 的內(nèi)置指令呀,了解你所處的環(huán)境,在不影響效率,不打亂節(jié)奏的前提下善于利用一切可以利用的工具,這不正是極客的特質(zhì)之一嗎?只不過我不是每次都有機(jī)會(huì)用到 MacVim 的,所以 gg + G 的經(jīng)典組合還是必須要掌握的。至于 "+y,這個(gè)涉及到寄存器(:help registers)的知識(shí),我們稍后就會(huì)講到,別急。

以詞為單位的移動(dòng) :help word-motions

hjkl 是以字符為單位來(lái)移動(dòng)的,橫向和縱向移動(dòng)基本上都是以句/段為單位來(lái)使用的,然而有些情況下我們需要的是介于二者之間的移動(dòng)單位,也就是以詞為單位。以詞為單位使得我們可以更精確(也是更具語(yǔ)義化)的移動(dòng)光標(biāo),并且要比逐個(gè)字符的移動(dòng)要快得多。

這里所說(shuō)的詞特指的是像英語(yǔ)那樣的以空格(有時(shí)候也會(huì)是別的符號(hào))為分隔符的詞——很遺憾,中文分詞是很大的挑戰(zhàn),Vim 沒有內(nèi)置這一功能。像這樣的詞都可以分出詞頭和詞尾,比如 word 這個(gè)詞,詞頭是 w,詞尾是 d。

于是在 Vim 中的詞組移動(dòng)也按照詞分頭尾的特性分成了兩組:

移動(dòng)指令 移動(dòng)效果
w b 向前(右)或向后(左)移動(dòng)光標(biāo)至下一個(gè)詞組的詞頭位置
e ge 向前(右)或向后(左)移動(dòng)光標(biāo)至下一個(gè)詞組的詞尾位置

一些朋友喜歡尋找每一個(gè)指令對(duì)應(yīng)的含義,這樣有助于形象記憶。事實(shí)上,這些含義也不是我編造出來(lái)的,內(nèi)置的文檔里都有很詳細(xì)的描述,比如說(shuō)上面這幾個(gè)分別是:

w:Words forward

b:words Backward

e:forward to the End of word

ge:backward to the End of word

你可能在想:我干嘛要關(guān)心詞頭和詞尾,好麻煩??!這個(gè)問題其實(shí)無(wú)關(guān)于 Vim 的哲學(xué),而是語(yǔ)言的哲學(xué)。

你看,咱們的漢語(yǔ)和英語(yǔ)是完全不同的兩個(gè)語(yǔ)種。在漢語(yǔ)里詞與詞的界限是靠意義來(lái)劃分,書寫形式則不太重要。用漢語(yǔ)寫一句話,你可以在詞組之間添加空格或者不添加空格,基本上不會(huì)對(duì)讀者產(chǎn)生影響(除了個(gè)別會(huì)產(chǎn)生歧義的特例)。而英文及其他類似語(yǔ)言則不然,它們加或不加空格的差別大了去了!一段英文如果沒有空格,那幾乎就是無(wú)法閱讀的。因此,對(duì)于母語(yǔ)為類似語(yǔ)種的人群來(lái)說(shuō),空格所劃分出的詞頭與詞尾是自然而然,司空見慣的事情,他們一點(diǎn)也不會(huì)覺得奇怪。不幸的是,作為程序員的我們也(被迫)得使用英語(yǔ)作為我們的主要書寫語(yǔ)言,因此你必須習(xí)慣去辨識(shí)和使用詞頭與詞尾。一旦你習(xí)慣了,你會(huì)發(fā)現(xiàn)它們非常有用。

為了讓你看到正確使用詞頭詞尾的效果,我放一張圖給你對(duì)比一下差別。在這張圖里,我分別演示了四種操作:

在句首,向右刪除兩個(gè)單詞,使用詞頭作為動(dòng)作指令(w

在句首,向右刪除兩個(gè)單詞,使用詞尾作為動(dòng)作指令(e

在句尾,向左刪除兩個(gè)單詞,使用詞頭作為動(dòng)作指令(b

在句尾,向左刪除兩個(gè)單詞,使用詞尾作為動(dòng)作指令(ge

每一步操作之后,注意觀察光標(biāo)停留的位置和最終的效果:

這些結(jié)果或許是你期望的,也可能不是,但這不要緊,沒有哪一種是絕對(duì)正確或錯(cuò)誤的,重要的是你需要了解它們之間的差別,于是你可以在必要的時(shí)候選擇正確的方式。

不過故事還沒完,以上四個(gè)指令各自還有一個(gè)變體,分別是:W,BE,gE。要了解它們的作用,我們得先聊一下詞的定界符。

對(duì)于詞和詞之間,空格是唯一的區(qū)隔標(biāo)準(zhǔn)嗎?很顯然不是。像這樣的詞:i_am_a_word,Vim 會(huì)視為 1 個(gè)詞,但是 i-am-a-word,Vim 則會(huì)視為 7 個(gè)詞!這是因?yàn)?Vim 允許你為其指定可以被視作詞組定界符的字符,于是當(dāng) Vim 遇到這些字符的時(shí)候,就會(huì)認(rèn)為是一個(gè)詞的結(jié)束。默認(rèn)情況下,_ 不是定界符,所以它會(huì)被視作一個(gè)詞的組成部分。

然而有些時(shí)候我們希望把這些定界符也當(dāng)作詞組的一部分,這樣我們可以移動(dòng)的快速一點(diǎn),這時(shí)大寫版本的詞組移動(dòng)指令就派上用場(chǎng)了,它們永遠(yuǎn)都只把空白符(空格、TAB、EOL)視作詞組的定界符。

你會(huì)覺得自己定義定界符很酷吧?我會(huì)把它放在高級(jí)設(shè)置那一篇來(lái)講。

基礎(chǔ)編輯 :help operator

Vim 內(nèi)置了 15 個(gè)編輯指令(還有一些變體),但是一般來(lái)說(shuō)我們用不到那么多。在本節(jié)我們來(lái)學(xué)習(xí)其中的五種(共計(jì) 10 個(gè)):

刪除 :help d

如果你把光標(biāo)對(duì)準(zhǔn)某個(gè)字符,然后按下 d(delete),你會(huì)發(fā)現(xiàn)什么都沒有發(fā)生?不要驚訝,編輯操作是要配合移動(dòng)指令來(lái)干活的,我之前花大力氣介紹一堆移動(dòng)指令不是漫無(wú)目的的不是?

OK,精彩的來(lái)了。當(dāng)你按下 d,Vim 會(huì)說(shuō):“好的伙計(jì),你想要?jiǎng)h除對(duì)吧?接下來(lái)請(qǐng)告訴我你要?jiǎng)h什么?”

如果你要?jiǎng)h一個(gè)詞,按下 dw,也就是 delete word。

如果你要?jiǎng)h除兩個(gè)詞,按下 d2w 或者 2dw,它們的效果是一樣的,但是它們代表的含義略有差別:

d2w 意思是:刪除 -> 2 個(gè) -> 詞

2dw 意思是:2 次 -> 刪除 -> 1 個(gè)詞

在這個(gè)例子里,兩種操作的結(jié)果不會(huì)產(chǎn)生歧義,所以你能得到一樣的效果。但是以后你會(huì)發(fā)現(xiàn)在某些特定的條件下,數(shù)字前綴在不一樣的地方會(huì)產(chǎn)生不一樣的效果(不只局限于刪除操作)。所以,正確的理解操作的含義是有必要的,請(qǐng)記?。?/p>

  

理解操作的含義,而不是背誦操作的順序。就好像你說(shuō)話說(shuō)的是你想要表達(dá)的意思,而不是字詞的某種排列組合。有些時(shí)候你顛倒字詞的順序不會(huì)影響你要表達(dá)的意思,因?yàn)椴淮嬖谄缌x,但有些時(shí)候則正好相反,切記切記!

如果我要?jiǎng)h除一整行怎么辦?簡(jiǎn)單:dd。

那如果我想要從光標(biāo)的位置開始一直刪除到行結(jié)束呢?那還用我教你?d$!不過 Vim 還有另外一個(gè)版本等價(jià)于 d$,它是:D

哦,那這么說(shuō)如果我使用 0d$ 或者 0D,就是和 dd 等價(jià)的咯?

啊哈~聰明的童鞋,很抱歉你錯(cuò)了!但是不怪你,這是一個(gè)很重要的區(qū)別,我們來(lái)多帶帶看一下示范:

看明白了嗎?其實(shí)差異是非常明顯的,dd 是連同行尾的行結(jié)束符(EOL)一起刪除的,所以粘貼的時(shí)候也會(huì)連著行結(jié)束符一起粘貼;而 0D0d$ 則不會(huì)包含行結(jié)束符。

你可能還納悶?zāi)兀皇茄菔緞h除的嗎?為什么刪掉的東西還能再粘貼回來(lái)呢?嗯,可能刪除這個(gè)詞不太恰當(dāng),如果改叫剪切是不是忽然就覺得貼切起來(lái)了?

Vim 的刪除操作和我們常見的剪切非常相似,事實(shí)上 Vim 的刪除指的是從你的眼前把目標(biāo)文字移除到寄存器中,之后你還可以從寄存器里把刪除的部分再粘貼回來(lái)。Vim 擁有一堆各式各樣的寄存器,擅于使用寄存器可以讓你的編輯工作變得異常輕松。今后我們會(huì)多帶帶介紹寄存器的進(jìn)階使用。

讓我來(lái)問你一個(gè)問題:如果要?jiǎng)h除一個(gè)字符該怎么辦?你或許已經(jīng)了解到 x 可以刪除光標(biāo)所在的那個(gè)字符,X 可以刪除光標(biāo)左邊的那個(gè)字符,但是你是否知道這兩個(gè)功能也是從 d 演化出來(lái)的呢?試著找找答案吧。

改寫 :help c

在你執(zhí)行完刪除之后,緊接著按下 i(insert),你就等于在改寫之前刪除的內(nèi)容了。如何把這兩步簡(jiǎn)化成一步?答案就是 c(change)了。對(duì)于 c,真的沒什么好講的,你學(xué)會(huì)了 d 就等于學(xué)會(huì)了 c,因?yàn)?c 就等于 d 完了緊接著 i 而已。

而且其他相關(guān)聯(lián)的操作也是類似的,比如說(shuō):

c2w:改寫兩個(gè)詞

cl:改寫光標(biāo)所在位置的字符,并且 s 等價(jià)于 cl

cc:改寫光標(biāo)所在的一整行,并且 S 等價(jià)于 cc

c^c$:從光標(biāo)所在位置開始一直改寫到行頭/行尾,并且 C 等價(jià)于 c$

s 比較少用,因?yàn)橥ǔ8囊粋€(gè)字符我們會(huì)使用 r,也就是替換(replace),但是 s 在編輯中文的時(shí)候有妙用,容我在這里賣個(gè)關(guān)子,等到打造專業(yè) Markdown 編輯器的時(shí)候再說(shuō)(實(shí)在是不能都說(shuō)了,要不然這篇結(jié)束不了了)。

Scc 多節(jié)省一次按鍵,而且也比較好按(在標(biāo)準(zhǔn)鍵位上),所以推薦用 S 來(lái)代替 cc。

復(fù)制 :help y

復(fù)制是幾個(gè)基礎(chǔ)編輯操作里怪癖略多的一個(gè)。首先是它的命名,yyank 的首字母,但是 yank 又是什么?它和拷貝(復(fù)制)有什么關(guān)系呢?

這也和寄存器有關(guān)。你看,Vim 的復(fù)制/剪切(刪除)/粘貼操作都是基于它底層的寄存器的,由于 c 已經(jīng)被改寫(change)占用了,而 Vim 的復(fù)制實(shí)質(zhì)上是把目標(biāo)文本拉拽(yank)到寄存器中備用,所以……好了你知道了就是了,咱不解釋那么多,反正 y 就是復(fù)制了,愛咋咋地~

另外一個(gè)怪癖出在 Y 身上,按照之前刪除和改寫的經(jīng)驗(yàn),你一定會(huì)認(rèn)為 Y 就等同于 y$ 唄,(Vim 亂入:“呵呵,圖樣圖森破!你以為我會(huì)讓你這么輕易就掌握訣竅嗎,少年?”)可是很不幸你又錯(cuò)了。這一回,Y 又和 yy 等價(jià)了……

我一直都沒鬧清楚為什么到了復(fù)制這里就和刪除/改寫不一樣了,就連官方的幫助文檔都是這么說(shuō)的:

  

如果你希望 Y 是從光標(biāo)處復(fù)制到行尾(這樣更合乎邏輯,不過不兼容 Vi),你可以使用 :map Y y$

看起來(lái)唯一的原因就是為了和老 Vi 兼容,但是我們完全不在乎這一點(diǎn)!后面的 :map Y y$ 是鍵位映射,雖然我們還沒講到,不過這一句你已經(jīng)可以把它放到你的 .vimrc 里了,重啟 Vim 之后你會(huì)發(fā)現(xiàn) Y 的表現(xiàn)和 C D 它們保持一致了,謝天謝地!

粘貼 :help p

粘貼就單純多了,只有兩個(gè)指令:

操作指令 移動(dòng)效果
p 自光標(biāo)所在位置向右粘貼默認(rèn)寄存器里的內(nèi)容
P 自光標(biāo)所在位置向左粘貼默認(rèn)寄存器里的內(nèi)容

默認(rèn)寄存器里的內(nèi)容取決于你在粘貼前最后的編輯動(dòng)作,有可能是刪除或復(fù)制的一段文本,也有可能是其他的。由于我們還沒有詳細(xì)介紹強(qiáng)大的寄存器功能,你或許會(huì)偶爾感到有些不便,在這里我先介紹一個(gè)最常用的技巧:

有時(shí)候,我們需要完成如下操作:

在某處復(fù)制或刪除(剪切)了一些文本

在另外一處刪除一些文本

把之前復(fù)制或刪除(剪切)的文本粘貼到這里

你看,這實(shí)際上是要用 A 處的文本來(lái)替換 B 處的文本,但由于默認(rèn)寄存器只保留了最后一次的復(fù)制/刪除(剪切)內(nèi)容,所以當(dāng)你完成第 2 步的時(shí)候,你在第 1 步準(zhǔn)備好的文本已經(jīng)沒了……大多數(shù)人是這么做的:

在某處復(fù)制或刪除(剪切)了一些文本

來(lái)到另外一處,先把這些文本粘貼到空白的地方

把需要替換的文本刪除

清理多余的空白(如果需要的話)

實(shí)際上,我們可以讓 Vim 不把指定的內(nèi)容放入默認(rèn)寄存器,這樣就不會(huì)覆蓋預(yù)先準(zhǔn)備好的內(nèi)容了,這等同于徹底刪除而不是剪切。Vim 的默認(rèn)寄存器是 ""(也叫匿名寄存器,:h quotequote),它保存常規(guī)的復(fù)制/刪除等操作的內(nèi)容,Vim 還有一個(gè)名字很酷的寄存器叫做:黑洞寄存器(Blackhole Register,:h quote_),它的按鍵是 "_。如果你在鍵入任何操作之前先輸入 "_,操作的結(jié)果將不會(huì)被任何寄存器保留下來(lái),就好像丟入了一個(gè)深淵黑洞,再也回不來(lái)了……(好傷感 T_T)

因此,我們可以這么玩:

在某處復(fù)制或刪除(剪切)了一些文本

使用黑洞寄存器刪除需要替換的內(nèi)容,例如刪除一行:"_dd

直接粘貼,搞定!

我把這個(gè)過程也錄了下來(lái),你可以對(duì)照看看:

我真是愛死這玩意兒了!不過你要知道,就上例而言黑洞寄存器不是唯一的辦法,說(shuō)不定你更喜歡別的操作組合,比如下面這個(gè):

這一套“組合拳”沒有用黑洞寄存器,它的好處是如果我反悔了,我還可以撤銷之前的操作把被替換的內(nèi)容找回來(lái)。整個(gè)過程的按鍵順序是這樣的:y$ -> gt -> gP -> D

請(qǐng)?jiān)试S我用更加具有語(yǔ)義的方式來(lái)重復(fù)一遍上面的操作:

y$:從光標(biāo)所在位置(行首)復(fù)制到行尾(不包括換行符)

gt:切換至下一個(gè)標(biāo)簽頁(yè)

gP:自光標(biāo)位置向左粘貼剛才復(fù)制的內(nèi)容,結(jié)束之后把光標(biāo)向右移動(dòng)一個(gè)字符(這就是 g 的作用,為了把末尾的 . 保留住。你也可以使用 Pl 實(shí)現(xiàn)一樣的目標(biāo))

D :自光標(biāo)位置刪除到行尾

我希望你理解我這樣重復(fù)一遍的原因,它包含了體現(xiàn) Vim 哲學(xué)的三個(gè)側(cè)面:

每一步都保持簡(jiǎn)單的顆粒操作

從不死記硬背,而是去表達(dá)你的意圖,用你自己的方式

條條大路通 Vim,何必死撞一棵樹?

好吧,第三點(diǎn)純粹是我在胡扯,哈哈。

大小寫轉(zhuǎn)換

大小寫轉(zhuǎn)換其實(shí)不算什么大事,本來(lái)我也猶豫還要不要介紹一下,但是考慮到這個(gè)在編程的時(shí)候還挺有用的,于是索性一并說(shuō)了吧,反正也不多……

操作指令 移動(dòng)效果
~ 轉(zhuǎn)換光標(biāo)所在字符的大小寫(嚴(yán)格來(lái)說(shuō),這不是一個(gè)操作指令)
g~ 轉(zhuǎn)換字符的大小寫(這個(gè)才真的是)
gu 強(qiáng)制轉(zhuǎn)換成小寫
gU 強(qiáng)制轉(zhuǎn)換成大寫

解釋一下頭兩個(gè),~ 不是操作指令,是因?yàn)樗鼪]辦法和移動(dòng)指令結(jié)合,它就只會(huì)轉(zhuǎn)換當(dāng)前光標(biāo)所在位置的那個(gè)字符。如果你有多個(gè)字符需要轉(zhuǎn)換,你就只能一個(gè)一個(gè)按過去。g~ 才是轉(zhuǎn)換大小寫的正式版,它可以結(jié)合移動(dòng)指令。比方說(shuō)按下 g~3j 會(huì)把往下 3 行的字符大小寫都轉(zhuǎn)換了(小寫變大寫,大寫變小寫)。不過 Vim 有一個(gè)選項(xiàng)叫做 tildeop(:h tildeop),它默認(rèn)是關(guān)閉的,如果你開啟它,~ 就會(huì)變成和 g~ 一樣了。這選項(xiàng)我記得很熟,因?yàn)槲医?jīng)常在團(tuán)隊(duì)里做重構(gòu)工作,這種改寫命名的活兒一再重復(fù),我索性就把 ~ 變成真正的操作指令了。

另外,毫無(wú)意外的,它們幾個(gè)都有直接操作當(dāng)前一整行的快捷版本,分別是:g~~ guu gUU。

  

趣味知識(shí):你知道 ROT13 加密編碼嗎?這可能是世界上最簡(jiǎn)單的加密手段了,有意思的是 Vim 也內(nèi)置了 ROT13 編碼/解碼功能。閑來(lái)無(wú)事的時(shí)候可以拿來(lái)逗別人玩哦!切換 ROT13 編碼/解碼的操作指令是:g?(:help g?)

縮進(jìn)與排版
操作指令 移動(dòng)效果
gq 自動(dòng)應(yīng)用排版規(guī)則
gw 自動(dòng)應(yīng)用排版規(guī)則(光標(biāo)位置不變)
= 自動(dòng)應(yīng)用縮進(jìn)規(guī)則
< > 手動(dòng)應(yīng)用縮進(jìn)規(guī)則(左右兩個(gè)方向)

前面兩個(gè)在編寫代碼時(shí)不太常用,倒是在編寫文檔時(shí)能發(fā)揮作用,因此它們不是重點(diǎn),請(qǐng)自行查閱文檔并嘗試。

后面兩個(gè)就比較常用了,所謂“自動(dòng)應(yīng)用縮進(jìn)規(guī)則”,前提是你得有可用的縮進(jìn)規(guī)則。Vim 內(nèi)置了非常多種語(yǔ)言的縮進(jìn)規(guī)則,那些沒有內(nèi)置的也基本上都可以在網(wǎng)上找到合適的縮進(jìn)規(guī)則插件。此前我們也在基礎(chǔ)設(shè)置里打開了 filetype indent on,所以此時(shí)如果你打開一份源碼文件,然后按下 gg=G,“唰”的一下——整個(gè)世界清靜了。

還記得吧?gg 是去文件的最開始處,G 則是去文件的最后一行,所以這條命令的含義是:“從文件的開始處應(yīng)用自動(dòng)縮進(jìn)規(guī)則直到文件的最后一行”。當(dāng)然你可以不必總是對(duì)整個(gè)文件進(jìn)行自動(dòng)縮進(jìn),之前我們提到過的移動(dòng)指令都可以搭配使用,之后我們還要介紹更加強(qiáng)大靈活的文本對(duì)象選擇指令,搭配上自動(dòng)縮進(jìn)那叫一個(gè)如虎添翼~

至于 <> 就沒什么新鮮的了,手動(dòng)縮進(jìn)唄!縮進(jìn)的寬度是由 shiftwidth 指定的,咱們上次已經(jīng)設(shè)置過了的有木有?另外它們也有針對(duì)當(dāng)前行的快捷版本,你已經(jīng)知道了,是吧?

  

想知道你的 Vim 內(nèi)置了那些語(yǔ)言的縮進(jìn)規(guī)則?鍵入這條命令::e $VIMRUNTIM/indent

Bonus

你現(xiàn)在可以嘗試把這些最常用的指令應(yīng)用在你的日常工作里了,如果你能堅(jiān)持去尋找最有效率的操作方式,你終將會(huì)明白其實(shí)根本用不著裝太多的插件。我很樂意進(jìn)一步幫助你,所以你如果在使用中有任何疑問請(qǐng)不要客氣盡管詢問我,我也喜歡看看有什么新的挑戰(zhàn),所以來(lái)吧~


其實(shí),第四篇本來(lái)想直接講文本對(duì)象的,但是我擔(dān)心新手會(huì)看不太懂,于是把文本對(duì)象一再往后擠。擠到現(xiàn)在才發(fā)現(xiàn),天啊!這篇太長(zhǎng)了,實(shí)在是不能再繼續(xù)下去了。于是,我們只好對(duì)文本對(duì)象說(shuō)拜拜了~咱們下期再見!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24789.html

相關(guān)文章

  • Vim 哲學(xué)(一)

    摘要:之所以能卓爾不群靠地就是一種自成一派且精悍有效的編輯器哲學(xué)當(dāng)然也是,就好像網(wǎng)游千千萬(wàn)卻唯有一覽眾山小,那靠地不是技巧與外在,而是與眾不同的世界觀。征服其實(shí)是一種領(lǐng)悟,我融入了的哲學(xué)而已。這也是好東西,它比上一個(gè)更貼近的哲學(xué)。 就在幾個(gè)小時(shí)以前,我回答了一個(gè)關(guān)于推薦開發(fā)工具的問題,很多朋友表示喜歡和鼓勵(lì),非常感謝!我也很想多寫一些細(xì)節(jié),于是便起意開一個(gè)系列來(lái)聊聊我多次提到的 Vim。 ...

    honhon 評(píng)論0 收藏0
  • Vim替換小技巧(兼淺談Vim哲學(xué)

    摘要:本文將以此為起點(diǎn),介紹一些替換小技巧。實(shí)話實(shí)說(shuō),使用命令來(lái)替換有違于大多數(shù)程序員的習(xí)慣。接下更進(jìn)一步,教多幾個(gè)小技巧。這么一來(lái),替換將僅在當(dāng)前大括號(hào)內(nèi)生效。在替換局部變量時(shí),比起全局替換,這樣的替換方式無(wú)疑會(huì)更高效。 想必用過Vim的人都知道,在Vim里面,以下命令可以替換當(dāng)前文件的內(nèi)容: :[range]s/{要被替換的模式}/{替換的內(nèi)容}/[flags] 其中range指定替換命...

    ConardLi 評(píng)論0 收藏0
  • Vim 哲學(xué)(二)

    摘要:為什么要有模式呢以上其實(shí)已經(jīng)講述了一些原因,但真正的價(jià)值還在于接下來(lái)要講到的哲學(xué)。鼠標(biāo)與快捷鍵的操作治標(biāo)不治本,它們沒能從根本上解決這個(gè)問題。 學(xué)會(huì)用不同的角度去看待和理解這個(gè)世界,你收獲的永遠(yuǎn)會(huì)比你想象的更多。 上回我分享了如何掌握基礎(chǔ)移動(dòng)的心得體會(huì),而對(duì)于很重要的模式卻只是一帶而過,這其實(shí)是有原因的。過去我有過幾次教新手 Vim 的經(jīng)歷,按照慣常的方式先告訴他們模式切換,...

    ashe 評(píng)論0 收藏0
  • Vim 哲學(xué)(三)

    摘要:插件鍵位映射技巧性的配置等等都是錦上添花,它們有助于你進(jìn)一步提高效率以及個(gè)性化你的工作環(huán)境,但是對(duì)于哲學(xué)的理解幫助甚少。為你開啟語(yǔ)法高亮。你可以自定義各種語(yǔ)言的語(yǔ)法高亮,無(wú)非就是根據(jù)這些規(guī) 如果沒有挑戰(zhàn),人生將多么無(wú)趣! 兩種副本 在我的硬盤上總是保留著(至少)兩份 Vim 的配置文件。其中一份是所謂完全正式版,它的文件名是 .vimrc,到本系列結(jié)束的時(shí)候,我們將了解其中...

    klinson 評(píng)論0 收藏0
  • Vim - 適合自己,才是最好

    摘要:原文鏈接適合自己的,才是最好的被稱為編輯器之神,是我用過之后才體會(huì)到的,用之前實(shí)在不敢對(duì)它做出什么評(píng)價(jià)。最初的不適,換來(lái)的是效率的飛升。感悟在學(xué)習(xí)使用的過程中,我最大的感悟就是適合自己的,才是最好的。 原文鏈接:Vim - 適合自己的,才是最好的 Vim 被稱為編輯器之神,是我用過之后才體會(huì)到的,用之前實(shí)在不敢對(duì)它做出什么評(píng)價(jià)。在大學(xué)時(shí)代,Vim 的大名就已如雷貫耳,但由于它陡峭的學(xué)...

    legendmohe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<