Выровнять текст только на первом разделителе в VIM

Предположим, что у меня есть этот код:

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 для использования пробелов в качестве разделителя, но у этого есть 2 проблемы

  • начальный отступ удваивается
  • все пробелы считаются разделителями, поэтому последняя строка испорчена

Я прочитал много вариантов предложений Align.vim, но я не нашел способ сделать это.

Ответ 1

Если вы используете Tabular, вы можете просто сделать :Tabularize /:\zs/.

Глядя на выровнять описание на vim.org, подобный вызов должен сработать для него. Вы можете попробовать :Align :\zs. Я не использую Align, поэтому я не уверен.

Ответ 2

Вы можете сделать это с помощью макроса Vim, никаких необходимых плагинов. Поместите курсор в любую точку на первой строке и введите обычный режим, а не режим вставки:

qa0f:w100i <Esc>19|[email protected]

Обратите внимание на одиночное пространство после 100i и <Esc> означает "нажатие кнопки" - не набирайте "<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
[email protected]        -- run the macro 4 times (for the remaining 4 lines)

И да, я использовал аналогичный макрос для форматирования вышеуказанного кода:)

Cf. мой ответ на аналогичный вопрос Vim выравнивания.

Чтобы применить это к ряду строк в визуальном режиме, выполните, выберите и введите:

:[email protected]

Ответ 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), и вы также хотите пропустить (:) все последующие совпадения. Этот пример может быть расширен для более сложных выравниваний.