You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:07:18