vim下怎么解释 di" 这个命令?
高洛峰
高洛峰 2017-05-16 16:43:05
0
3
956

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板