vim 在视觉块中向右对齐

dba5bblo  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(133)

我想知道如何在视觉块中向右对齐而不改变之前的文本和块。
我以前用过这个代码:

:<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之后没有写东西时,它就不起作用了。

bvn4nwqk

bvn4nwqk1#

为了解决正确处理所有角落情况的问题,我将使用以下函数。

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

字符串

4c8rllxm

4c8rllxm2#

我用这个。把光标放在文本前面,应该是右对齐的。运行:Right它是如何工作的:

  1. v0直观选择从当前位置到行首的文本
  2. d删除选定文本并放入缓冲区
  3. :right对齐光标右侧的文本
  4. 0将光标移到第一列
  5. gv直观选择我们之前删除的相同区域
  6. p用删除的文本替换选定内容
    command! Right execute "normal v0d\<CR>:right\<CR>0gvp"
zbwhf8kr

zbwhf8kr3#

:'<,'>s/\%V.*\%V/\=printf("%*s", col("'>")-col("'<"), substitute(submatch(0), '^\s*\|\s*$', '', 'g'))

字符串

3xiyfsfu

3xiyfsfu4#

你可以通过两个正则表达式来实现:

:%s/+/ /g

字符串
这只是将每个+替换为white-space

:%s/\(\s\{2,}\)\(\w\+\s\+\w\+\)\(\s\{2,}\)/\1\3\2


这只是3组匹配的列和空间之间,然后在更换只是改变空间从前面到后面所需的列对齐。

相关问题