Beim Bearbeiten mit vim muss man oft Dinge in Anführungszeichen löschen. Das habe ich im Internet gefunden. Es gibt ähnliche di(, ci' usw., wie versteht man hier das 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