假设我正在编辑以下文档(* =游标):
Lions
Tigers
Kittens
Puppies
*
Humans
我可以用什么序列来删除周围的空白区域,以便我留下:
Lions
Tigers
Kittens
Puppies
*
Humans
注意:我正在寻找一个能够处理任意数量空行的答案,而不仅仅是这种情况。
编辑1:行号未知,我只想影响光标所在的范围。
编辑2:编辑示例以显示我需要保留边缘的前导空格
由于
答案 0 :(得分:10)
易。在正常模式下,dipO<Esc>
应该这样做。
说明:
dip
在空行上删除它和所有相邻的空行。O<Esc>
打开一个新的空行,然后返回正常模式。更简洁, cip<Esc>
会将这两个步骤合并为一个,如@Lorkenpeist所示。
答案 1 :(得分:7)
一种可能的解决方案是使用范围为{/ p>的:join
命令
:?.?+1,/./-1join!
说明:
[range]join!
将[range]
行加在一起。 !
表示不插入任何额外空格。?.?+1
1
中的+1
,因此可以缩写?.?+
/./-1
1
可以假设/./-
//-
:join
可以缩短为:j
最终缩短的命令:
:?.?+,//-j!
以下是一些可能很方便的相关命令:
1)删除所有空行:
:g/^$/d
:v/./d
2)将所有空行挤压成一个空行:
:v/./,//-j
如需更多帮助,请参阅:
:h :j
:h [range]
:h :g
:h :v
答案 2 :(得分:3)
简答: ()V)kc<esc>
在正常模式下,如果键入()
,光标将移至第一个空白行。 (
将光标移动到前一个非空行块的开头,)
将光标移动到末尾(具体地说,移动到所述块之后的第一个空白行)。然后,一个简单的d)
将删除所有文本,直到下一个非空白行的开头。所以完整的序列是()d)
。
d)
尝试V)kd
。 V
使您进入可视线模式,)
跳转到第一个非空行(跳过行开头的空白),k
将光标向上移动一行。此时您已选择所有空白行,因此d
会删除所选内容。
最后,键入O
(大写O),然后转义以创建一个新的空行以替换您删除的空行。或者,将dO<Escape>
替换为c<Escape>
,只需少一次击键即可完成同样的操作,因此整个序列将为()V)kc<Esc>
。
答案 3 :(得分:1)
这可能不是你想听到的答案,但我会利用范围。看一下第一个空行的行号(比方说55例)和第二行到最后一行(可能是67行)。然后只需:55,67d
。
或许,您可能只希望整个文件中都有一个空行。在这种情况下,您可以匹配任何一个或多个空行的出现,并用一个空行替换它们。
:%s/\(^$\n\)\+/\r/
如果您只想使用普通模式,可以在其上搜索最后一行。例如,
/.<Enter>kkVNjd
答案 4 :(得分:1)
我没有测试过这么多,但它应该适用于你的例子。可能有更优雅的解决方案。
function! DelWrapLines()
while match(getline('.'),'^\s*$')>=0
exe 'normal kJ'
endwhile
exe 'silent +|+,/./-1d|noh'
exe 'normal k'
endfunction
获取并尝试:call DelWrapLines()
答案 5 :(得分:0)
我知道这个问题已经解决了,但我刚刚在“sed&amp; awk,2nd Ed”中找到了一个很好的解决方案。 (O'Reilly)我认为值得分享。它根本不使用vim,而是使用sed。此脚本将使用单个空行替换一个或多个空行的所有实例(假设这些行中没有空格)。在命令行上:
sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile
请记住,sed实际上并不编辑文件,而是将编辑过的行打印到标准输出。您可以将此输入重定向到文件:
sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile > tempfile
但是要小心,如果你试着直接把它写到myfile
,它只会删除文件的全部内容,这显然不是你想要的!将输出写入tempfile
后,您可以mv tempfile myfile
和tada!多个空行的所有实例都被一个空行替换。
更好:
cat -s myfile > temp
mv temp myfile
猫真棒,是吗?
<强> BESTEST:强>
如果你想在vim中进行,你可以使用vim在vim内的一系列行上执行shell命令的方便功能,用一个空白行替换多个空白行的所有实例。
:%!cat -s
这就是所需要的,整个文件都重新格式化了!