vim下怎麼解釋 di" 這個指令?
高洛峰
高洛峰 2017-05-16 16:43:05
0
3
962

vim編輯的時候常常要刪除引號內的東西,網路上查到了是這個。類似的還有
di( , ci'等,這裡的i怎麼理解呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(3)
阿神

i表示inside,可參考vim中:help object-select

比如說有這麼字串
"testdfat"

假設遊標停留在第一個t位置

  • di":delete all content inside ",结果字符串为""
  • dta:delete all content to a,结果字符串为"at"
  • dfa:delete all content from current location, until a is found,结果字符串为"t"
巴扎黑

d是刪除,i差不多是in的意思,連起來就是,刪除那些在兩個引號之間的字元。

對應的還有 di' di( di

d也可以換成c。

還有類似的 daw das dap : 刪除一個單字/句子/段落。

为情所困

要理解這個指令需要理解一些VIM的基本概念:
1. operator: VIM提供很多指令(操作子)用來對文字進行修改或編輯的操作,這些操作子本身只是一個行為,例如d 是刪除(delete),c是修改(change),但是這些操作符需要知道自己作用的對象,所以我們需要一個方法提供給它一個文字對象。你可以把這些操作符理解為一個函數,這個函數接收一個文字物件進行處理。說明文件請參閱 help: operator
2. text-objects: 根據名字來理解就是一個文字對象,這就是要傳給operator的那個參數。 VIM提供了一些方法去選取一些文字作為text-objects,特殊的包括指令ai (a 和i 不是進入insert mode嗎?這個在後面會解釋),其中i表示"inner" , 例如'hello, w^orld',(^表示遊標位置),那麼i'就會選取單引號內部hello, world, a' 會選取包含單引號的整個內容。更多說明請參考文件help: text-objects
3. motion:表示移動,這也是學習VIM最早接觸的東西,h,j,k,l等。而其實每個移動的指令都會覆蓋一個文字區域,而這個文字區域也可以作為一個text-objects,例如5w移動了5個word,這5個word這時候其實是可以作為一個text-objects傳遞給operator的,例如:d5w,會刪除5個word。更多說明請參考文件help: motion
4. operator-pending mode: 都知道VIM有很多種mode,最先了解的也就是normal mode, insert mode, command mode這幾種。從名字上理解這個模式表示有一個operator處於pending狀態,為什麼會有這個狀態是因為你使用了1中所說的operator,這個operator需要一個文字物件作為參數,它這時候正等著你給它一個這樣的對象,這時候可以透過2或則3的指令來實現,這也是為什麼此時a和i不會進入insert mode的原因,因為這時候VIM不是normal mode,而在另一個mode。你可以設定set showcmd來讓VIM顯示目前的指令,如果是operator-pending mode的話,你會看到VIM狀態列會顯示出這個指令。當把該operator所需要的參數傳遞給它後,VIM執行完該指令就會回到normal mode中。

此時來理解di'就很容易了:
- d: VIM接受指令delete,進入operator-pending mode
- i': 以目前遊標位置為座標,選擇單引號當中的文字作為要刪除的物件傳遞給d

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板