有没有办法删除Vim中一行末尾的换行符,以便下一行附加到当前行?
例如:
Evaluator<T>():
_bestPos(){
}
我想将这一切都放在一行而不复制行并将它们粘贴到上一行。看起来我应该能够将光标放到每一行的末尾,按一个键,让下一行跳到光标所在的同一行。
最终结果:
Evaluator<T>(): _bestPos(){ }
这可能在Vim吗?
答案 0 :(得分:532)
如果你在第一行,按(大写) J 将连接该行和下一行,删除换行符。您也可以将其与计数结合使用,因此按3J
会将所有3条线组合在一起。
答案 1 :(得分:72)
当然可以。 Vim将\ n字符识别为换行符,因此您只需搜索和替换即可。 在命令模式下输入:
:%s/\n/
答案 2 :(得分:48)
在正常模式的上面一行,点击 Shift + j 。
您也可以添加一个计数,因此顶行的3J
会将所有这些行连接在一起。
答案 3 :(得分:32)
J
删除额外的前导间距(如果有),使用单个空格连接线条。 (除了一些例外:在/[.!?]$/
之后,可以插入两个空格;在/^\s*)/
之前,不插入空格。)
如果您不想要这种行为,gJ
只会删除换行符,并且根本不会使用空格做任何事情。
答案 4 :(得分:21)
正如其他提到的答案一样,(大写)J
和\n
的搜索+替换通常可以用来删除换行符并连接行。
但是为了摆脱最后一行中的尾随换行符 ,你需要在Vim中执行此操作:
:set noendofline binary
:w
答案 5 :(得分:10)
以下所有假设您的光标位于第一行:
使用普通映射:
3 移 + Ĵ
使用Ex命令:
:,+2j
这是
的缩写:.,.+2 join
也可以通过以下快捷方式输入:
3 : Ĵ
更短的Ex命令:
:j3
答案 6 :(得分:4)
delete
你的.vimrc中的允许你在插入模式下\n
(换行符)上使用set whichwrap+=<,>,h,l,[,]
和X
。
M = matrix(c(.3,.2,.1,0), nrow=4, ncol=5)
M 1 2 3 4 5
1 .3 .3 .3 .3 .3
2 .2 .2 .2 .2 .3
3 .1 .1 .1 .1 .1
4 0 0 0 0 0
将允许您使用 V
.4
.3
.25
.1
在正常模式下删除之前的LF(在第1列中)。
答案 7 :(得分:2)
这可能取决于您的设置,但我通常使用A<delete>
其中A
附加在该行的末尾。它可能需要nocompatible
模式:)
答案 8 :(得分:2)
<CURSOR>Evaluator<T>():
_bestPos(){
}
光标在第一行
现在,在NORMAL MODE中
shift+v
2j
shift+j
或
V2jJ
:正常的V2jJ
答案 9 :(得分:1)
我只想在要删除换行符的行上按A(附加到行尾,使您进入插入模式),然后按删除。
答案 10 :(得分: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
答案 11 :(得分:1)
问题是不可见的倍数char 0A(\ n)可能会累积。 想要从第100行清理到最后:
键入ESC和:(终端指挥官)
:110,$s/^\n//
在vim脚本中:
execute '110,$s/^\n//'
说明:从110到结束 搜索以新行开头的行(为空白) 并删除它们
答案 12 :(得分:0)
如果您只是想快速连接文本文件中的所有行,TinkerTank 的解决方案的一个非常微小的改进是在您的 .vimrc 中有这样的内容:
nnoremap <leader>j :%s/\n/\ /g<CR>
这会全局用空格替换换行符,这意味着您最终不会将一行的最后一个单词连接到下一行的第一个单词上。这非常适合我的典型用例。
如果您想保留有意的段落分隔符,V):join
可能是最简单的解决方案。