ChatGPT解决这个技术问题 Extra ChatGPT

在 Vim 中删除换行符

有没有办法在 Vim 中删除一行末尾的换行符,以便将下一行附加到当前行?

例如:

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

我想把这一切放在一行上,而不是复制行并将它们粘贴到上一行。似乎我应该能够将光标放在每行的末尾,按一个键,然后让下一行跳到光标所在的同一行。

最终结果:

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

这在 Vim 中可行吗?

在 vim 的插入模式下的行尾 Del 曾经为我工作。不过,并非在每个航站楼。

T
Tuna

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


如另一个答案所述,gJ 将避免添加 Vim 在使用 J 时可能选择添加的空格。
您也可以使用 V(可视线路模式)选择要加入的所有线路,然后按 JgJ
如果您想保持光标位置,请使用 :join:join!,它们将连接保持光标位置的行,并且在连接点处不保留任何空间。您也可以将其映射为:nnoremap <Leader>j :joing<cr>nnoremap <Leader>gj :join!<cr>
T
TinkerTank

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

:%s/\n/

谢谢,但我不想要全局搜索和替换。
删除 % 可以解决这个问题。然后它只会发生在光标所在的行上。或者,您可以指定一个范围,例如 :11,15s/\n/(第 11-15 行)或 :,+7s/\n/(这一行和接下来的七行)或 :-3,s/\n/ (前三行和这一行)......你明白了
或者您可以选择一个 V-isual 块并替换它。
M
Mateusz Piotrowski

在正常模式下在上线时,按 Shift+j。

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


N
Néstor Waldyd

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

但是为了去掉最后一行的尾随换行符,你需要在 Vim 中这样做:

:set noendofline binary
:w

问题是关于在文件中间连接两行 - 这个答案删除了文件末尾的换行符,这不是我问的。
这对我有用。我试图用 vim 在单行文件末尾删除换行符。
为什么没有 binary :set noendofline 不起作用?
虽然这不是 OP 的具体问题,但这是我的问题,互联网搜索让我来到这里,所以谢谢!
这是为临时案例删除新行的最简单方法之一。巧妙的技巧,谢谢。
e
ephemient

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

如果您不希望这种行为,gJ 只需删除换行符,并且根本不会对空格做任何聪明的事情。


l
laktak
set backspace=indent,eol,start

在您的 .vimrc 中将允许您在插入模式下在 \n(换行符)上使用 backspacedelete

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

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


k
kzh

以下所有内容都假设您的光标位于第一行:

使用法线映射:

3Shift+J

使用 Ex 命令:

:,+2j

哪个是缩写

:.,.+2 join

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

3:j

一个更短的 Ex 命令:

:j3

它们之间没有空格 :j!3
W
Wolph

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

其中 A 附加在行尾。它可能需要 nocompatible 模式:)


“我通常用 A 来做这个” 是的,这就是我来这里的原因;找到更好的方法;)。 vim 的重点不是将您的手从主行移开。
D
David Watson

我只需在要删除换行符的行上按 A(附加到行尾,使您进入插入模式),然后按删除。


可悲的是,这似乎对我不起作用。这可能是我错过的 PuTTY 设置。
可能是 vi 退格选项::help 'backspace'
I
Ivan Lopes
<CURSOR>Evaluator<T>():
    _bestPos(){
}

光标在第一行

现在,在正常模式下

shift+v
2j
shift+j

或者

V2jJ

:普通 V2jJ


g
ghostdog74

如果您不介意使用其他 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

这有点矫枉过正,你不觉得吗?
不,这不对。为什么你认为它矫枉过正?在 Vim 中进行操作是手动的。这取决于您是想每次都手动手动完成,还是只执行这些衬垫以快速完成。 Vim 是一个编辑器。而任何可以处理文件的工具,基本上都是变相的“编辑器”。
只需在 vim 中打开文件并使用 ggVGJ 就更容易了。
当然,如果您发现每次需要以这种方式更改数据时手动操作更容易。前进。另外,请尝试在大文件上执行此操作。
我不是在处理一堆文件;我只是在压缩几行代码。
S
Sergio Abreu

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

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

:110,$s/^\n//

在 vim 脚本中:

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

说明:从 110 到结尾搜索以新行开头的行(空白)并删除它们


T
Theo Moolenaar

如果您只是想快速连接文本文件中的所有行,对 TinkerTank 的解决方案的一个非常小的改进是在您的 .vimrc 中包含类似的内容:

nnoremap <leader>j :%s/\n/\ /g<CR>

这将全局替换换行符,这意味着您不会将一行的最后一个单词连接到下一行的第一个单词上。这非常适合我的典型用例。

如果您想保留有意的段落分隔符,V):join 可能是最简单的解决方案。


你真的在回答一个不同的问题。如果您觉得您要回答的问题没有被问到,您可以在 vi.stackexchange.com 上打开它并自己回答。
啊,但是你回答了我的问题。所以+1。