Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Редактирование таблиц данных

Часто приходится просматривать, модифицировать или редактировать текстовые данные, которые обычно имеют вид таблиц. Столбцы могут быть разделены табуляциями, пробелами, а то и запятыми (CSV). Обычно все-таки пробелы или табы, именно в таком формате умеют читать данные все достойные упоминания программные средства. Я имел и имею дело с Фортраном (форматный ввод), R (read.table), LibreOffice Calc, Google Sheet, Perl. Что нам предлагает Вим для такого рода файлов? Начнем с полезной малоизвестной опции virtualedit, кратко ve. Она по умолчанию пустая, но может содержать значения (через запятую). Если значения заданы, курсор может быть помещен туда, где нет символа. То есть, внутрь табуляции или после конца строки, собственно. Последний вариант не имеет отношения к таблицам, выделение обсудим ниже. А вот в режиме вставки такая возможность превращает файл в матрицу виртуальных символов. Вы можете поместить курсор куда угодно, и если вставите символ, то все позиции левее, вплоть до конца строк

Часто приходится просматривать, модифицировать или редактировать текстовые данные, которые обычно имеют вид таблиц. Столбцы могут быть разделены табуляциями, пробелами, а то и запятыми (CSV). Обычно все-таки пробелы или табы, именно в таком формате умеют читать данные все достойные упоминания программные средства. Я имел и имею дело с Фортраном (форматный ввод), R (read.table), LibreOffice Calc, Google Sheet, Perl.

Что нам предлагает Вим для такого рода файлов?

Типичный представитель. Подсвечены символы табуляции. Видите, что у них переменная визуальная длина? Виртуальное редактирование позволяет вставать в желтые поля и заходить за концы строк.
Типичный представитель. Подсвечены символы табуляции. Видите, что у них переменная визуальная длина? Виртуальное редактирование позволяет вставать в желтые поля и заходить за концы строк.

Начнем с полезной малоизвестной опции virtualedit, кратко ve. Она по умолчанию пустая, но может содержать значения (через запятую). Если значения заданы, курсор может быть помещен туда, где нет символа. То есть, внутрь табуляции или после конца строки, собственно.

  • insert: включить эту возможность в режиме вставки,
  • block: в режиме выделения прямоугольников.
  • all: в обоих режимах
  • onemore: допускает только сдвиг курсора за конец строки, на одну позицию.

Последний вариант не имеет отношения к таблицам, выделение обсудим ниже. А вот в режиме вставки такая возможность превращает файл в матрицу виртуальных символов.

Вы можете поместить курсор куда угодно, и если вставите символ, то все позиции левее, вплоть до конца строки, превратятся в реальные пробелы. А конец строки будет перемещен после этого символа.

Обратите внимание: команды вроде $, прыгающие в конец строки, могут сместить курсор влево (а не вправо).

Про режим выделения был уже материал. В числе прочего, есть выделение блоков: прямоугольников текста. Включается сочетанием <C-V>. Если virtualedit содержит block или all, то это всегда прямоугольник, а если нет, то более короткие строки будут видны. Во-первых, неудобно раздвигать прямоугольник, если на строке, например, ничего нет:

Блок как бы прямоугольный. Но короткая строка выбивается. В режиме virtualedit блок будет реально прямоугольный. Обратите внимание еще на одну тонкость: если столбцы визуально не выровнены, то структура таблицы не страдает, а вот блок заезжает куда не надо.
Блок как бы прямоугольный. Но короткая строка выбивается. В режиме virtualedit блок будет реально прямоугольный. Обратите внимание еще на одну тонкость: если столбцы визуально не выровнены, то структура таблицы не страдает, а вот блок заезжает куда не надо.

Во-вторых, сложно вставить прямоугольник, если "некуда". А так всегда "есть куда".

Блоки позволяют выделять и копировать, удалять, вставлять столбцы таблицы. Есть и удобные команды: A позволяет ввести строку (закончить ESC) и эта строка добавится к каждой строчке прямоугольника после пробела (только если блок до конца строки, то вплотную). Так можно завести новый столбец: выделили столбец, нажали A0.000<ESC> и столбик готов. Еще есть команда I, которая аналогично клеит текст к каждой строке, но слева и всегда вплотную. Так можно добавить ведущих нулей, например.

Команда c удалит блок и позволит ввести текст, который повторится на каждой строке. Так можно легко заместить столбец другим, из одних и тех-же чисел. А команда r позволит "забить" блок нулями.

Иногда приходится сортировать строки данных. Про это есть целая статья, так что здесь кратко только для таблиц: есть команда :sort.

Что тут важно? Сортируется весь файл, или указанный диапазон, или выделенные строки. Восклицательный знак (:sort!) означает сортировку в обратном порядке, но в любом случае по умолчанию сортировка идет по алфавиту! Чтобы работать с числами, нужен ключ n (для целых) или f (для вещественных). Сортировка будет вестись по первому числу в строке. Итак,

:sort n или :sort f

Наконец, можно указать шаблон: совпадающий текст будет игнорироваться. Это позволяет пропустить столбец или два, или сколько надо:

:sort f /^\S\+\s\+/

пропустит первый столбец, сортируя по второму.

:sort f /\(\S\+\s\+\)\{5}/

пропустит пять столбцов, сортируя по шестому.

Не забываем про движение по словам W, E, B, которые позволят прыгать от столбца к столбцу.

Можно поставить метку в букву, mz (вместо z любая буква), потом можно вернуться на метку посредством `z. Кавычка обратная. Это полезно, если таблица большая.

Ну, и последнее. В регулярных выражениях есть якоря, незаменимые для работы с таблицами! Это \zs, \ze, отмечающие начало и конец совпадения: так можно пропустить столбцы до и после нужного. Это \%V, совпадающий внутри выделения, в том числе блока. Это \%# , совпадающий в позиции курсора. Это \%'z, совпадающий на метке z. И, наконец, это \%42c и \%42v, совпадающие на символе номер 42 или на виртуальном символе №42. Разница возникает при использовании табуляций, а также виртуальные символы вполне могут находиться после конца строки.

Удачи, коллеги!

Оглавление рубрики

Навигатор по каналу