问题描述
我使用 fzf.vim 在 neovim 中快速查找我项目中的文件。
有时因为我找不到我要找的东西,或者因为我在打开新文件之前忘记做某事,我需要取消并关闭弹出窗口而不选择任何结果。
目前,我按 <Esc>
进入正常模式,然后按 :q
,但理想情况下,将其映射到组合键(例如 <C-x>
如何映射仅针对 FZF 窗口的键绑定?或者是否有任何组合键已经关闭弹出窗口而无需任何进一步操作?
提前致谢
解决方法
此解决方案似乎默认有效:https://www.reddit.com/r/neovim/comments/4fxsdq/fzfvim_terminal_integration_questions/
简而言之:
ESC,CTRL-C,CTRL-G 和 CTRL-Q 默认关闭 fzf,no 需要进入正常模式并删除缓冲区。你甚至可以 使用 fzf 的 --bind 选项自定义键绑定;例如, :FZF --bind ctrl-p:abort 或者你可以把它放在你的 $FZF_DEFAULT_OPTS 中。
,对于vim,我仍然对这种解决方案感到好奇,但在我的zsh中,我有这个功能:
# source:https://stackoverflow.com/a/65375231/2571881
function vif() {
local fname
fname=$(fzf) || return
vim "$fname"
}
如果 $fname
收到来自 fzf 的文件名,zsh 运行下一行,即 vim
调用 $fname
,否则 zsh 就像什么也没做一样简单地返回。
我没有找到合适的方法来做这件事,但是我找到了一个可能适用于其他有同样问题的人的解决方法。
使用变量 g:fzf_action
我们可以将键映射到 fzf 中的操作。这样,我们就可以编写一个命令,fzf 会将选择的路径附加到命令中。
在这种情况下最重要的是它会关闭窗口。
对我有用的解决方案是将键映射到命令 silent exec "!echo"
。
!echo
只会在命令行中打印选择。由于该命令是静默执行的,结果是仅关闭了窗口。
不确定这个解决方案是否会产生一些副作用,但是,到目前为止一切似乎都很好。
这是我的键映射:
let g:fzf_action = {
\ 'ctrl-x': 'silent exec "!echo"',\ 'ctrl-h': 'split',\ 'ctrl-v': 'vsplit' }