Лисаков и макромир

Выравнивание колонок в vim

Бывает, что сталкиваешься с такой вот табличкой:

Выравнивание в vim

Есть разные утилиты для выравнивания таблиц. Но обычно можно обойтись и без них — ведь наш файл и так открыт в vim, который умеет почти всё. Процесс выравнивания можно посмотреть на gif-анимации или mp4-видео.

Идея такая:

  1. Поставить между столбцами достаточно пробелов, чтобы самый левый элемент из второго столбца был правее самого правого элемента из первого столбца. В рассматриваемом *.tex формате столбцы разделены знаком &, поэтому и используется замена вида :%s/&/          &/g. Количество пробелов зависит от длины ячеек таблицы.

  2. Выделить пустой столбец в режиме блочного выделения по Ctrl + V. Затем сдвинуть всё правее выделения влево <. Повторить необходимое количество раз, нажав точку .. Так на видео и анимации выравнивается первый столбец. Это не самый быстрый вариант, а показан он для того, чтобы было понятнее, что происходит.

  3. После выделения пустого столбца вместо <....... можно сделать 20<. Так выравниваются остальные столбцы на видео и анимации.

Около 5 лет назад я стал изучать vim, узнав, что он умеет работать со столбцами. До сих пор это одна из моих любимых и часто используемых способностей vim. Vim восхищает!

Выравнивание в column

Линуксовая утилита column поставляется в стандартном комплекте большинства дистрибутивов. Например, команда

column -t filename

выровняет колонки, используя пробел в качестве разделителя между столбцами. В нашем случае разделителем является амперсанд &. С помощью флага -s утилите column можно указать разделитель:

column -t -s '&' filename

Получится качественное выравнивание, но сам знак разделителя исчезнет. Я не нашёл, как заставить column сохранять разделитель, поэтому решил сделать так:

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

Осуществить такое можно, например, с помощью потокового редактора sed. В качестве разделителя укажем #:

sed 's:&:#&:g' filename | column -t -s '#'

Чтобы сделать это прямо из vim, можно воспользоваться синтаксисом :read !command, сокращённо :r!command:

:r!sed 's:&:\#&:g' % | column -t -s '\#'

Чтобы vim не ругался, символ # пришлось предварить обратным слэшем. Однако, такая команда будет выравнивать весь файл, что не всегда желательно. Чтобы указать, какой диапазон строк надо выровнять, можно опять-таки использовать sed. Допустим, нам нужны строки только с 10 по 13. Тогда:

:r!sed -n 10,13p % | sed 's:&:\#&:g' | column -t -s '\#'

PS

Для записи mp4-видео использовал программу peek. Очень проста и удобна в использовании. Она позволяет писать и gif, но у меня в анимации получались небольшие зависания, поэтому пользовался менее удобной консольной утилитой byzanz. Для показа нажимаемых клавиш использовал screenkey.

Если у вас есть предложения, как сделать этот процесс ещё короче, обязательно дайте знать в комментариях.