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

Выравнивание колонок в 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.

Осуществить это для диапазона строк (например, с 3 по 23) можно следующим образом (спасибо анонимному замечанию в комментариях):

:3,23s:&:__&:g
:3,23!column -t -s '__'

Первая команда добавит перед каждым знаком & два нижних подчёркивания __. Вторая команда вызовет внешнюю программу column с указанием __ в качестве разделителя.

PS

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

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