Вставка отступа для столбцов в Vim
использование Vim я действительно поклонник визуального режима, который позволяет вставлять текст перед столбцом.
вставьте некоторый интервал после стрелок,
> one
> two
> three
можно сделать через <Ctrl-V>jjI <Esc>
:
> one
> two
> three
- перейти в визуальный режим
<Ctrl-V>
, - расширить визуальное выделение
jj
, - вставить несколько пробелов
I__
, - распространить изменения на все линии blockwise визуального выбора
<Esc>
теперь у меня есть текстовый файл, который нуждается в форматировании. Вот как это выглядит:
start() -- xxx
initialize() -- xxx
go() -- xxx
теперь я хочу выровнять часть этого текста, чтобы расположить его в Столбцах, как это:
start() -- xxx
initialize() -- xxx
go() -- xxx
проблема в том, что я не могу вставить различное количество отступов в каждую строку, и просто отступов фиксированного количества пробелов/вкладок недостаточно. Как вы можете сделать отступ, где весь текст с отступом должен быть выровнен по та же колонка?
EDIT: я только выяснил довольно подробный и громоздкий метод:
- найдите позицию строки для отступа от:
--
, - вставьте n (скажем, 20) пробелов перед этим:
20i <Esc>
, - удалите часть этих пробелов обратно в определенный столбец (скажем, 15):
d|15
, - сохранить эти шаги как макрос и повторить макрос так часто, как это необходимо.
...очень уродливый, хотя!
5 ответов
мне намного лучше без каких-либо плагинов vim. Вот мое решение:
<Shift-V>jj:!column -ts --
вставить --
на несколько строк, как вы написали в вопросе.
вы также можете добавить ряд комментариев во время вставки.
:set virtualedit=all
<Ctrl-V>jjA-- xxx<Esc>
без плагина и если вы уже ввели свои комментарии без решения emix:
:,+2 s/--/ &
это будет гарантировать, что все комментарии должны быть сдвинуты leftwise для того, чтобы правильно совместить их.
затем блочно выберите столбец, к которому вы хотите выровнять текст, и:100<
простой способ выровнять текст в Столбцах-использовать табличные или выровнять плагин. Если ни один из них под рукой, можно использовать следующие несколько сложно (и немного громоздко выглядит), но отлично работает (для рассматриваемый случай) команды.1,2
:let m=0|g/\ze -- /let m=max([m,searchpos(@/,'c')[1]])
:%s//\=repeat(' ',m-col('.'))
цель первой команды-определить ширину столбца, чтобы
слева от разделителя (который я предполагаю, что --
здесь). Ширина есть
рассчитывается как максимум длины текста в первом столбце
все направления. The :global
команда используется для перечисления строк
содержит разделитель (другие линии не требуют выравнивания). The \ze
атом, расположенный сразу после начала паттерна, задает конец
матч на том же месте, где он начинается (см. :help \ze
). Изменение
границы матча не влияют на путь работает,
шаблон написан таким образом, чтобы соответствовать потребностям следующего
команда подстановки: поскольку эти две команды могут иметь один и тот же шаблон,
его можно опустить во втором.
команда, которая выполняется в соответствующих строках,
:let m=max([m,searchpos(@/,'c')[1]])
называет searchpos()
функция для поиска шаблона, используемого в Родительском
:global
команда, и получить положение столбца матча. Узор
называется @/
использование последнего регистра шаблона поиска (см. :help
"/
). Это имеет преимущество факт, что обновление
/
зарегистрируйтесь, как только он начнет выполняться. The c
флаг передан как
второй аргумент в searchpos()
Вызов позволяет матч на первом
характер строки (:global
помещает курсор в самом начале
строка для выполнения команды), потому что может быть, что нет текста
слева от разделителя. The searchpos()
функция возвращает список,
первым элементом которого является номер строки согласованной позиции, и этот
второй-позиция столбца. Если команда выполняется в строке, строка
соответствует шаблону содержащего . As searchpos()
is
чтобы найти тот же шаблон, на этой линии определенно есть совпадение.
Поэтому интерес представляет только столбец, начинающий матч, поэтому он получает
извлечено из возвращаемого списка с помощью [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("."))'
те, кто интересуется этими конкретными командами, могут найти подробную информацию описание в истории правок.
это модификация ответа Бенуа, которая имеет два шага.
первый шаг, блок выберите текстовый поиск и замените -- с большим количеством пробелов.
'<,'>s/--/ --/
теперь все комментарии должны иметь много пробелов, но все равно быть неравномерными.
второй шаг, блок снова выберите текст и используйте другое регулярное выражение, чтобы соответствовать всем символам, которые вы хотите сохранить (скажем, первые 20 символов или около того), плюс все следующие пробелы и заменить его копией этих первых 20 символов:
'<,'>s/\(.\{20}\)\s*//