假设我有一个文件(标记为^ n的换行符):
aaaa^n
bbbb^n
cccc^n
是否有一个简单的命令将空白回填到块的最右边部分(可能使用视觉选择);我经常看到有关删除前导空格的问题,但在这种情况下,我希望前导空格为块中最长的非空白字符,如下所示:
aaaa ^n
bbbb^n
cccc ^n
答案 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()
作为廉价替代品。)