如何在Vim中基于函数返回路径运行FZF查找指定目录文件?
解决Vim中FZF动态指定分支笔记目录的问题
你的问题出在fzf#run()的参数使用上:source字段需要的是可执行命令(输出文件列表)或文件路径列表,而不是直接传目录路径。直接传目录会被fzf当作命令执行,自然报错“Command failed”。下面是两种可行的解决方案:
方案一:指定FZF的工作目录
这种方式和你使用:FZF .notes的逻辑一致,让FZF在目标分支目录下执行默认的文件查找:
function! NotesDir() let branch = gitbranch#name() let ndir = ".notes/" . branch " 先检查目录是否存在,避免无意义报错 if !isdirectory(ndir) echoerr "笔记目录 " . ndir . " 不存在!" return endif call fzf#run({ \ 'dir': ndir, \ 'options': '--prompt=' . ndir . '> ' \ }) endfunction command! NotesDir call NotesDir()
方案二:用find命令生成文件列表
如果需要自定义文件查找规则(比如只找markdown文件),可以用find命令作为source:
function! NotesDir() let branch = gitbranch#name() let ndir = ".notes/" . branch if !isdirectory(ndir) echoerr "笔记目录 " . ndir . " 不存在!" return endif " 使用shellescape处理路径,避免含特殊字符时出错 call fzf#run({ \ 'source': 'find ' . shellescape(ndir) . ' -type f', \ 'options': '--prompt=' . ndir . '> ' \ }) endfunction command! NotesDir call NotesDir()
说明
- 两种方案都加入了目录存在性检查,避免分支未创建对应笔记目录时出现异常。
- 方案一的行为和
:FZF原生命令完全一致,支持FZF的所有默认文件查找特性;方案二更灵活,可通过修改find参数实现过滤(比如添加-name "*.md"只找markdown笔记)。
内容的提问来源于stack exchange,提问作者bfxfer
相关产品推荐
相关产品推荐

