【问题标题】:Move cursor to end of line in vim (to delete last word)将光标移动到 vim 中的行尾(删除最后一个单词)
【发布时间】:2018-09-21 14:10:16
【问题描述】:

我通常在 Vim 中键入命令db 以向后删除一个单词。在没有空格的行尾执行此操作会留下单词的最后一个字符,因为光标开始从倒数第二个字符移开。

我可以按b,然后按de,但我有时会在连续多次这样做时感到困惑,从而导致不必要的错误。我希望有一种方法可以走到行尾并向后删除最后一个单词。

有没有办法做到这一点?

【问题讨论】:

  • 你可以试试:nnoremap db dbx:nnoremap db bde。不过,可能会带来一些你不喜欢的副作用。
  • @ChristianGibbons ,不错的主意。重新映射到bde 不会影响太多功能(仅在我认为删除部分单词时)。然而dbx 会覆盖使用db 的功能,通常总是删除一个额外的空格或偶尔删除一个额外的字符,这使得它更难使用。

标签: vim editor


【解决方案1】:

您可以:

  • 使用这样的映射:

    :nnoremap <silent> db :exe 'norm!' (col('.')==col('$')-1 ? 'daw' : 'db')<cr>
    
  • 或者,您可以使用:set ve=onemore,这样您就可以选择一个 字符超过行尾,然后一旦光标超过行尾(参见命令g$),只需使用db

编辑(解释)

  • :exe 将由其参数形成的字符串作为命令执行。 因此,如果光标位于行尾 (col('.')==col('$')-1), 它将执行:

    :norm! daw
    

    否则会执行:

    :norm! db
    
  • :norm 允许您在命令行中运行普通命令。例如,如果您已经在 正常模式下,输入 :norm db + return 与输入 db 的效果相同。 它在命令内部很有用。 ! 禁止在 :norm 命令中使用映射。
    :h :norm

  • &lt;silent&gt; 使映射静默:没有它你会看到 :exe 'norm!' (col('.')==col('$')-1 ? 'daw' : 'db') 在底部 屏幕。
    :h &lt;silent&gt;

  • &lt;cr&gt; 是返回键的键码。您可以将此类代码放入映射中。 在这种情况下,&lt;cr&gt; 将验证刚刚在映射中输入的命令。
    详情请见:h keycodes

【讨论】:

  • 这似乎是一个非常针对我的问题的解决方案,正如它所陈述的那样,而且很有趣,但我不确定我是否理解它。你能解释一下重新映射是如何工作的,特别是&lt;silent&gt;exe 'norm!'&lt;cr&gt; 的作用吗?我以前从未使用过重映射,我很难在文档中找到所有详细信息。
  • 很好的解释!我觉得这完美地回答了我的问题,而@dlmeetei 的回答可能是更好的解决方法。
  • 我之前的意思是说@DJMcMayhem,因为它更好。但我猜他们的答案是一样的。
  • 虽然这个答案是对您问题的具体答案(当然也是一个有效的答案),但它不是您需要的答案。我强烈推荐使用 DJ 的解决方案!
  • 我刚刚意识到这并不能解决句尾空格的问题。在行尾映射到bd$bdaw 而不是daw 可以解决这个问题,对吧?
【解决方案2】:

你应该训练自己停止使用db,而学会爱上文本对象。即使您不在行尾,也会出现此问题。

foo bar baz
      ^

然后 db 会给出

foo r bax
    ^

训练自己使用diwdaw,而不是使用dbde 甚至dw。这可能需要一些时间来适应,但以后它会变得自然并且使用起来更方便。一旦文本对象对您来说变得自然,您就可以开始使用其他命令('c''y' 等)甚至其他文本对象。 (我什至无法计算我使用了多少次dapci(

要简要说明这些功能的作用,请将diw 视为(d)elete (i)nside this (w)ord,将daw 视为(d)elete (a)round this (w)ord(d)elete (a) (w)ord。举个更具体的例子:

foo bar baz
          ^

输入diw 给出

foo bar 
       ^
(note the leading space)

但是

foo bar baz
          ^

输入daw 给出

foo bar
      ^

只要你的光标在同一个词上,它们仍然会做同样的事情。因此,如果我们将光标移回“a”或“b”,您将得到完全相同的结果。 This blog 更深入地研究文本对象。

【讨论】:

    【解决方案3】:

    怎么样

    $diw
    

    $ - 带你到行的最后一个字符
    d - 如您所知,用于删除
    i - 从内部暗示。阅读有关其他强大文本对象的更多信息:help text-objects
    w - 单词

    如果您不习惯使用text-objects,请开始使用。你会喜欢的

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 2011-06-30
      • 1970-01-01
      • 2021-11-21
      • 2014-02-22
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多