如何用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
相关产品推荐
相关产品推荐

