Выровнять текст только по первому разделителю в VIM - PullRequest
12 голосов
/ 25 января 2010

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

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 проблемы

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

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

Ответы [ 4 ]

25 голосов
/ 03 декабря 2011

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

qa0f:w100i <Esc>19|dwjq4@a

Обратите внимание на один пробел после 100i, а означает «нажатие клавиши» - буквально не печатайте «».

Перевод:

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. мой ответ на похожий вопрос выравнивания Vim .

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

:norm!@a
10 голосов
/ 25 января 2010

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

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

2 голосов
/ 08 апреля 2013

Используйте алгоритм @ 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

0 голосов
/ 18 октября 2017

Вы все еще можете сделать это с вашим предпочтительным плагином Align.vim с помощью команды:

Align! lp0P0: \s

Align! означает, что первый аргумент имеет формат AlignCtrl, в котором вы заказываете первое совпадение должно быть выровнено влево (l) без пробелов (p0P0), и вы также хотите пропустить (:) все последующие совпадения. Этот пример может быть расширен для более сложных выравниваний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...