天天看點

Vim技能修煉教程(4) - 基本功

前面我們學會了插件管理器和如何實作文法高亮,相信大家已經從中體會到了vim插件的強大功能。現在,是時候回來補一補基本功了。

vi有三種主要模式,正常模式,插入模式和可視化模式。正常我們推薦的方式是所有的移動指令隻在正常模式下進行,隻有在修改的時候再進入插入模式。

這個切換是如此頻繁,是以vi提供了很多快速切換模式的指令。vim的難學之處之一就是指令太多。

如《practical vim》中第8條所說,正常模式和插入模式的切換,可以為撤銷編輯帶來友善。在沒有模式切換的文本編輯器中,編輯器是很難确實您撤銷一次是打算撤銷一個字元,或者是一個單詞還是更大的粒度。而在vi中,這不是問題,在輸入時進入插入狀态,輸入結束了就esc退回正常模式。這一過程就構成了一次可撤銷的動作。

h: 向左一個字元

l: 向右一個字元

0: 移動到行首

^: 移動到行首第一個非空的字元

$: 移動到行尾

g_: 移動到行尾第一個非空的字元

列号|: 精确移動到列号

j: 向下一行

k: 向上一行

也可以用emacs的c-n和c-p來上下翻。

g: 跳到第n行,預設跳到行尾。

gg: 跳到第1行

+: 到下一行的第一個字元

-: 到上一行的第一個字元

``:g跳轉之後,跳回原來的行

'': 功能同``,但是停在行首

vi還支援跳轉的書簽功能,使用m[a-z]指令,可以定義26個書簽。

m{書簽名}: 定義書簽

`{書簽名}:跳轉到書簽定義時的光标位置

'{書簽名}: 跳轉到書簽定義位置的行首

w: 按單詞移動,标點符号也算一個單詞

w: 按單詞移動,标點符号算在單詞内

e/e: 移動到單詞結尾(大寫忽略标點符号)

b/b: 按單詞向前移動(大寫忽略标點符号)

c-f 向前一屏

c-b 向後一屏

c-d : 向前半屏

c-u: 向後半屏

c-e: 螢幕上滾一行

c-y: 螢幕下滾一行

z: 光标移至螢幕頂

z.: 光标移至螢幕中心并滾屏

z-: 光标移至螢幕底并滾屏

c-l: 重繪螢幕

h: 移至螢幕第一行

m: 移至螢幕中間

l: 移至螢幕底部

i: 在光标前插入字元

a:在光标後插入字元

a: 在一行的結尾處插入字元,相當于$a組合。

i: 在一行的開頭插入字元,相當于^i組合。

o: 在光标的下一行新開一行進行插入,相當于a

o: 在光标的上一行新開一行進行插入,相當于ko

s: 删除光标處的字元再進行插入

s: 删除光标所在行再進行插入

r: 替換目前字元

r: 替換目前行的字元,可以提前esc退出,相當于^c

c: 更新文本,就是先删除部分文本再插入

cw: 更新目前單詞

c2b: 更新光标之前的兩個單詞

c$: 更新光标處到行尾

c: c$的簡寫

c0: 更新光标處到行首

cc: 更新行,跟s效果一樣

在繼續學習更多指令之前,我們先看一下vi指令之是以強大的原因,因為vi的指令并不僅僅是簡單的單獨指令,而是可以進行組合。

vi指令的一般格式是:{指令}{次數}{文本移動指令} 或者 {次數}{指令}{文本移動指令}

上面學習的c指令就是很好的例子,比如c2b,c是指令,2是兩次,b是後退

同樣,對于用于删除的d指令,删除目前單詞,就把cw換成dw就可以了。d$是删除從光标到行尾。與c是c$的别名一樣,d是d$的别名。

複制指令y,也是同樣的用法。

在vim中,文本移動指令被擴充成文本對象。

最常用的文本對象指令有:

aw: a word,單詞不計空格

iw: inner word, 單詞,計空格

as: a sentence,一句

is: inner sentence

ap: a paragraph,一段

ip: inner paragraph

a" a' a`: 一個字元串

p/p: 指令用于粘貼用d指令或y指令剪切或複切的文本

~: 切換大小寫

. : 重複上一條指令

u: 撤銷上一條指令

u: 将一整行恢複到原來的狀态

vi推薦主要工作時間都停留在正常模式,但是如果您非習慣于在編輯模式進行編輯,vim也是提供在這個模式下工作的指令的。

比如,我們最經常發生的事情就是輸錯了字元要修改。

這時候我們有三大利器可以使用:

c-h: 倒退删除前一個字元

c-w: 删除前一個單詞

c-u: 删除到行首

另外,我們還可以通過c-o + 正常模式的指令這種方式來節省切換的動作。

"/"用來進行向下搜尋,"?"則是向上搜尋。搜尋下一個用n,上一個用n.

vi的強大之處在于,搜尋的結果仍然可以跟其他指令結合,比如跟d結合删除。

除了全文搜尋,行内搜尋也是快速編輯的有效手段。以vi的風格,也是為我們提供了多種行内搜尋的方法:

f{字元}:向後搜尋字元

f{字元}:向前搜尋字元

t{字元}:向後搜尋字元,不過定位在該字元之前的字元上

t{字元}:向前搜尋字元,定位在該字元之前的字元上

;:重複上一次的搜尋,方向相同

, : 重複上一次的搜尋,方向相反

搜尋仍然是可以跟操作指令結合,比如df{字元},删除到某字元為止的内容。

當我們使用d指令删除一段文本時,它們會被依次存入0-9号這10個緩沖區中。除了這10個自動緩沖區之外,vi還支援a-z一共26個命名的緩沖區。

我們使用雙引号"用來訓示對緩沖區的通路。比如:"2p,将2号緩沖區的内容粘貼到目前光标處。

不過,記住自動放到哪個緩沖區位置還是一件反人類的事情,更好的辦法是,使用命名的緩沖區。vi提供了26個指令緩沖區,分别用a-z 26個字母表示。

從此我們的剪切、複制和粘貼的功能就更豐富了。比如"add,将目前行剪切放入a緩沖區。粘貼時使用"ap。再如:"b10yy,将目前開始的10行複制到b緩沖區。

vi作為一個功能過剩的編輯器,當然不隻這麼簡單了。它還支援對于緩沖區的内容進行追加,方法很簡單,使用緩沖區的大寫字母名移,比如"byy,将目前行追加到b緩沖區内容的末尾。

這個黑科技太好玩了,如果光标處是一個數字的話,可以通過c-a來對其進行+1操作,c-x進行-1.

如果要多加減幾次,就先給個數字就好了。

這還不夠黑科技,c-a和c-x還有搜尋功能,如果目前光标不是一個數字,vim會先搜尋到下一個數字,再對其進行操作。對于大量數字文本要操作的情況,實在是太友善了。