3

Можно ли отформатировать строку замены при подстановке совпадения с Vim?

Скажем, у меня есть файл с таблицей из 2 столбцов, где записи в каждой строке разделены пробелом. Записи (и строки) не имеют фиксированной ширины. Я хочу отформатировать таблицу так, чтобы все элементы 2-го столбца были выровнены, добавив соответствующее количество пробелов.

Например, приведенная таблица:

A aa
BBBB bbb
CC c

Что я хочу:

A      aa
BBBB   bbb
CC     c

(Обратите внимание, что вкладки не являются решением здесь.)

Команда Vim может выглядеть примерно так:

:0,$ s/\(.*\) \(.*\)/\1(******N)\2/

и (******N) следует заменить кодом форматирования, чтобы поместить 2-й элемент в позицию N-го символа.

ОБНОВЛЕНИЕ 1: Итак, Vim имеет функцию printf() . Может ли он быть использован непосредственно из командной строки для этой цели, или он должен быть включен в сценарий Vim с явным циклом, выполняющимся по всем строкам?

2 ответа2

5

Вы можете попробовать один из плагинов выравнивания на vim.org. Я использую самый популярный доктор Кэмпбелл: http://www.vim.org/scripts/script.php?script_id=294

Помимо этого, да, вы можете вызывать функции Vim из команды замены, но недостатком является то, что весь шаблон замены должен быть выражением. Смотрите " :help sub-replace-expression " и " :help submatch() ". Например, если мы хотим заменить совпавший шаблон на количество букв:

:%s/pattern/\=len(submatch(0))/g

Так что ваша идея использовать printf() будет работать:

:%s/\(.*\) \(.*\)/\=printf('%-7s %-7s',submatch(1),submatch(2))/
2

Вы не указали свою систему, но в UNIX-подобных системах вы можете использовать команду column в качестве фильтра:

:%!column -t

Ссылка:

:help filter
$ man column

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .