Использование Ripgrep с флагами в fzf.vim

#vim #fzf #ripgrep #vim-fzf

#vim #fzf #ripgrep #vim-fzf

Вопрос:

Я использую функцию ниже для поиска содержимого в файлах с помощью ripgrep с использованием fzf в vim

 function! RipgrepFzf(query, fullscreen)
  let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case -- %s || true'
  let initial_command = printf(command_fmt, shellescape(a:query))
  let reload_command = printf(command_fmt, '{q}')
  let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command]}
  call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen)
endfunction

command! -nargs=* -bang FRG call RipgrepFzf(<q-args>, <bang>0)
 

Я могу выполнить простой поиск с его помощью, однако я не могу использовать флаги RG, чтобы сделать мой поиск более точным (поиск по типу файла, исключение каталога или поиск в подкаталоге и т.д.)

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

  • Удалить -- перед %s
     let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case %s || true'
     
  • Удалить shellescape функцию
     let initial_command = printf(command_fmt, a:query)
     

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

Я хотел бы использовать RG как есть (так же, как он работает в терминале) в fzf в vim

Комментарии:

1. Вы нашли хорошее решение для этого. Я пытаюсь сделать то же самое. Я новичок в fzf и не хочу просматривать код плагина, чтобы найти решение, если кто-то еще уже сделал это

2. какие флаги вы хотите добавить? скажите мне конкретно, и, возможно, я смогу помочь

3. или, более конкретно, скажите мне, какой именно вашей командой вы хотите быть.

Ответ №1:

чтобы искать файлы только по расширению / типу файла, попробуйте выполнить это в командной строке:

 rg . --files -g "*.{py}"
 

при этом я ищу только файлы python

мой вывод:

 > rg . --files -g "*.{py}"
./another.py
./colors_do_not_apply.py
 

чтобы исключить каталог из ripgrep

если вы хотите выполнить поиск all content from files в текущем каталоге:

 > rg --column --line-number --no-heading --color=always --smart-case --hidden -g "!.git" .
 

обратите внимание, что:

  • --hidden для скрытых файлов
  • -g "!.git" для ignoring папки git (вы можете сделать то же самое с другими)

примечание:

я использовал "!.git" , который используется только в терминале (мой zsh взрывается без! экранированный), в vim вы можете использовать его как "!.git"

если вы хотите искать только файлы и исключать папку git в текущем каталоге:

 > rg --hidden -g "!.git" --files .
 

поиск в подкаталоге выполняется автоматически, поэтому вам не нужно беспокоиться

наконец

я видел, как вы скопировали вставленную причудливую функцию из fzf.vim на github, я тоже ее использую 🙂

вот моя функция:

 " search for content in files in current project, including hidden ones and ignoring git
function! SearchContentInFiles(query, fullscreen)
  let command_fmt = 'rg --column --line-number --no-heading --color=always --smart-case --hidden -g "!.git" -- %s || true'
  let initial_command = printf(command_fmt, shellescape(a:query))
  let reload_command = printf(command_fmt, '{q}')
  let spec = {'options': ['--phony', '--query', a:query, '--bind', 'change:reload:'.reload_command, '--exact', '--pointer=@', '-i', '-m', '--cycle', '--border=none', '--marker=*', '--ansi', '--preview-window=left,50%', '--bind=alt-bspace:backward-kill-word,ctrl-x:beginning-of-line kill-line,ctrl-a:select-all', '--color=16,fg :bright-red,hl:bright-blue,hl :green,query:blue,prompt:yellow,info:magenta,pointer:bright-yellow,marker:bright-blue,spinner:bright-blue,header:blue', '--prompt=content from files( hidden) (git ignored) at . > ']}
  call fzf#vim#grep(initial_command, 1, fzf#vim#with_preview(spec), a:fullscreen)
endfunction

command! -nargs=* -bang SCIF call SearchContentInFiles(<q-args>, <bang>0)
nnoremap <silent> <S-F> :SCIF!<CR>
 

ну, я знаю, он довольно большой. это лучшее, что у меня есть.

единственными отличиями являются:

  • в command_fmt я добавил дополнительные аргументы для скрытых файлов и исключения папки git
  • имя функции
  • параметры fzf (есть много опций), точнее, эти параметры:
 '--exact' - exact match
'--pointer=@', 
'-i', 
'-m', 
'--cycle', (repeat after end)
'--border=none', 
'--marker=*', 
'--ansi', (enable colors)
'--preview-window=left,50%', 
'--bind=alt-bspace:backward-kill-word,ctrl-x:beginning-of-line kill-line,ctrl-a:select-all', (some keybindings)
'--color=16,fg :bright-red,hl:bright-blue,hl :green,query:blue,prompt:yellow,info:magenta,pointer:bright-yellow,marker:bright-blue,spinner:bright-blue,header:blue', (color scheme)
'--prompt=content from files( hidden) (git ignored) at . > ' (prompt text)
 

ofc, вы можете интегрировать каждую приведенную выше команду в vim.

надеюсь, это поможет.

Ответ №2:

Во-первых, вам нужно удалить -- из строки команды, потому что

двойная черта (—) используется в большинстве встроенных команд Bash и многих других командах для обозначения конца параметров команды, после чего принимаются только позиционные аргументы.оригинальный ответ

И второе, что вас интересует, reload_command потому что это то, что вызывается всякий раз, когда вы меняете строку в окне предварительного просмотра.

Если вы измените свой reload_command на

 let reload_command = printf(command_fmt, shellescape('{q}'))
 

тогда вы должны иметь возможность передавать флаги в окне предварительного просмотра.

Я хотел посмотреть, как fzf вызывает эту команду перезагрузки, просто чтобы увидеть shellescape разницу, но я думаю, что это займет некоторое время для меня, поскольку я не совсем знаком. Если я это сделаю, я также отредактирую свой ответ.