5

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

aaaa^n
                        bbbb^n
cccc^n

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

aaaa                        ^n
                        bbbb^n
cccc                        ^n
4

2 回答 2

4

可能最简单的方法是

set virtualedit=all

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

然后用y

然后输入gvp过去你把线拉回它自己的东西。(gv重新选择最后一个视觉块)。完成后,这会将所有行扩展为最长行的长度 + 1。

这行得通的原因。当您使用虚拟编辑时,视觉选择会将每行延伸到最长的长度,然后将其放入寄存器中。

这将在末尾添加一个额外的空间,可以很容易地用:%s/ $//

于 2013-07-25T19:29:32.293 回答
3

您可以在单个 中执行此操作:substitute,尽管它确实有点涉及:

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

此命令适用于视觉选择。如果您需要对范围进行更多控制,请考虑将替代项包装在一个接受range.

它是如何工作的?

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

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

  • 空格字符的确切数量被确定为

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

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

于 2013-07-25T19:38:56.227 回答