在视觉块中向右对齐

问题描述 投票:0回答:4

我想知道如何在视觉块中向右对齐而不更改之前的文本和块。

我之前一直用过这个代码:

:<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
之后没有写入任何内容时,它就不起作用。

vim alignment
4个回答
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

3
投票

我用这个。将光标放在应右对齐的文本之前。奔跑吧

:Right
它是如何工作的:

  1. v0
    直观地选择从当前位置到行首的文本
  2. d
    删除所选文本并放入缓冲区
  3. :right
    将文本与光标右侧对齐
  4. 0
    将光标置于第一列
  5. gv
    目视选择我们之前删除的相同区域
  6. p
    用删除的文本替换所选内容

    command! Right execute "normal v0d\<CR>:right\<CR>0gvp"


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

0
投票

您可以通过两个正则表达式来做到这一点:

:%s/+/ /g

这只是将每个

+
替换为
white-space

:%s/\(\w\+\s\w\+\)\(\s\+\)\(\w\+\)\(\s\+\)\(\w\+\)/\1\2\4\3 \5

这只是 4 个组来匹配列和之间的空格,然后在替换时只需更改所需列前后的空格即可对齐。

© www.soinside.com 2019 - 2024. All rights reserved.