Перебирать результаты поиска по столбцам
Вопрос
Есть ли способ в Vim (или плагине) искать термин и перебирать результаты поиска (согласно n
в Vim), по столбцу, а не по строке?Итак, если бы мой файл был таким:
foo1 bar bar
baz baz foo3
baz baz foo4
foo2 bar bar
Если я ищу foo
Я хочу перебрать результаты в порядке 1,2,3,4.Обычно n
переместил бы меня через них в порядке 1,3,4,2.
Я хочу, чтобы это, например, просматривало результаты поиска в огромном файле данных фиксированной ширины или файле CSV, где столбцы представляют собой поля.
(Я также соглашусь на способ сделать это в Emacs.:)
Решение
Увидев этот вопрос, я решил попробовать написать плагин vim для его решения.Это мой первый плагин для vim, так что, наверное, он очень плохой.Однако для приведенного вами примера это работает.
Вы можете скачать плагин с vim.org: ПоискКолс.vim
Обратите внимание, что для этого также требуется плагин multvals с того же сайта: multvals.vim
Он создает команду :SearchCols <string>
, который можно использовать для поиска <string>
в столбцах фиксированной ширины, чтобы поиск сначала выполнялся в первом столбце, затем во втором столбце и т. д.вместо стандартного для vim поиска по строкам.Повторите команду через @:
а потом @@
так как это команда-двоеточие.
Предположения:
- Предполагается, что ваш файл отформатирован с использованием столбцов фиксированной ширины, разделенных пробелами, т.е.внутри элементов данных нет пробелов, только между ними.
- Предполагается, что первая строка вашего файла отформатирована так, что из нее можно определить ширину столбцов.
Очевидные улучшения, о которых я могу подумать, заключаются в том, чтобы упростить поиск следующего элемента, чем использование @:
и @@
, включая подсветку поиска (код есть, но он закомментирован, поскольку использует :match
и вам придется использовать :match none
чтобы отключить его) и устранить зависимость от multvals.vim.
Другие советы
РЕДАКТИРОВАТЬ:Я только что нашел обзор использования регулярных выражений vim для таблиц. здесь.Это намного чище, чем моя любительская попытка (хотя это тоже работает;)):
searching for ^foo
будет искать первый столбец при поиске .*\ foo
будет искать второй столбец, и .*\ .*\ foo
буду искать третий.
Это, конечно, не завершено, поскольку он соответствует целому блоку с начала строки, поэтому он находит foo3 и foo4, но помещает курсор в позицию 0.
Однако вы можете автоматизировать это с помощью функции записи.Введите в обычном режиме следующее:
qa/.*\ .*\ foo
/foo
q
(где я использовал новые строки, чтобы указать, что вам следует нажать клавишу возврата).
Это помещает два поиска в регистр a (qa начинает запись в a, qb в регистр b и т. д.).Теперь нажмите @a
и вам следует искать только в третьем столбце....
Я уверен, что вы можете превратить это в команду, принимающую номер столбца, но я сейчас ухожу, извините :)