2009-02-13 5 views
3

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

ответ

3

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

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

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

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

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

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

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

2

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

ищет ^foo будет искать первый столбец, при поиске .*\ foo будет искать вторую колонку, и .*\ .*\ foo будет искать третий.

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

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

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

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

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