我想知道如何在视觉块中右对齐而不更改前面和块之前的文本。
我之前使用过此代码:
:<C-U>'<,'>s/\%V\(.\{-}\)\(\s\{-}\)\%(\%V\@!\|$\)/\2\1/
但是我注意到在视觉块只是空格之后它不起作用。 (在视觉块之后必须有文本才能使上面的代码工作)
是否无法在视觉块中将文本右对齐,无论块后写入什么内容?
示例:
text before +align text text after
text before align text text after
text before align text text after
text before align text+ text after
我想要做的是从+
到+
选择一个文本块(参见上面的示例)
并将它对齐到右边。输出必须是:
text before align text text after
text before align text text after
text before align text text after
text before align text text after
上面的代码完成了这项工作,但是当每行中都没有align text
之后写的东西时,它就不起作用。
答案 0 :(得分:3)
为了解决正确处理所有角落案件的问题,我会使用 以下功能。
function! RightAlignVisual() range
let lim = [virtcol("'<"), virtcol("'>")]
let [l, r] = [min(lim), max(lim)]
exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./\=StrPadLeft(submatch(0),r-l+1)'
endfunction
function! StrPadLeft(s, w)
let s = substitute(a:s, '^\s\+\|\s\+$', '', 'g')
return repeat(' ', a:w - strwidth(s)) . s
endfunction
答案 1 :(得分:2)
我用这个。将光标放在应该对齐的文本之前。运行:Right
它是如何工作的:
v0
Visualy选择从当前位置到行首d
删除所选文字并放入缓冲区:right
对齐光标右侧的文字0
将光标放到第一列gv
Visualy选择我们之前删除的相同区域 p
将选择内容替换为已删除的文字
command! Right execute "normal v0d\<CR>:right\<CR>0gvp"
答案 2 :(得分:1)
:'<,'>s/\%V.*\%V/\=printf("%*s", col("'>")-col("'<"), substitute(submatch(0), '^\s*\|\s*$', '', 'g'))