【问题标题】:Align text only on first separator in VIM仅在 VIM 中的第一个分隔符上对齐文本
【发布时间】:2011-01-08 22:15:55
【问题描述】:

假设我有这个代码:

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. 所有空格都被认为是分隔符,所以最后一行搞砸了

我已经阅读了 Align.vim 提供的许多选项,但我还没有找到这样做的方法。

【问题讨论】:

标签: vim alignment


【解决方案1】:

您可以使用 Vim 宏来完成此操作,无需插件。将光标放在第一行的任意位置,并在普通模式下键入,而不是插入模式:

qa0f:w100i <Esc>19|dwjq4@a

注意 100i 后面的单个空格, 的意思是“按 Esc”——不要按字面意思输入“”。

翻译:

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

【讨论】:

  • 太好了,你跟进了解释 - 没有它我不敢输入这个神奇的咒语,因为害怕我的灵魂和磁盘内容,但有了它我什至会学到一些新的有趣的东西(虽然很反常)vim 命令!
  • @TalkLittle 出色地使用了不需要任何附加插件的无插件解决方案。出色地使用带注释的 vim 命令来帮助新用户。支持和解释原生 vim 强大功能的所有良好实践。
【解决方案2】:

如果你使用Tabular,那么你可以使用:Tabularize /:\zs/

查看 Align 在 vi​​m.org 上的描述,类似的调用应该适用。你可以试试:Align :\zs。我不使用 Align,所以我不积极。

【讨论】:

  • 是的,它适用于 Align。您可能希望使用 :AlignCtrl l:(或类似名称)忽略任何其他冒号。
  • 有人能解释一下\zs 是什么意思吗?
  • 使用\zs 将匹配\zs 之前的所有内容,但将其放回结果中。也就是说,它将保留\zs 之前的所有内容(就像您在其周围放置一个组(...) 并在替换中首先使用\1。请参阅:h /\zs
【解决方案3】:

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

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

    :%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

【讨论】:

  • 不需要任何插件的解决方案加分
【解决方案4】:

您仍然可以使用您喜欢的插件Align.vim 使用命令:

Align! lp0P0: \s

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

【讨论】:

  • 我有一个类似的问题,但不希望 OP 问题中的填充。我已尝试将您的答案更改为:对齐! 1:和:对齐! 1: \s 和 :Align 1: 等,但还没有找到如何使用与您的响应类似的东西来让 Align 只对齐第一个:。我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多