как исключить имя файла из фильтрации fzf после результатов поиска ripgrep?
Я использую удобный пакет fzf.vim для интеграции fzf с vim. Поиск файлов работает отлично и полностью заменил плагин CtrlP, но функциональность файлов grep имеет неприятный побочный эффект, когда fzf думает, что имя файла автоматически добавляется (с помощью ripgrep, но это было бы в случае с ag (silver-searchcher) и обычным grep) является частью поисковой строки.
В результате лучший результат не всегда достигается наверху (или в моем случае в зависимости от макета). Вот пример: результат, который появляется последним в этом случае, фактически должен быть первым, потому что это единственный результат, который соответствует содержимому (как задумано Rg), а не имени файла. Эта проблема особенно неприятна для больших репозиториев, где нерелевантные результаты могут засорять все пространство поиска.
Я также должен пояснить, что проблема возникает из-за того, что я вызываю :Rg
из ярлыка, поэтому фильтрация выполняется fzf, а не rg (который просто сбрасывает все в fzf).
Эта проблема возникает по умолчанию :Rg
реализация в комплекте с fzf.vim, а также моя попытка свернуть свою собственную:
command! -bang -nargs=* Rg
\ call fzf#vim#grep(
\ 'rg --column --line-number --no-heading --color=always --smart-case '.shellescape(<q-args>), 1,
\ <bang>0 ? fzf#vim#with_preview('up:60%')
\ : fzf#vim#with_preview('right:50%:hidden', '?'),
\ <bang>0)
Я не мог понять, как исправить эту проблему. Может кто поможет?
2 ответа
То, что сработало для меня, переопределяет Rg
следующее:
command! -bang -nargs=* Rg call fzf#vim#grep("rg --column --line-number --no-heading --color=always --smart-case ".shellescape(<q-args>), 1, {'options': '--delimiter : --nth 4..'}, <bang>0)
Хотел бы я сам придумать это, но, честно говоря, после того, как я столкнулся с той же проблемой, что и вы, мне посчастливилось получить это сообщение в блоге в моих результатах поиска. Если вы похожи на меня и не понимаете, как и почему это работает, эта ветка проблемы в репозитории fzf github описывает анатомию приведенной выше команды (и предлагает такое же решение проблемы).
Похоже, ты хочешь своего ripgrep
ярлык, который вызывается внутри vim, чтобы не возвращать имя файла при поиске, чтобы вы могли использовать результаты поиска по строке.
man rg
:
-I, --no-filename Never print the file path with the matched lines. This is the default when ripgrep is explicitly instructed to search one file or stdin. This flag overrides --with-filename.