10

假设我正在编辑以下文档(* = 光标):

Lions
Tigers


Kittens
Puppies


*


  Humans

我可以使用什么顺序来删除周围的空白,这样我就剩下:

Lions
Tigers


Kittens
Puppies
*
  Humans

注意:我正在寻找一个可以处理任意数量的空行的答案,而不仅仅是这种情况。

编辑 1:行号未知,我只想影响光标所在的跨度。

编辑 2:编辑示例以显示我需要在边缘保留前导空格

谢谢

4

6 回答 6

11

简单的。在正常模式下,dipO<Esc>应该这样做。

解释:

  • dipon a blank line 删除它和所有相邻的空白行。
  • O<Esc>打开一个新的空行,然后返回正常模式。

cip<Esc>正如@Lorkenpeist 所建议的,更简洁的是,将这两个步骤合二为一。

于 2013-03-12T20:10:27.020 回答
7

一种可能的解决方案是使用:join带有范围的命令:

:?.?+1,/./-1join!

解释:

  • [range]join!将一条线连接在一起[range]!无需插入任何额外空间的方法。
  • 起点是向后搜索到第一个字符,然后向下搜索 1 行,?.?+1
  • 1可以假设in+1可以缩写为?.?+
  • 终点是向前搜索到下一个字符,然后向上搜索 1 行,/./-1
  • 和之前一样,1可以这样假设,/./-
  • 由于我们使用相同的模式,因此只能向前搜索,因此可以省略该模式。//-
  • 该命令:join可以简写为:j

最终缩短的命令:

:?.?+,//-j!

以下是一些可能很方便的相关命令:

1)删除所有空行:

  • :g/^$/d
  • :v/./d

2) 将所有空行压缩成 1 个空行:

  • :v/./,//-j

如需更多帮助,请参阅:

:h :j
:h [range]
:h :g
:h :v
于 2013-03-12T19:13:55.307 回答
3

简短的回答: ()V)kc<esc>

在正常模式下,如果您键入,()您的光标将移动到第一个空白行。 (将光标移动到前一个非空行块的开头,并将)光标移动到末尾(具体来说,到所述块之后的第一个空行)。然后一个简单的d)将删除所有文本,直到下一个非空行的开头。所以完整的序列是()d)

编辑:你是对的,这会删除下一个非空行开头的空格。而不是d)尝试V)kdV使您进入可视行模式,)跳转到第一个非空白行(跳过行首的空格),k将光标向上移动一行。此时您已经选择了所有空白行,因此d删除了选择。

最后,键入O(大写 O),然后键入 escape 以创建一个新的空白行来替换您删除的那些。或者,替换dO<Escape>withc<Escape>用更少的键击做同样的事情,所以整个序列将是()V)kc<Esc>.

于 2013-03-12T18:41:29.900 回答
1

更新问题后,这些答案无关紧要:

这可能不是您想听到的答案,但我会使用范围。查看第一个空行(例如 55)和倒数第二个空行(可能是 67)的行号。然后就做:55,67d

或者,也许您只希望整个文件中只有一个空行。在这种情况下,您可以匹配任何出现的一个或多个空行并将它们替换为一个空行。

:%s/\(^$\n\)\+/\r/

这个答案有效:

如果您只想使用普通模式,您可以搜索最后一行的内容。例如,

/.<Enter>kkVNjd
于 2013-03-12T18:30:17.850 回答
1

我没有进行太多测试,但它应该适用于您的示例。也许有更优雅的解决方案。

function! DelWrapLines()
    while match(getline('.'),'^\s*$')>=0
        exe 'normal kJ'
    endwhile
    exe 'silent +|+,/./-1d|noh'
    exe 'normal k'
endfunction

来源并尝试:call DelWrapLines()

于 2013-03-12T18:55:23.620 回答
0

我知道这个问题已经解决了,但我刚刚在“sed & awk, 2nd Ed”中找到了一个很好的解决方案。(O'Reilly) 我认为值得分享的。它根本不使用 vim,而是使用 sed。此脚本将用一个空行替换一个或多个空行(假设这些行中没有空格)的所有实例。在命令行上:

sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile

请记住,sed 实际上并不编辑文件,而是将编辑后的行打印到标准输出。您可以将此输入重定向到文件:

sed '/ˆ$/{
N
/ˆ\n$/D
}' myfile > tempfile

不过要小心,如果您尝试将其直接写入myfile,它只会删除文件的全部内容,这显然不是您想要的!将输出写入 后tempfile,您就可以mv tempfile myfiletada 了!多个空行的所有实例都被一个空行替换。

更好的是:

cat -s myfile > temp
mv temp myfile

猫太棒了,是吗?

最好的:

如果您想在 vim 中执行此操作,您可以使用 vim 在 vi​​m 中的一系列行上执行 shell 命令的便捷功能用单个空行替换多个空行的所有实例。

:%!cat -s

仅此而已,您的整个文件都被重新格式化了!

于 2013-04-06T03:43:58.257 回答