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

如何用Lua获取Neovim当前工作目录下的所有文件和目录

在Neovim中检查当前工作目录下文件/目录是否存在的实现方案

核心需求实现

你需要的get_all_files_and_dirs_in_cwd()可以通过Neovim内置的vim.fn.glob函数实现,该函数能匹配指定路径下的文件和目录,返回结果可直接作为列表使用。

完整的existsInCWD函数实现

local function existsInCWD(nameToCheck)
    -- 获取当前工作目录
    local cwDir = vim.fn.getcwd()
    -- 获取CWD下所有非隐藏文件和目录(返回列表格式)
    -- 参数说明:
    -- 1. 匹配模式:CWD下所有项
    -- 2. true:关闭魔法字符匹配,按字面处理路径
    -- 3. true:返回列表而非拼接字符串
    -- 若需包含隐藏文件/目录,添加第四个参数"a":vim.fn.glob(cwDir .. "/*", true, true, "a")
    local cwdContent = vim.fn.glob(cwDir .. "/*", true, true)
    
    local fullNameToCheck = cwDir .. "/" .. nameToCheck
    print("Checking for: \"" .. fullNameToCheck .. "\"")
    
    -- 遍历匹配目标路径
    for _, item in ipairs(cwdContent) do
        if item == fullNameToCheck then
            return true
        end
    end
    return false
end

更高效的替代方案

其实不需要遍历CWD下所有内容,直接检查目标路径是否存在会更高效。Neovim提供了vim.fn.fs_stat函数,能直接判断路径(文件或目录)是否存在:

local function existsInCWD(nameToCheck)
    local fullPath = vim.fn.getcwd() .. "/" .. nameToCheck
    -- fs_stat返回nil表示路径不存在,否则返回包含文件信息的表
    return vim.fn.fs_stat(fullPath) ~= nil
end

如果需要区分是文件还是目录,可以分别使用:

  • 检查文件:vim.fn.filereadable(fullPath) == 1
  • 检查目录:vim.fn.isdirectory(fullPath) == 1

按键映射使用示例

将上述函数放入你的mappings.lua中,即可正常使用你定义的按键映射:

vim.keymap.set({'n'}, '<A-f>', '',
    { 
        desc = "Check if 'figures' directory exists",
        callback = function()
            local figuresDirExists = existsInCWD("figures")
            if figuresDirExists then
                print("Figure directory exists.")
            else
                print("Figure directory does not exist.")
            end
        end
    }
)

内容的提问来源于stack exchange,提问作者Kyle F. Hartzenberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:48:21