vim編輯的時候常常要刪除引號內的東西,網路上查到了是這個。類似的還有 di( , ci'等,這裡的i怎麼理解呢?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
i表示inside,可參考vim中:help object-select
:help object-select
比如說有這麼字串"testdfat"
"testdfat"
假設遊標停留在第一個t位置
di"
""
dta
a
"at"
dfa
"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,特殊的包括指令a 和i (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
i表示inside,可參考vim中
:help object-select
比如說有這麼字串
"testdfat"
假設遊標停留在第一個t位置
di"
:delete all content inside ",结果字符串为""
dta
:delete all content toa
,结果字符串为"at"
dfa
:delete all content from current location, untila
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,特殊的包括指令a 和i (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