首页 > 解决方案 > 将输入传递给 vimrc 中的 fzf 快捷方式

问题描述

我的 vimrc 中有一个映射,可以为特定目录调用 fzf。

:map <F4> :Files my_directory_path_here <CR>

这工作正常。这会弹出一个窗口,我可以搜索文件的一部分以查看所有可能的文件。

我正在寻找一种将输入(mmdd 格式的当前日期)传递给我上面的映射的方法。

我抬头一看,我找到了一种将其映射到不同键的方法。

imap <F5> <C-R>=strftime("%m%d")<CR>

但是如何将其作为输入附加到我的键映射中?

谢谢你。

标签: inputvimmappingfzf

解决方案


这取决于插件的实现方式。如果它只是发出简单的命令然后进入插入模式(例如 via :startinsert),那么只需将键附加到原始映射即可:

:map <F4> :Files my_directory_path_here <CR><C-R>=strftime("%m%d")<CR>

我不使用 fzf (仅使用较旧的 FuzzyFinder),但恐怕它不适用于插件,如果它做更复杂的事情。这是一个适合我的演示(所以你相信我):

:map <F4> :startinsert<CR><C-R>=strftime("%m%d")<CR>

在 Vim 中读取输入的整体实现非常简单:有一个由用户填充的键缓冲区;每当检测到完整的命令时,暂停从缓冲区读取,执行命令,然后继续读取(即使命令同时更改了当前模式)。

如果这种简单的方法不起作用,那么有:help feedkeys()一个低级函数可以让您在任何待处理的键之后直接写入输入缓冲区。

:map <F4> :call feedkeys("\<lt>C-R>=strftime('%m%d')\<lt>CR>", 't')<Bar>startinsert<CR>

除了映射的丑陋转义(\<lt>而不是<)之外,这只是将输入缓冲区的填充放在命令之前,但这些键仅在它之后执行。

不幸的是,至少对于我的 FuzzyFinder 来说,这仍然不起作用,因为插件feedkeys()自己使用它来构建它的 UI(它需要启动插入模式并触发完成弹出窗口;没有 就无法完成的事情feedkeys())。有了这个,我们在 Vim 中的抽象已经用完了,所以似乎没有办法,除了直接扩展插件,以便它以某种方式将“输入预设”作为可选参数。因此,如果您确实遇到了 fzf 的相同问题,但认为这是一个重要功能,请向 fzf 的作者提出增强建议,或者使用单独的辅助映射的解决方法。


推荐阅读