我通常输入命令db
以在Vim中向后移除一个单词。在没有空格的行的末尾执行此操作会留下单词的最后一个字符,因为光标开始从第二个最后一个字符中删除。
我可以按b
,然后按de
,但我发现连续多次这样做会让人感到困惑,从而导致不必要的错误。我希望有一种方法可以到达终点并向后移除最后一个单词。
有办法做到这一点吗?
答案 0 :(得分:7)
你应该训练自己停止使用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
视为(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'或者'',您将获得完全相同的结果。 This blog更深入地研究了文本对象。
答案 1 :(得分:2)
你可以:
使用这样的映射:
:nnoremap <silent> db :exe 'norm!' (col('.')==col('$')-1 ? 'daw' : 'db')<cr>
或者,你可以:set ve=onemore
进行一次
char越过行尾,然后在光标结束后(参见命令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')
位于底部
屏幕。
请参阅:h <silent>
。
<cr>
是返回键的关键代码。您可以将这种代码放在映射中。
在这种情况下,<cr>
将验证刚刚在映射中输入的命令
有关详细信息,请参阅:h keycodes
。
答案 2 :(得分:0)
怎么样?
void Start(){
Computer computer = new Computer ();
computer = new Disk (computer);
computer = new Monitor (computer);
print("You have a " + computer.Description () + ".");
}
$ - 带你到线的最后一个字符
d - 如你所知,是删除
我 - 暗示从里面。阅读有关其他强大文本对象$diw
的更多信息
w - word
如果您未使用:help text-objects
习惯,请开始使用。你会爱上它