Vim 文本對象指南 (1)

本文還是介紹一些基本內(nèi)容, 關(guān)于插件使用, 可以查看完整配置 space-vim.


如果想要在 Vim 里擁有高效編輯的能力, 必然要掌握超過單個字符編輯的能力, 不然就可能出現(xiàn)像之前看到過的一個笑話 :

在你剛開始使用 Vim 的時候做過什么令你 “難忘” 的事情? 答: 使用
j 跳轉(zhuǎn)到 5000 行 :).

也就是說, 要掌握詞 (word), 句子 (sentense), 段落 (paragraph) 級別的編輯能力. 在 Vim 里, 這樣的概念叫做 文本對象 (text objects) . 詳見 Vim 的 help :h text-objects. 另外, 這些概念對于只是對英文表現(xiàn)比較好, 因為英文可以按照空格劃分詞, 但是中文并不可以.

本文的內(nèi)容實際很多來自 Vim 的 help. 如果開始知道不懂的時候去查看 Vim 的 help, 基本上也就真正知道如何學(xué)習(xí) Vim 了.

對于普通文本文件和常見程序語言結(jié)構(gòu), Vim 都提供了文本對象. 你可以通過 Vim script 定義新的文本對象.

一個編輯命令的結(jié)構(gòu)

在 Vim 中, 編輯命令 (editing commands) 有著如下的結(jié)構(gòu):

<number> <operator> <text object or motion>

<數(shù)字> <操作符> <文本對象或移動命令>

number: 數(shù)字用于在文本對象或移動操作上進(jìn)行多次執(zhí)行, 比如說, 向后 3 個單詞, 向前 2 個段落. 數(shù)字是可選的, 可以出現(xiàn)命令(command) 的前面,也可以放在命令的后面.

If the motion includes a count and the operator also had a count before it, the two counts are multiplied. For example: "2d3w" deletes six words.

如果是 motion 和下面所提到的 operator 都有數(shù)字修飾, 那么效果是兩個數(shù)字相乘. 比如, 2d3w 是刪除 6 個單詞.

operator: 操作符, 比如, change, delete (刪除), yank (復(fù)制). 操作符也是可選的. 但是如果沒有操作符的話, 那么就只剩一個移動命令, 而非一個編輯命令了.

:h operator, Vim 默認(rèn)提供的 operator 有:

operator

text object 或者 motion 可以是一個文本對象, 比如, 一個單詞, 一個句子, 一個段落, 或者是一個移動, 比如, 向下移動一行, 向后翻一頁, 到一行末尾.

:h text-objects :

text-objects

:h motion :

motion

一個編輯命令(editing command) 等于一個操作符加上一個文本對象或者移動, 比如, 刪除一個單詞, 改變一個句子, 復(fù)制一個段落.

an editing command = an operator + a text object/motion

普通文本對象

Vim 為普通文本文件提供了三種類型的文本對象: 詞(word), 句子(sentence), 段落(paragraph).

  • aw - a word (包含在周圍的空格)
  • iw - inner word (包括周圍的空格)
Lorem ipsum dolor sit amet...

daw

Lorem dolor sit amet...

a 開頭的文本對象包含周圍的空格, 以 i 開頭的文本對象不包含. 這個原則對所有的文本對象都適用.

w 看起來與 aw 效果差不多. 區(qū)別在于光標(biāo)位置. 比如, 如果用 dw 來刪除一個詞, 光標(biāo)必須在詞的開頭. 如果在除了開頭的其他位置使用 dw, 只能刪除部分單詞. 但是, daw 允許光標(biāo)在一個詞的任何位置刪除整個單詞.

w & aw

如果你已經(jīng)懂得了 word 的 w 與 aw 的區(qū)別, 下面句子與段落就已經(jīng)掌握了, 道理是一樣的, 只是將 w 換成了 s 與 p.

句子

  • as -- a sentence
  • is -- inner sentence
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

cis

 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.

注意, "inner" 文本對象不包含尾部的空格.

段落

  • ap -- a paragraph
  • ip -- inner paragraph
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis 
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

dap

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

移動命令 vs. 文本對象命令

  • 一個使用移動的命令, 比如, cw, 是從光標(biāo)處開始生效.
  • 一個使用文本對象的命令, 比如, ciw, 如果光標(biāo)在何處, Vim 都將在整個文本對象上生效.

是一個移動命令還是一個文本對象命令, 區(qū)別在于是否有 a (around) 或者 i (inner) 這樣的限制. 對于每個類型的文本對象都是如此. 盡管使用文本對象的方式需要多輸入一個字符, 但是這可以節(jié)省你的時間將光標(biāo)移動到 "正確" 的位置.

參考:
[1] Vim Text Objects: The Definitive Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 下面是一篇舊文,大多是一些已有知識的整理,并不太成熟。歡迎關(guān)注專欄 space-vim , 有空我會以 Vim 自...
    liuchengxu閱讀 668評論 0 8
  • 命令歷史 以:和/開頭的命令都有歷史紀(jì)錄,可以首先鍵入:或/然后按上下箭頭來選擇某個歷史命令。 啟動vim 在命令...
    im螞蟻閱讀 30,826評論 3 48
  • vim 選擇文本,刪除,復(fù)制,粘貼 文本的選擇,對于編輯器來說,是很基本的東西,也經(jīng)常被用到,總結(jié)如下: v 從...
    壹首簡單的歌閱讀 889評論 0 7
  • 應(yīng)讀者要求,圖片已更新,更清楚了撒 第一講 第一講小結(jié) 光標(biāo)在屏幕文本中的移動既可以用箭頭鍵,也可以使用 hjkl...
    Gaolex閱讀 4,012評論 18 153
  • 一.首先我們用 imageView 加載類似上面的動態(tài)圖 直接上代碼截圖: 二.利用 webView 加載上面的動...
    goodthing閱讀 1,998評論 0 2