在视觉块中与右侧对齐

时间:2012-03-19 15:43:04

标签: vim alignment

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

我之前使用过此代码:

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

3 个答案:

答案 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 它是如何工作的:

  1. v0 Visualy选择从当前位置到行首
  2. 的文本
  3. d删除所选文字并放入缓冲区
  4. :right对齐光标右侧的文字
  5. 0将光标放到第一列
  6. gv Visualy选择我们之前删除的相同区域
  7. 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'))