如何使用fzf-lua实现先选目录再选对应目录文件并打开
使用fzf-lua实现两级目录-文件选择并打开文件
需求很明确:先弹出~/projects下的文件夹列表供选择,选中后弹出该目录下的文件列表,最终打开选中的文件。你的尝试代码存在变量顺序错误、未过滤目录、actions绑定不正确的问题,以下是修正后的实现方案:
你的尝试代码
function Projects() coroutine.wrap(function() local actions = { ["default"] = { require("fzf-lua").files { cwd = project }, }, } local project = require("fzf-lua").fzf_exec("ls", { prompt = "Projects> ", cwd = "~/projects" }) end)() end
修正方案(推荐使用fzf-lua内置方法)
直接用fzf-lua提供的dirs方法来筛选目录,逻辑更简洁可靠:
function Projects() require("fzf-lua").dirs({ prompt = "选择项目目录> ", cwd = "~/projects", actions = { ["default"] = function(selected) -- 取第一个选中的目录(fzf支持多选,这里默认单选) local target_dir = selected[1] -- 打开目标目录下的文件选择器 require("fzf-lua").files({ prompt = string.format("选择文件(%s)> ", target_dir), cwd = target_dir, -- files方法默认动作就是打开文件,无需额外配置 }) end } }) end
代码说明
dirs方法:fzf-lua封装好的目录选择器,自动过滤出指定路径下的子目录,无需自己写shell命令actions.default:绑定选中目录后的默认动作,接收选中项数组selected,取第一个元素作为目标目录files方法:打开目标目录下的文件列表,默认选中后直接打开文件(依赖你的Neovim打开文件的配置)
备选方案(自定义shell命令过滤目录)
如果需要更灵活的目录过滤规则,可以用fzf_exec配合shell命令实现:
function Projects() require("fzf-lua").fzf_exec("find . -type d -maxdepth 1 | grep -v '^\\.$'", { prompt = "选择项目目录> ", cwd = "~/projects", actions = { ["default"] = function(selected) local target_dir = string.format("~/projects/%s", selected[1]) require("fzf-lua").files({ prompt = string.format("选择文件(%s)> ", selected[1]), cwd = target_dir, }) end } }) end
代码说明
find . -type d -maxdepth 1:列出当前目录下的一级子目录grep -v '^\\.$':排除当前目录(.)- 后续逻辑和内置方法版本一致,选中目录后打开对应文件列表
内容的提问来源于stack exchange,提问作者Boyd
相关产品推荐
相关产品推荐

