【问题标题】:Align to the right in visual block在视觉块中向右对齐
【发布时间】:2012-03-19 15:43:03
【问题描述】:

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

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

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

【问题讨论】:

  • 之前/之后的例子会有所帮助。因为在我的第一个想法是:right 之后,我不知道你到底是什么。
  • :right 会将所有文本向右移动。我按照您的要求添加了一个示例。

标签: vim alignment


【解决方案1】:

为了解决正确处理所有极端情况的问题,我会使用 下面的函数。

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

【讨论】:

  • 当块后面没有文本时,它会给出错误 E486: Pattern not found '\%V\(.\{-}\)\(\s*\%V\s\) \%V\@!'
  • @Remonn:我无法重现该问题。您能否展示一个导致错误的特定测试用例?
  • ib,是的。请使用示例中的文本并删除“对齐文本”后的所有内容并修剪行尾的尾随空格。
  • 似乎函数在尝试将第二列右对齐时失败。 gist.github.com/JikkuJose/cd6b2ab4d7bf2593eb94
  • @Jikku:它到底是怎么失败的?它会产生特定的错误吗?
【解决方案2】:

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

  1. v0可视化选择从当前位置到行首的文本
  2. d删除选中的文本并放入缓冲区
  3. :right光标右侧的文字对齐
  4. 0将光标放在第一列
  5. gv可视化选择我们之前删除的相同区域
  6. p用删除的文本替换选择

    command! Right execute "normal v0d\&lt;CR&gt;:right\&lt;CR&gt;0gvp"

【讨论】:

    【解决方案3】:
    :'<,'>s/\%V.*\%V/\=printf("%*s", col("'>")-col("'<"), substitute(submatch(0), '^\s*\|\s*$', '', 'g'))
    

    【讨论】:

    • Kev,它可以完成这项工作,但是当我从“+”中选择第二个“+”(“t”)左侧的字符时出现问题。
    • 啊..它不起作用。我看到它在块中每一行的末尾都留了一个空格。
    • kev,当没有额外空间可用时不起作用(例如,当“对齐文本”位于行尾时)。
    • kev,你知道如何在命令行中向右增加选择1个字符吗? (为了在右侧多选择一列)
    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2017-06-12
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多