Greping изнутри Vim (с трубкой) - PullRequest
5 голосов
/ 19 мая 2011

Я хочу создать список «быстрых исправлений» (см. :help quickfix) со всеми файлами, которые содержат строки с «abc», но не «xyz».Я надеялся, что смогу выполнить следующую команду vim ex:

:grep -nHr abc * | grep -v xyz

К сожалению, vim не нравится "pipe", и команда не выполняется.Каков наилучший способ сделать это из VIM?

Ответы [ 4 ]

3 голосов
/ 19 мая 2011

По какой-то причине я не могу оставить это в покое!

Как насчет использования :!grep ... > filename, за которым следует :cf filename, что откроет вывод в виде списка быстрого исправления.

1 голос
/ 19 мая 2011

вы можете сделать это в два этапа:

:!(grep -nHr abc * | grep -v xyz >| qf.txt)
:cfile qf.txt | copen

если вы часто меняете шаблоны, вы можете использовать функцию для переноса следующее не идеально, но работает:

fu! Mygrep(pat1, pat2)
  let cmd = "silent !(grep -nHr " . a:pat1 . " * | grep -v " . a:pat2 . " >| qf.txt)"
  silent exec cmd
  cfile qf.txt
  copen 
endfunction

, а затем вызвать его с помощью:

:call Mygrep("abc", "xyz")

мне кажется, что это работает, но я также получаю сообщение об ошибке "trailin charathers" (вам может потребоваться набрать, чтобы очистить экран).

0 голосов
/ 08 апреля 2014

Я только что понял, как убежать :grepprg, чтобы использовать трубу.

В моем случае мой :grepprg основан на утилите lid из GNU Idutils. Я хочу, чтобы вывод программы lid был отсортирован. это потому, что когда я использую шаблон, lid находит совпадения не по порядку. Я хочу найти шаблон типа, скажем, pthread.*lock и пройти через совпадения, чтобы следовать вложенным блокировкам, а не переходить между файлами таким образом, чтобы он соответствовал внутреннему порядку базы данных ID, сгенерированной mkid, который чередует совпадения из разных файлов.

Труба требует двойного побега. Похоже, что Vim обрабатывает значение grepprg как командный материал. Если вы выходите из канала только один раз, это интерпретируется как синтаксис Vim.

Итак, что у меня есть в моем .vimrc это:

:set grepprg=lid\ --substring\ --result=grep\ '\\<$*\\>'\ \\\|\ sort

Канал экранируется как \\\|: экранированный обратный слеш и экранированный канал для получения \|, который подвергается еще одному раунду обработки для получения |.

На основе этого примера можно настроить команду grep для включения произвольной Unix-системы.


Если вы хотите просто урезать результаты быстрого списка или выполнить поиск в результатах, существует интерактивный способ.

После выполнения :grep откройте буфер в разделенном окне, в котором содержится сам быстрый список:

:cope[Enter]

Чтобы наилучшим образом использовать это, изучите разделенные окна и, в частности, навигацию между разделенными окнами с помощью Ctrl-W Ctrl-W и других команд Ctrl-W.

В окне результатов быстрого исправления вы можете «уточнить поиск», выполняя поиск обычным способом, как в любом буфере. К какой бы строке вы ни переходили, вы можете просто нажать Enter в этой строке, чтобы перейти к этому элементу быстрого списка в другом окне. Курсор автоматически переместится в это окно: чтобы вернуться к результатам быстрого списка для поиска чего-то другого, используйте Ctrl-W Ctrl-W.

Вы также можете обрезать результаты быстрого списка, просто удалив ненужные строки из буфера :cope. По умолчанию буфер не изменяем, поэтому сначала нужно убедиться, что курсор находится в этом окне, а затем:

 :set modifiable

Тогда вы можете сделать что-то вроде

 :g/xyz/d

чтобы удалить все результаты, содержащие xyz. Только строки, которые остались, теперь являются частью списка быстрых исправлений.

0 голосов
/ 19 мая 2011

Вы можете установить grepprg, который определяет, какую команду Vim использует для выполнения :grep.Это может занять трубу, хотя я не пробовал.

Конечно, это повлияет на все ваши :grep с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...