什么是vim中类似于emacs的ctrl-k的功能?

6

在vim的插入模式下,如何从当前光标位置删除至行尾?

我知道在命令模式下可以使用D实现此功能,并且我知道在插入模式下可以使用ctrl-u从光标位置删除至行开头,所以我猜这应该是可能的。


好的,是 D。问题是什么? - Don Reba
1
我想要D,但是在插入模式下。 - outis
8
我认为最好的解决方案是通过按下ESCC-O回到“正常”模式,即使你真的想留在插入模式下。不要害怕离开插入模式。在那里你只能进行插入操作,大部分时间应该呆在正常模式下。否则就应该把插入模式称为正常模式 :) - Kent
4个回答

7
如果您处于插入模式并且想执行单个正常模式命令,则可以按以下组合键:Ctrl+o。执行完正常模式命令后,您将返回到插入模式。因此,您可以像这样使用DCtrl+oD

1
这可以通过 inoremap <C-k> <C-o>D(我想)简化为单个键组合。 - ams
2
正如@Kent所说,Ctrl+k对于双字母组合很有用,因此其他映射可能是更好的选择。 - Xophmeister
你上一次使用双字母符号是什么时候? - ams
我经常使用它们,但我想这取决于OP! - Xophmeister
我是说,投了这个答案...我以为是@ams发的..抱歉。 - Kent
显示剩余4条评论

0

在VIM中没有内置的方法来实现这个功能,但是你可以使用以下映射来在VIM中使用Ctrl+k,就像在Emacs中一样:

inoremap <C-k> <Del>

然而,如果你想要使用VIM内置的双字符功能来编写特殊字符,你应该使用不同的按键绑定,比如。


我不需要这个映射,它禁用了默认的 digraphs - Kent
那么只需使用不同的映射即可。提问者要求CTRL+k,但您可以使用任何其他映射,如CTRL+d。 - Alain M. Lafon
好的...但是你如何使<del>删除当前位置和EOF之间的内容?顺便说一句,在插入模式下,ctrl-dctrl-k更有用,它可以处理缩进。 - Kent
@Kent 这不是问题所在。问题是“从当前光标位置到行末”。你可以通过在VIM命令模式下按DG来实现删除到行末。 - Alain M. Lafon
+1 对于这个答案 -- 很高兴知道它实际上不可能,所以我不会继续寻找,重新映射的建议也很有帮助。 - outis
1
@Munen <Del>键是否删除“从当前光标位置到行尾”的内容?还是我漏掉了什么? - Kent

0

据我所知,没有内置的等效功能。

从插入模式中最简单的方法是使用 Ctrl-O D

如果您想将其映射到更容易记住的内容,您可以创建一个插入模式映射,这将允许您使用正常模式 D 命令删除光标下的字符直到行末:

:inoremap <Leader>k <C-O>D

假设 <Leader> 是默认的 \,你可以在插入模式下键入\k来调用映射。

虽然肯特在评论中指出插入模式映射并非没有缺点,但它们确实有它们的用处。

Ctrl-K 在 Vim 中用于输入 digraphs。我建议您不要尝试重新映射它,尽管使用上面的技术是可能的。


1
@downvoter:您能指出我如何改进我的答案吗? - johnsyweb
1
我不会在SO上对任何答案进行负评,但我猜你的回答存在一些问题。1、使用C-O时,在映射中不需要使用ESC。有了那个ESC,你就会回到NORMAL模式。2、我总是很小心地处理INSERT映射,有时候很难找到一个合适的插入模式映射。例如,如果你的<Leader>\,有人想要输入/编辑Windows路径:c:\\some\path\kill bill\...,我想你已经看出问题了。另外,如果你的Leader,(逗号),在插入模式下也经常使用,k - Kent
@Kent:谢谢。我不知道为什么会添加<Esc>。已经删除了。你对插入模式映射的缺点的担忧确实是有道理的! - johnsyweb

0
如果您还想在命令行模式下将 <C-k> 绑定到 kill-line,可以使用 getcmdline()getcmdpos() 函数:
cnoremap <C-k> <C-\>e(" ".getcmdline())[:getcmdpos()-1][1:]<CR>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接