阿神2017-05-16 16:45:05
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"
巴扎黑2017-05-16 16:45:05
d是删除,i差不多是in的意思,连起来就是,删除那些在两个引号之间的字符。
相应的还有 di' di( di< di{ .....
d也可以换成c。
还有类似的 daw das dap : 删除一个单词/句子/段落。
为情所困2017-05-16 16:45:05
要理解这个命令需要理解一些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