local M = {} local uv = vim.loop -- recursive Print (structure, limit, separator) local function r_inspect_settings(structure, limit, separator) limit = limit or 100 -- default item limit separator = separator or "." -- indent string if limit < 1 then print "ERROR: Item limit reached." return limit - 1 end if structure == nil then io.write("-- O", separator:sub(2), " = nil\n") return limit - 1 end local ts = type(structure) if ts == "table" then for k, v in pairs(structure) do -- replace non alpha keys with ["key"] if tostring(k):match "[^%a_]" then k = '["' .. tostring(k) .. '"]' end limit = r_inspect_settings(v, limit, separator .. "." .. tostring(k)) if limit < 0 then break end end return limit end if ts == "string" then -- escape sequences structure = string.format("%q", structure) end separator = separator:gsub("%.%[", "%[") if type(structure) == "function" then -- don't print functions io.write("-- lvim", separator:sub(2), " = function ()\n") else io.write("lvim", separator:sub(2), " = ", tostring(structure), "\n") end return limit - 1 end function M.generate_settings() -- Opens a file in append mode local file = io.open("lv-settings.lua", "w") -- sets the default output file as test.lua io.output(file) -- write all `lvim` related settings to `lv-settings.lua` file r_inspect_settings(lvim, 10000, ".") -- closes the open file io.close(file) end --- Returns a table with the default values that are missing. --- either parameter can be empty. --@param config (table) table containing entries that take priority over defaults --@param default_config (table) table contatining default values if found function M.apply_defaults(config, default_config) config = config or {} default_config = default_config or {} local new_config = vim.tbl_deep_extend("keep", vim.empty_dict(), config) new_config = vim.tbl_deep_extend("keep", new_config, default_config) return new_config end --- Checks whether a given path exists and is a file. --@param path (string) path to check --@returns (bool) function M.is_file(path) local stat = uv.fs_stat(path) return stat and stat.type == "file" or false end --- Checks whether a given path exists and is a directory --@param path (string) path to check --@returns (bool) function M.is_directory(path) local stat = uv.fs_stat(path) return stat and stat.type == "directory" or false end M.join_paths = _G.join_paths ---Write data to a file ---@param path string can be full or relative to `cwd` ---@param txt string|table text to be written, uses `vim.inspect` internally for tables ---@param flag string used to determine access mode, common flags: "w" for `overwrite` or "a" for `append` function M.write_file(path, txt, flag) local data = type(txt) == "string" and txt or vim.inspect(txt) uv.fs_open(path, flag, 438, function(open_err, fd) assert(not open_err, open_err) uv.fs_write(fd, data, -1, function(write_err) assert(not write_err, write_err) uv.fs_close(fd, function(close_err) assert(not close_err, close_err) end) end) end) end ---Copies a file or directory recursively ---@param source string ---@param destination string function M.fs_copy(source, destination) local source_stats = assert(vim.loop.fs_stat(source)) if source_stats.type == "file" then assert(vim.loop.fs_copyfile(source, destination)) return elseif source_stats.type == "directory" then local handle = assert(vim.loop.fs_scandir(source)) assert(vim.loop.fs_mkdir(destination, source_stats.mode)) while true do local name = vim.loop.fs_scandir_next(handle) if not name then break end M.fs_copy(M.join_paths(source, name), M.join_paths(destination, name)) end end end return M