假设我正在编辑以下文档(* = 光标):
Lions
Tigers
Kittens
Puppies
*
Humans
我可以使用什么顺序来删除周围的空白,这样我就剩下:
Lions
Tigers
Kittens
Puppies
*
Humans
注意:我正在寻找一个可以处理任意数量的空行的答案,而不仅仅是这种情况。
编辑 1:行号未知,我只想影响光标所在的跨度。
编辑 2:编辑示例以显示我需要在边缘保留前导空格
谢谢
假设我正在编辑以下文档(* = 光标):
Lions
Tigers
Kittens
Puppies
*
Humans
我可以使用什么顺序来删除周围的空白,这样我就剩下:
Lions
Tigers
Kittens
Puppies
*
Humans
注意:我正在寻找一个可以处理任意数量的空行的答案,而不仅仅是这种情况。
编辑 1:行号未知,我只想影响光标所在的跨度。
编辑 2:编辑示例以显示我需要在边缘保留前导空格
谢谢
简单的。在正常模式下,dipO<Esc>
应该这样做。
解释:
dip
on a blank line 删除它和所有相邻的空白行。O<Esc>
打开一个新的空行,然后返回正常模式。cip<Esc>
正如@Lorkenpeist 所建议的,更简洁的是,将这两个步骤合二为一。
一种可能的解决方案是使用:join
带有范围的命令:
:?.?+1,/./-1join!
解释:
[range]join!
将一条线连接在一起[range]
。!
无需插入任何额外空间的方法。?.?+1
1
可以假设in+1
可以缩写为?.?+
/./-1
1
可以这样假设,/./-
//-
:join
可以简写为:j
最终缩短的命令:
:?.?+,//-j!
以下是一些可能很方便的相关命令:
1)删除所有空行:
:g/^$/d
:v/./d
2) 将所有空行压缩成 1 个空行:
:v/./,//-j
如需更多帮助,请参阅:
:h :j
:h [range]
:h :g
:h :v
简短的回答: ()V)kc<esc>
在正常模式下,如果您键入,()
您的光标将移动到第一个空白行。 (
将光标移动到前一个非空行块的开头,并将)
光标移动到末尾(具体来说,到所述块之后的第一个空行)。然后一个简单的d)
将删除所有文本,直到下一个非空行的开头。所以完整的序列是()d)
。
编辑:你是对的,这会删除下一个非空行开头的空格。而不是d)
尝试V)kd
。 V
使您进入可视行模式,)
跳转到第一个非空白行(跳过行首的空格),k
将光标向上移动一行。此时您已经选择了所有空白行,因此d
删除了选择。
最后,键入O
(大写 O),然后键入 escape 以创建一个新的空白行来替换您删除的那些。或者,替换dO<Escape>
withc<Escape>
用更少的键击做同样的事情,所以整个序列将是()V)kc<Esc>
.
这可能不是您想听到的答案,但我会使用范围。查看第一个空行(例如 55)和倒数第二个空行(可能是 67)的行号。然后就做:55,67d
。
或者,也许您只希望整个文件中只有一个空行。在这种情况下,您可以匹配任何出现的一个或多个空行并将它们替换为一个空行。
:%s/\(^$\n\)\+/\r/
如果您只想使用普通模式,您可以搜索最后一行的内容。例如,
/.<Enter>kkVNjd
我没有进行太多测试,但它应该适用于您的示例。也许有更优雅的解决方案。
function! DelWrapLines()
while match(getline('.'),'^\s*$')>=0
exe 'normal kJ'
endwhile
exe 'silent +|+,/./-1d|noh'
exe 'normal k'
endfunction
来源并尝试:call DelWrapLines()
我知道这个问题已经解决了,但我刚刚在“sed & 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
猫太棒了,是吗?
最好的:
如果您想在 vim 中执行此操作,您可以使用 vim 在 vim 中的一系列行上执行 shell 命令的便捷功能用单个空行替换多个空行的所有实例。
:%!cat -s
仅此而已,您的整个文件都被重新格式化了!