在Vim中删除换行符

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

Vim能够实现这个吗?


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

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
1
不,它不是过度的。你为什么认为它是过度的?在Vim内手动完成这项工作是费力的。这取决于你是想每次都手动完成,还是只需执行这些一行命令就能快速完成。Vim是一个编辑器。而任何能够处理文件的工具,基本上都是伪装成“编辑器”的工具。 - ghostdog74
5
还是在vim中打开文件并使用ggVGJ更简单。 - too much php
如果您发现每次需要以这种方式更改数据时手动操作更容易,请继续进行。同时,尝试在大文件上执行此操作。 - ghostdog74
我不是在处理一堆文件;我只是在压缩几行代码。 - derekerdmann
如果你不处理大文件,那么一个适用于大文件的解决方案是无关紧要的。但这并不意味着它不应该被提出! - Gene Callahan

1
问题在于不可见的多个字符0A (\n)可能会累积。假设您想要从第100行开始清理到结尾:
键入 ESC 和 : (终端命令)
:110,$s/^\n//

在 Vim 脚本中:
execute '110,$s/^\n//'

说明:从110到结尾,查找以新行(空白行)开头的行,并将其删除。

1
如果你只是想快速连接文本文件中的所有行,对于TinkerTank解决方案的微小改进是在你的.vimrc中添加以下内容:
nnoremap <leader>j :%s/\n/\ /g<CR>

这段代码会将换行符全局替换为空格,这样就不会出现一行的最后一个单词和下一行的第一个单词连在一起的情况。对于我典型的使用场景来说,这个方法非常完美。
如果您想要保留特意添加的段落分隔符,V):join 可能是最简单的解决方案。

1
你实际上正在回答一个不同的问题。如果你觉得你正在回答的问题还没有被问到,你可以在 https://vi.stackexchange.com/ 上打开它并自己回答。 - Cornelius Roemer
啊,但你回答了我的问题。所以+1。 - j0h

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