3

我正在使用下面的函数在vim中使用fzf使用ripgrep搜索文件中的内容

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)
    

在这些更改之后,我最初可以使用标志,但是在更新我的搜索时它没有按预期工作。

我想在vim的fzf中按原样使用RG(在终端中的工作方式相同)

4

2 回答 2

0

要仅按扩展名/文件类型搜索文件,请在命令行中尝试:

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"用于ignoringgit 文件夹(你可以对其他人做同样的事情)

注意

我用过"\!.git",仅在终端中使用(我的 zsh 在没有!转义的情况下爆炸),在 vim 中你可以将其用作"!.git"

如果您只想搜索文件并排除当前目录中的 git 文件夹:

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

在子目录中搜索是自动进行的,所以你不必担心

最后

我看到你从 github 上的 fzf.vim 复制粘贴了一个花哨的函数,我也使用它 :)

这是我的功能:

" 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 中集成上述所有命令。

希望这些帮助。

于 2021-07-26T15:27:43.427 回答
0

首先,您需要--从命令字符串中删除 ,因为

在大多数 Bash 内置命令和许多其他命令中使用双破折号 (--) 来表示命令选项的结束,之后只接受位置参数。原始答案

第二个是,您感兴趣,reload_command因为每当您在预览窗口中更改字符串时都会调用它。

如果你改变你reload_command

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

那么您应该能够在预览窗口上传递标志。

我想看看 fzf 是如何调用 reload 命令的,只是为了看看有什么不同shellescape,但我认为这对我来说需要一些时间,因为我不是很熟悉。如果我这样做,我也会编辑我的答案。

于 2022-01-17T14:18:34.163 回答