Вопрос

Есть ли способ в 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 и вам следует искать только в третьем столбце....

Я уверен, что вы можете превратить это в команду, принимающую номер столбца, но я сейчас ухожу, извините :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top