Я только что понял, как убежать :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
. Только строки, которые остались, теперь являются частью списка быстрых исправлений.