繁体   English   中英

将光标移动到vim中的行尾(删除最后一个单词)

[英]Move cursor to end of line in vim (to delete last word)

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

我可以按b代替de代替,但我发现这有时令人困惑,连续多次这样做会导致不必要的错误。 我希望有一种方法可以到达终点并向后移除最后一个单词。

有没有办法做到这一点?

你应该训练自己停止使用db并学习爱文本对象。 即使您不在一行的末尾,也会发生此问题。

foo bar baz
      ^

然后d b会给

foo r bax
    ^

而不是使用dbde甚至dw ,训练自己使用diwdaw 这可能需要一些人习惯,但在路上它将变得自然并且使用起来更方便。 一旦文本对象变得自然,您就可以开始使用其他命令( 'c''y'等)甚至其他文本对象。 (我甚至无法计算我使用dapci(

对于这些做什么的简短解释,将diw视为(d)elete (i)nside this (w)orddaw as (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”,您将获得完全相同的结果。 本博客更深入地介绍了文本对象。

你可以:

  • 使用这样的映射:

     :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

  • <silent>使映射保持沉默:没有它你会看到:exe 'norm!' (col('.')==col('$')-1 ? 'daw' : 'db') :exe 'norm!' (col('.')==col('$')-1 ? 'daw' : 'db')在屏幕的底部。
    请参阅:h <silent>

  • <cr>是返回键的关键代码。 您可以将这种代码放在映射中。 在这种情况下, <cr>将验证刚刚在映射中输入的命令。
    有关详细信息,请参阅:h keycodes

关于什么

$diw

$ - 带您到该行的最后一个字符
d - 如你所知是删除
我 - 暗示从里面。 阅读有关其他强大文本对象的更多信息:help text-objects
w - 字

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM