Вставка отступа для столбцов в Vim - PullRequest
10 голосов
/ 23 сентября 2011

Используя Vim, я действительно фанат визуального режима, который позволяет вставлять текст перед столбцом.

Вставить интервал после стрелок,

> one
> two
> three

можно сделатьчерез <Ctrl-V>jjI <Esc>:

>   one
>   two
>   three
  • перейти в визуальный режим <Ctrl-V>,
  • расширить визуальный выбор jj,
  • вставить несколько пробелов I__,
  • распространить изменение на все строки блочного визуального выделения <Esc>

Теперь у меня есть текстовый файл, который требует некоторого форматирования.Вот как это выглядит:

start() -- xxx
initialize() -- xxx
go() -- xxx

Теперь я хочу выровнять часть этого текста, чтобы расположить его в столбцы следующим образом:

start()       -- xxx
initialize()  -- xxx
go()          -- xxx

Проблема в том, что я не могувставьте различное количество отступов в каждую строку, и просто сделать отступ для фиксированного количества пробелов / табуляций недостаточно.Как сделать отступ, когда весь текст с отступом должен быть выровнен в одном и том же столбце?


РЕДАКТИРОВАТЬ: я только нашел довольно многословный и громоздкий метод:

  • найти позицию строки для отступа из: \--,
  • до этого вставить n (скажем, 20) пробелов: 20i <Esc>,
  • удалить часть этих пробелов назад до определенногостолбец (скажем, 15): d|15,
  • сохраните эти шаги как макрос и повторяйте макрос так часто, как это необходимо,

... очень уродливо, хотя!

Ответы [ 5 ]

14 голосов
/ 23 сентября 2011

Мне гораздо лучше без плагинов vim. Вот мое решение:

<Shift-V>jj:!column -ts --

Затем вставьте -- в несколько строк, как вы написали в вопросе.


Вы также можете добавить ряд комментариев во время вставки.

:set virtualedit=all

<Ctrl-V>jjA-- xxx<Esc>

4 голосов
/ 23 сентября 2011

Вы должны использовать определенный плагин, вы можете использовать Tabular или Align плагин в этом случае.

Они оба позволяют вам выравнивать текст на определенныхсимволы, такие как -- в вашем примере.Их синтаксис немного отличается, хотя.Выберите тот, который подходит вам больше всего.

3 голосов
/ 24 сентября 2011

Простой способ выровнять текст в столбцах - использовать плагин Tabular или Align .Если ни один из них не готов, можно использовать следующие несколько хитрые (и немного громоздкие), но прекрасно работающие (для рассматриваемого случая) команды. 1,2

:let m=0|g/\ze -- /let m=max([m,searchpos(@/,'c')[1]])
:%s//\=repeat(' ',m-col('.'))

Цель первой команды - определить ширину столбца слева от разделителя (здесь я предполагаю --).Ширина рассчитывается как максимальная длина текста в первом столбце среди всех строк.Команда :global используется для перечисления строк, содержащих разделитель (другие строки не требуют выравнивания).Атом \ze, расположенный сразу после начала шаблона, устанавливает конец матча в той же позиции, где он начинается (см. :help \ze).Изменение границ соответствия не влияет на работу команды :global, шаблон написан таким образом, чтобы соответствовать потребностям следующей команды замещения: поскольку эти две команды могут использовать один и тот же шаблон, его можно опуститьво втором.

Команда, которая запускается на совпавших строках,

:let m=max([m,searchpos(@/,'c')[1]])

вызывает функцию searchpos() для поиска шаблона, используемого в родительской команде :global,и получить положение столбца матча.Шаблон упоминается как @/ с использованием последнего регистра шаблона поиска (см. :help "/).Это использует тот факт, что команда :global обновляет регистр /, как только он начинает выполняться.Флаг c, передаваемый в качестве второго аргумента в вызове searchpos(), позволяет сопоставить первый символ строки (:global помещает курсор в самое начало строки для выполнения команды), поскольку он можетбудь то, что нет текста слева от разделителя.Функция searchpos() возвращает список, первый элемент которого является номером строки совпадающей позиции, а второй - позицией столбца.Если команда выполняется в строке, строка соответствует шаблону содержащей команду :global.Поскольку searchpos() должен искать один и тот же шаблон, на этой строке определенно есть совпадение.Поэтому интерес представляет только столбец, начинающий сопоставление, поэтому он извлекается из возвращаемого списка с помощью индекса [1].Эта самая позиция равна ширине текста в первом столбце строки плюс один.Таким образом, m устанавливается на максимум его текущего значения и этой позиции столбца.

Вторая команда,

:%s//\=repeat(' ',m-col('.'))

дополняет первое вхождение разделителя во всех строкахкоторые содержат его, с количеством пробелов, которые отсутствуют, чтобы текст перед разделителем занимал m символов, минус один.Эта команда является глобальной заменой, заменяющей пустой интервал непосредственно перед разделителем (см. Комментарий о команде :global выше) результатом вычисления выражения (см. :help sub-replace-\=)

repeat(' ',m-col('.'))

repeat() Функция повторяет свой первый аргумент (в виде строки) количество раз, указанное во втором аргументе.Поскольку при каждой замене курсор перемещается в начало сопоставления с образцом, m-col('.') в точности соответствует количеству пробелов, необходимых для смещения разделителя вправо для выравнивания столбцов (col('.') возвращает текущую позицию курсора в столбце).


1 Ниже приведена однострочная версия этой пары команд.

:let m=0|exe'g/\ze -- /let m=max([m,searchpos(@/,"c")[1]])'|%s//\=repeat(' ',m-col('.'))

2 В предыдущих редакцияхОтветом для команд были следующие:

:let p=[0]|%s/^\ze\(.*\) -- /\=map(p,'max([v:val,len(submatch(1))+1])')[1:0]/
:exe'%s/\ze\%<'.p[0].'c -- /\=repeat(" ",'.p[0].'-col("."))'

Те, кто интересуется этими конкретными командами, могут найти подробное описание в истории правок.

3 голосов
/ 23 сентября 2011

Без плагина, и если вы уже ввели свои комментарии без решения emix:

:,+2 s/--/                                    &

Это обеспечит смещение всех комментариев влево для их правильного выравнивания.

Затем по блокам выберите столбец, по которому вы хотите выровнять текст, и: 100<

0 голосов
/ 15 июня 2013

Это модификация ответа Бенуа, которая состоит из двух шагов.

Первый шаг, блок выбора текстового поиска и замены - с большим количеством пробелов.

'<,'>s/--/                         --/

Теперь все комментариидолжно быть много пробелов, но все равно должно быть неравномерным.

Второй шаг, снова выделите текст, заблокируйте и используйте другое регулярное выражение, чтобы соответствовать всем символам, которые вы хотите сохранить (скажем, первые 20 символов или около того) плюс всеследующие пробелы и заменить его копией первых 20 символов:

'<,'>s/\(.\{20}\)\s*/\1/

Не так просто, как у Бенуа, но я не мог понять, как заставить его второй шаг работать.

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