[英]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
^
而不是使用db
或de
甚至dw
,训练自己使用diw
和daw
。 这可能需要一些人习惯,但在路上它将变得自然并且使用起来更方便。 一旦文本对象变得自然,您就可以开始使用其他命令( 'c'
或'y'
等)甚至其他文本对象。 (我甚至无法计算我使用dap
或ci(
)
对于这些做什么的简短解释,将diw
视为(d)elete (i)nside this (w)ord
和daw
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.