将输入传递给vimrc中的fzf快捷方式

时间:2018-11-29 11:08:00

标签: input vim mapping fzf

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

:map <F4> :Files my_directory_path_here <CR>

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

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

我抬起头来,找到了一种将其映射到其他键的方法。

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

这取决于插件的实现方式。如果它只是发出简单命令,然后进入插入模式(例如,通过: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中读取输入的整体实现非常简单:用户可以填充一个键缓冲区;只要检测到完整的命令,就会暂停从缓冲区的读取,执行该命令,然后继续读取(即使在此期间该命令更改了当前的 mode )。

如果该简单方法不起作用,则可以使用: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的作者进行增强,或者采用单独的辅助映射的解决方法。