在Vim中删除换行符

335
有没有办法在Vim中删除行末的换行符,使下一行接到当前行后面?例如:
Evaluator<T>():
    _bestPos(){
}
我想把这些内容放在一行上,而不是复制粘贴到前一行中。看起来我应该能够将光标移到每行的末尾,按下一个键,然后将下一行跳到光标所在的同一行。
最终结果:
Evaluator<T>(): _bestPos(){ }

Vim能够实现这个吗?


1
在vim的插入模式中,行末的Del键曾经对我有效。但并非在每个终端上都有效。 - Victor Sergienko
13个回答

706
如果你在第一行,按下(大写)J将会合并该行和下一行,并删除换行符。你也可以与数字结合使用,例如按下3J将会合并所有三行。

37
如另一个回答所述,gJ 命令会避免在使用 J 命令时 Vim 添加可能存在的空格。 - Michael Mior
12
您也可以使用“V”(可视化行模式)选择要合并的所有行,然后按“J”或“gJ”。 - Sbu
如果您想保留光标位置,请使用 :join:join!,它们将连接行并保持光标位置,并且不在连接点保留任何空格。您还可以像这样映射它:nnoremap <Leader>j :joing<cr>nnoremap <Leader>gj :join!<cr> - SergioAraujo

99

当然可以。Vim将\n字符识别为换行符,因此您可以直接搜索和替换。 在命令模式下输入:

:%s/\n/

1
谢谢,但我不想要全局搜索和替换。 - derekerdmann
21
去掉百分号就可以解决这个问题。这样它只会在光标所在的行发生。或者,您可以指定一个范围,例如::11,15s/\n/ (第11-15行)或:,+7s/\n/ (此行和接下来的七行)或:-3,s/\n/ (前三行和此行)...您明白了。 - Tristan
1
或者您可以选择一个 V 形块并在其上进行替换。 - Victor Sergienko

65

正如其他答案所提到的,一般可以使用大写的 J 和查找替换 \n 来去除换行符并连接行。

但是为了去除最后一行中的尾随换行符,你需要在 Vim 中执行以下操作:

:set noendofline binary
:w

1
这个问题是关于在文件中连接两行的内容 - 这个答案删除了文件末尾的换行符,这不是我所问的。 - derekerdmann
4
这对我很有用。我尝试使用vim去掉单行文件末尾的换行符。 - Locane
为什么没有 binary:set noendofline 就无法工作? - darw
5
虽然这不是OP的具体问题,但这正是我的问题。在进行一次互联网搜索后,我来到了这里,所以谢谢! - Ian Lovejoy
这是最简单的去除换行符的方法之一,适用于临时情况。巧妙的技巧,谢谢。 - Soundararajan

63

在正常模式下,按下Shift+j可以将光标移动到下一行的开头。

您也可以在前面添加一个数字计数,例如在顶部行输入3J,那么所有这些行就会被合并在一起。


32

J删除额外的前导空格(如果有的话),并将多行连接成一个单一的空格。(有些例外情况:在/[.!?]$/之后,可能会插入两个空格;在/^\s*)/之前,则不插入空格。)

如果您不需要这种行为,则gJ只是移除换行符,并且不对空格进行任何智能处理。


12
set backspace=indent,eol,start

在你的 .vimrc 文件中加入以下代码可以使你在插入模式下使用 backspacedelete 来处理换行符 \n

set whichwrap+=<,>,h,l,[,]

当光标在第一列时,使用X键可以在普通模式下删除上一个换行符。


10

以下内容都假设您的光标在第一行:

使用普通映射:

3Shift+J

使用Ex命令:

:,+2j

缩写为

:.,.+2 join

也可以通过以下快捷方式输入:

3:j

一个更短的 Ex 命令:

:j3

2
不要在它们之间加空格:j!3 - SergioAraujo

3

这可能取决于您的设置,但我通常使用A<delete>来完成此操作。

其中A是在行末添加。这可能需要nocompatible模式:)


3
"我通常使用A<delete>来做这件事。" 是的,这就是我来这里的原因;寻找一种更好的方法 ;)。Vim 的整个重点在于不需要将手移开自然位置。 - Luc

3
我会按A键(追加到行末,将您置于插入模式),然后在要删除换行符的行上按delete键。

很遗憾,这对我似乎不起作用;可能是我错过了PuTTY的某些设置。 - derekerdmann
2
可能是vi的退格选项::help 'backspace' - glenn jackman

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

光标在第一行

现在,在正常模式下执行以下操作:

shift+v
2j
shift+j

或者

V2jJ

:普通V2jJ


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