是否有一种方法可以在Vim中删除一行末尾的换行符,以便下一行被追加到当前行?
例如:
Evaluator<T>(): _bestPos(){ }
我想把这些都放在一行上,而不是复制和粘贴到前面的一行中。似乎我应该能够将光标放到每行的末尾,按下一个键,然后让下一行跳转到光标所在的同一行上。
最终结果:
这在Vim中可行吗?
:%s/\n/
这可能取决于你的设置,但我通常用A<delete>来做
A<delete>
其中A附加在行末。它可能需要nocompatible模式:)
A
nocompatible
我只会在你想删除换行符的行上按A(附加到行尾,使你进入插入模式),然后按delete。
在正常模式下的上一行,点击转变+j。
你也可以预先添加一个计数,所以顶部行上的3J会将所有这些行连接在一起。
3J
如果你在第一行,按(大写)J将把这一行和下一行连接在一起,删除换行符。你也可以将它与一个计数组合在一起,所以按3J将把所有3行组合在一起。
如果您不介意使用其他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
J删除额外的前导空格(如果有的话),用单个空格连接行。(有一些例外:在/[.!?]$/之后,可以插入两个空格;在/^\s*)/之前,没有插入空格。)
J
/[.!?]$/
/^\s*)/
如果你不想要这种行为,gJ只是删除换行符,并没有对空格做任何聪明的处理。
gJ
<CURSOR>Evaluator<T>(): _bestPos(){ }
第一行光标
现在,在正常模式做
shift+v 2j shift+j
或
V2jJ
:正常V2jJ
下面所有的操作都假设你的光标在第一行上:
使用正规映射:
3.转变 + J
使用Ex命令:
:,+2j
是?的缩写
:.,.+2 join
也可以通过以下快捷方式进入:
3.:j
一个更短的Ex命令:
:j3
正如其他答案所提到的,(大写)J和\n的search + replace通常可用于剥离换行符和连接行。
\n
但是为了去掉后面的换行符在最后一行,你需要在Vim中这样做:
:set noendofline binary :w
set backspace=indent,eol,start
在你的.vimrc中将允许你在插入模式中对\n(换行符)使用backspace和delete。
backspace
delete
set whichwrap+=<,>,h,l,[,]
将允许你在正常模式下使用X删除之前的LF(当在col 1中)。
X
输入ESC和:(终端指挥官)
:110,$s/^\n//
在vim脚本中:
execute '110,$s/^\n//'
解释:从110到结束 搜索以new line开头的行(为空) 并删除它们
如果你只是想快速连接文本文件中的所有行,对TinkerTank的解决方案有一个非常微小的改进,就是在你的.vimrc中有这样的东西:
nnoremap <leader>j :%s/\n/\ /g<CR>
这将全局地用空格替换换行符,这意味着您不会将一行的最后一个单词连接到下一行的第一个单词。这非常适合我的典型用例。
如果你想要保持有意的段落换行,V):join可能是最简单的解决方案。
V):join