在Vim中删除换行符


271

有没有一种方法可以删除Vim中行尾的换行符,以便将下一行追加到当前行?

例如:

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

我想将所有内容放到一行上,而不要复制行并将其粘贴到上一行中。看来我应该能够将光标放在每一行的末尾,按一个键,然后使下一行跳到光标所在的同一行上。

最终结果:

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

Vim有可能吗?


在vim的插入模式下,行尾的Del曾经对我有用。但是,并非在每个终端中都如此。
维克多·谢尔琴科

Answers:


584

如果您在第一行,请按(大写)J将该行和下一行连接在一起,并删除换行符。您也可以将其与计数结合,因此按3J会将所有3条线结合在一起。


29
如另一个答案所述,gJ将避免添加Vim在使用时可能选择添加的空格J
Michael Mior 2014年

5
您还可以选择所有的线,你想用加入V(视线模式),然后按JgJ
SBU

如果要保持光标位置,请使用:join:join!这将使连接线保持光标位置,并且不要在连接点保留任何空格。您也可以像这样映射它:nnoremap <Leader>j :joing<cr>nnoremap <Leader>gj :join!<cr>
SergioAraujo

82

当然。Vim会将\ n字符识别为换行符,因此您只需搜索和替换即可。在命令方式下,输入:

:%s/\n/

1
谢谢,但是我不想在全球范围内搜索和替换。
derekerdmann

16
删除%就可以了。然后它只会在光标所在的行上发生。或者,您可以指定一个范围,例如:11,15s / \ n /(第11-15行)或:,+ 7s / \ n /(此行以及接下来的7行)或:-3,s / \ n / (之前的三行和这一行)...您明白了吗
Tristan 2010年

1
或者,您可以选择V-isual块并替换它。
维克多·谢尔琴科

51

在正常模式下位于上方时,按Shift+ j

您也可以添加一个计数,因此3J在最上面一行会将所有这些行连接在一起。


34

正如提到的其他答案一样,(大写)J和search + replace for \n通常可用于去除换行符并连接行。

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

:set noendofline binary
:w

1
问题是关于在文件中间连接两行-这个答案会删除文件末尾的换行符,这不是我要的。
derekerdmann '16

3
这对我有用。我试图用vim在单行文件的末尾消除换行符。
Locane

为什么:set noendofline没有不行binary
darw

32

J删除多余的前导空格(如果有),将行与单个空格连接。(但有一些例外:在之后/[.!?]$/,可以插入两个空格;在之前/^\s*)/,可以不插入空格。)

如果您不希望出现这种情况,gJ只需删除换行符,根本不做任何巧妙的空格操作。


10

以下所有条件均假定您的光标位于第一行:

使用法线映射:

3Shift+J

使用Ex命令:

:,+2j

这是的缩写

:.,.+2 join

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

3:j

甚至更短的Ex命令:

:j3

2
它们之间没有空格:j!3
SergioAraujo

10
set backspace=indent,eol,start

在您的.vimrc文件中,您可以在插入模式下使用backspaceand deleteon \n(换行符)。

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

将允许您使用X(在第1列中)在正常模式下删除以前的LF 。


2

这可能取决于您的设置,但是我通常使用 A<delete>

A在该行的末尾追加。它可能需要nocompatible模式:)


3
“我通常使用A <delete>来执行此操作。”是的,这就是为什么我来这里;寻找更好的方法;)。vim的全部重点并不是将您的双手从原位移开。
2014年


1

我只要在要删除换行的行上按A(追加到行尾,将您置于插入模式),然后按Delete键。


可悲的是,这似乎对我不起作用。这可能是我错过的腻子设置。
derekerdmann 2010年

2
可能是vi退格键选项::help 'backspace'
glenn jackman 2010年

1

如果您不介意使用其他Shell工具,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
有点过分,你不觉得吗?
derekerdmann

不,这不对。您为什么认为它的杀伤力太大?在Vim内部进行操作是手动的。这取决于您是想每次手动手工完成,还是只是执行这些衬纸才能轻松完成。Vim是一位编辑。基本上任何可以处理文件的工具都是伪装的“编辑者”。
ghostdog74

5
仅仅在vim中打开文件并使用它仍然更加容易ggVGJ
太多的php 2010年

当然,如果您发现每次需要以这种方式更改数据时,手工操作都比较容易。前进。另外,尝试在大文件上执行此操作。
ghostdog74

我没有处理大量文件;我只是在压缩几行代码。
derekerdmann 2010年

1

问题是不可见的char 0A(\ n)的倍数可能会累积。假设您要从第100行清理到最后:

键入ESC和:(终端指挥官)

:110,$s/^\n//

在vim脚本中:

execute '110,$s/^\n//'

说明:从110到最后搜索以换行开头的行(空白)并将其删除

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.