在vim中,与换行符相反的是什么?

4
在vim中,是否有一个命令可以删除光标后面的换行符和所有空白字符?
例如,当我在插入模式下在文本的中间按Enter时,有没有一个命令可以撤销刚才所做的操作?
A)一个例子:
"some code{ in here }"

B) 按下回车键后:

"some code{
   in here }"

现在按下退格键将删除一个缩进空格。我更希望它删除所有缩进,并跳回到A。

是否可以通过命令或对退格键进行重新映射来实现此操作?


1
在命令模式下,'u' 会撤销上一个操作;但不确定您是否需要某个东西来删除事后任意的换行符。 - Eterm
相关链接:https://vi.stackexchange.com/questions/698/deleting-groups-of-autoindents-in-insert-mode - user202729
5个回答

9

很遗憾,J 命令是多数人不知道的。它可以在正常模式下连接多行文本。

在插入模式下,您可以按两次 <C-U> 键。第一次删除光标前面的缩进,第二次将光标所在行与前一行连接。请注意,这需要:

:set backspace=indent,eol,start

谢谢,我会多练习使用J语言,它似乎是一个强大的命令,值得记在肌肉记忆中。 - mollerhoj

5

你是否尝试过使用 J (大写字母)?它会给你想要的结果。

"一些代码{ 在这一行上有光标,按J

在这里 }"


1
你可以使用 ᴇꜱᴄKShift+JK 可以跳转到上一行,Shift+J 可以将两行连接。
然而,如果缩进和语法配置正确,按下退格键不仅会删除一个空格,还会删除整个前面的缩进块。

你知道当前的编辑(和原始文本)看起来不像“Esc”,而是“E<一些有趣的字符>s”(我正在使用Firefox)。 - 244an
@KonradRudolph - 对于我之前的无效编辑,我表示道歉(这绝对不是我的意图),但事实确实如244an所说。在Firefox中,esc看起来并不像一个转义字符,在vim 7.3中,K也不能跳转到上一行。帮助文档中关于K的解释是:“运行一个程序来查找光标下的关键字”。 - Lieven Keersmaekers
@244an,你的字体似乎缺少了一些字符。我正在使用“SMALL CAPITAL”Unicode 字符。 - Konrad Rudolph
@Lieven 我并没有使用字符 K 而是 键盘上的按键“K”。这是表示键盘按键的标准惯例。请看一下你的键盘:上面的按键都用大写字母标注。这就是我后来使用 “Shift” 的原因。 - Konrad Rudolph
@KonradRudolph - 好的,但vim帮助文件没有使用那个标准约定,它使用大写字符来表示隐含的shift。总的来说,这让我想起了Steve Krug所说的不要让我思考。我们真的应该在喝一杯时认真讨论这个问题。 ;) - Lieven Keersmaekers
1
@Lieven Vim 的帮助文件没有一种标记键盘按键的方法。他们使用“变通方法”以最小的格式呈现纯文本中的按键。我们在这里没有这种限制。但我随时准备好喝一杯并讨论。;-) - Konrad Rudolph

1
一种简单的方法是向上移动一行,到达该行末尾并删除。只要您仍处于插入模式,它就会像大多数其他编辑器一样在最后位置删除时执行与J相同的操作。对我来说,这是最快的替代方法,因为我已经习惯了其他编辑器的操作方式。
也就是说:EndDelete(仍处于插入模式时)
一个快速的替代方法(VIM方式)是(仍处于插入模式时):
Ctrl+oJ
(在插入模式中使用Ctrl+o输入一个普通模式命令。)

0

还可以使用退格键的重新映射:

inoremap <expr> <bs> getline('.')[:col('.')-2]=~'^\s\+$' ? "<c-u><c-u>" : "<bs>"

请注意,此映射完全覆盖退格键的正常行为。只有在您不打算使用其正常行为时才会有用。如果可以轻松访问其他选项(c-u或J),则不建议使用此选项。
但是,(据我所知)没有办法区分手动添加的前导空格和自动缩进。如果使用noexpandtab,您可以编辑正则表达式以仅匹配制表符。
在某些自动缩进模式中,这也无法正常工作(例如,在C中的块注释中,vim自动开始一个以*开头的新行)。

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