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< 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< 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