仅在VIM中的第一个分隔符上对齐文本

时间:2010-01-25 00:19:44

标签: vim alignment

假设我有这段代码:

width: 215px;
height: 22px;
margin-top: 3px;
background-color: white;
border: 1px solid #999999;

我想以这种方式对齐:

width:            215px;
height:           22px;
margin-top:       3px;
background-color: white;
border:           1px solid #999999;

使用Align.vim我可以:Align \s使用空格作为分隔符,但这有两个问题

  1. 初始缩进加倍
  2. 所有空格都被视为分隔符,因此最后一行被搞砸了
  3. 我已经阅读了Align.vim提供的众多选项,但我还没有找到办法实现这一目标。

4 个答案:

答案 0 :(得分:25)

您可以使用Vim宏执行此操作,无需插件。将光标放在第一行的任何位置,然后键入正常模式,而不是插入模式:

qa0f:w100i <Esc>19|dwjq4@a

注意100i之后的单个空格,以及&lt; Esc&gt;意思是“按下逃生” - 不要输入“&lt; Esc&gt;”字面上。

翻译:

qa         -- record macro in hotkey a
0          -- go to beginning of line
f:         -- go to first : symbol
w          -- go to next non-space character after the symbol
100i <Esc> -- insert 100 spaces
19|        -- go to 19th column (value 19 figured out manually)
dw         -- delete spaces until : symbol
j          -- go to next line
q          -- stop recording macro
4@a        -- run the macro 4 times (for the remaining 4 lines)

是的,我使用了一个类似的宏来格式化上面的代码块:)

Cf. my answer to a similar Vim alignment question

要在可视模式下将其应用于多行,请执行,选择并键入:

:norm!@a

答案 1 :(得分:10)

如果您使用Tabular,则可以:Tabularize /:\zs/

在vim.org上查看Align的描述,类似的调用应该适用于它。你可以试试:Align :\zs。我不使用Align,所以我不是正面的。

答案 2 :(得分:2)

利用@TalkLittle的算法,可以使用此代码完成,这对我来说更容易:)

  • 在第一个冒号后添加足够的spcaes

    :%s/^[^:]:\zs/ 大量空格 /

  • 但如果一直按下空格会伤害你的拇指,请改用

    :%s/^[^:]:\zs/\=repeat(' ',100)/

  • 然后删除第19列之后的所有空格

    :%s/\%19v\s*//

    注意:%会在所有行上执行此操作,如果您不想这样,请指定范围。

  • 如果你不想数到19,请使用:

    %s/:\zs.*// | %s/.*/\=len(submatch(0))/ | sort! n | let n=getline(1) | undo | echo 'the column nmuber of the right most ":" is' n

答案 3 :(得分:0)

您仍然可以使用您喜欢的插件Align.vim并使用以下命令执行此操作:

Align! lp0P0: \s

Align!表示您订购的第一个参数是AlignCtrl格式 要保留的第一个匹配(l)没有空格填充(p0P0),并且您还想跳过(:)所有后续匹配。 可以扩展此示例以进行更复杂的对齐。