Перебирать результаты поиска по столбцу - PullRequest
3 голосов
/ 14 февраля 2009

Есть ли способ в 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 вместо этого.:)

Ответы [ 2 ]

3 голосов
/ 16 февраля 2009

После просмотра этого вопроса я решил попробовать написать плагин vim для его решения. Это мой первый плагин vim, так что, вероятно, он очень плохой. Тем не менее, это работает для примера, который вы привели.

Вы можете скачать плагин с vim.org: SearchCols.vim

Обратите внимание, что для этого также требуется плагин multvals с того же сайта: multvals.vim

Создает команду :SearchCols <string>, которую можно использовать для поиска <string> в столбцах фиксированной ширины, чтобы поиск осуществлялся сначала по первому столбцу, затем по второму столбцу и т. Д., А не по строке. поиск по строке, который является стандартным для VIM. Повторите команду через @:, а затем @@, так как это двоеточие.

Предположения:

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

Очевидные улучшения, о которых я могу подумать, - это упростить поиск следующего элемента, чем использовать @: и @@, включая подсветку поиска (код есть, но он закомментирован, потому что он использует :match и вы пришлось бы использовать :match none, чтобы отключить его) и исключить зависимость от multvals.vim.

2 голосов
/ 14 февраля 2009

EDIT: я только что нашел обзор использования регулярных выражений vim для таблиц здесь . Это намного чище, чем моя любительская попытка (хотя это тоже работает;)):

при поиске ^foo будет искать в первом столбце, а при поиске .*\ foo - во втором столбце, а .*\ .*\ foo - в третьем.

Это, конечно, не завершено, так как он соответствует целому блоку от начала строки, поэтому он найдет foo3 и foo4, но поместит курсор в позицию 0.

Однако вы можете автоматизировать это с помощью функции записи. В обычном режиме введите точно следующее:

qa/.*\ .*\ foo
/foo
q

(где я использовал новые строки, чтобы указать, что вы должны нажать клавишу возврата).

Это помещает два поиска в регистр a (qa начинает запись в a, qb в b и т. Д.). Теперь нажмите @a и вам нужно искать только третий столбец ....

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

...