如何规范化vim中的文本块的空格?

时间:2013-07-25 19:09:36

标签: vim

假设我有一个文件(标记为^ n的换行符):

aaaa^n
                        bbbb^n
cccc^n

是否有一个简单的命令将空白回填到块的最右边部分(可能使用视觉选择);我经常看到有关删除前导空格的问题,但在这种情况下,我希望前导空格为块中最长的非空白字符,如下所示:

aaaa                        ^n
                        bbbb^n
cccc                        ^n

2 个答案:

答案 0 :(得分:4)

Probaly最简单的方法是

set virtualedit=all

转到要选择的块的左上角。使用Blockwise可视选择(<C-V>)并选择所需的行。然后点击$将视觉块扩展到行尾。

然后用y

抽出选区

然后输入gvp以超过您自行拉回线条的内容。 (gv重新选择最后一个视觉块)。完成后,将所有行扩展为最长行+ 1的长度。

这是有效的原因。当您使用虚拟编辑时,视觉选择将每行延伸到将其放入寄存器时最长的长度。

这将为末尾添加额外的空间,可以使用:%s/ $//

轻松修复

答案 1 :(得分:3)

你可以在一个:substitute中完成它,虽然它确实涉及:

:'<,'>s/$/\=repeat(' ', max(map(getline(line("'<"),line("'>")),'strdisplaywidth(v:val)'))-strdisplaywidth(getline('.')))/

此命令适用于Visual选择。如果您需要更多地控制范围,请考虑将替代品包装在接受range的函数中。

它是如何运作的?

    替换字符串中的
  • \=可让您评估表达式:请参阅:h sub-replace-expression

  • 替换是一些填充空格字符:repeat(' ', ...)

  • 确切的空格字符数是

    之间的差异
    • 选择中的最大行长度max(map(getline(start,end), 'strdisplaywidth(v:val)'))
    • 当前行的宽度strdisplaywidth(getline('.'))

请注意,strdisplaywidth()在较旧的Vims中不可用,但必须正确处理行中的制表符和空格。 (使用strlen()作为廉价替代品。)