搜索

首页  >  问答  >  正文

vim下怎么解释 di" 这个命令?

vim编辑的时候经常要删除引号内的东西,网上查到了是这个。类似的还有
di( , ci'等,这里的i怎么理解呢?

高洛峰高洛峰2774 天前963

全部回复(3)我来回复

  • 阿神

    阿神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"

    回复
    0
  • 巴扎黑

    巴扎黑2017-05-16 16:45:05

    d是删除,i差不多是in的意思,连起来就是,删除那些在两个引号之间的字符。

    相应的还有 di' di( di< di{ .....

    d也可以换成c。

    还有类似的 daw das dap : 删除一个单词/句子/段落。

    回复
    0
  • 为情所困

    为情所困2017-05-16 16:45:05

    要理解这个命令需要理解一些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

    回复
    0
  • 取消回复