| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | local fmt = string.format-- luacheck: ignore-- TODO: fix lint violations-- Iterator that splits a string o a given delimiterlocal function split(str, delim)  delim = delim or "%s"  return string.gmatch(str, fmt("[^%s]+", delim))end-- Find the proper directory separator depending-- on lua installation or OS.local function dir_separator()  -- Look at package.config for directory separator string (it's the first line)  if package.config then    return string.match(package.config, "^[^\n]")  elseif vim.fn.has "win32" == 1 then    return "\\"  else    return "/"  endend-- Search for lua traditional include paths.-- This mimics how require internally works.local function include_paths(fname, ext)  ext = ext or "lua"  local sep = dir_separator()  local paths = string.gsub(package.path, "%?", fname)  for path in split(paths, "%;") do    if vim.fn.filereadable(path) == 1 then      return path    end  endend-- Search for nvim lua include pathslocal function include_rtpaths(fname, ext)  ext = ext or "lua"  local sep = dir_separator()  local rtpaths = vim.api.nvim_list_runtime_paths()  local modfile, initfile = fmt("%s.%s", fname, ext), fmt("init.%s", ext)  for _, path in ipairs(rtpaths) do    -- Look on runtime path for 'lua/*.lua' files    local path1 = table.concat({ path, ext, modfile }, sep)    if vim.fn.filereadable(path1) == 1 then      return path1    end    -- Look on runtime path for 'lua/*/init.lua' files    local path2 = table.concat({ path, ext, fname, initfile }, sep)    if vim.fn.filereadable(path2) == 1 then      return path2    end  endend-- Global function that searches the path for the required filefunction find_required_path(module)  -- Look at package.config for directory separator string (it's the first line)  local sep = string.match(package.config, "^[^\n]")  -- Properly change '.' to separator (probably '/' on *nix and '\' on Windows)  local fname = vim.fn.substitute(module, "\\.", sep, "g")  local f  ---- First search for lua modules  f = include_paths(fname, "lua")  if f then    return f  end  -- This part is just for nvim modules  f = include_rtpaths(fname, "lua")  if f then    return f  end  ---- Now search for Fennel modules  f = include_paths(fname, "fnl")  if f then    return f  end  -- This part is just for nvim modules  f = include_rtpaths(fname, "fnl")  if f then    return f  endend-- Set options to open require with gfvim.opt_local.include = [=[\v<((do|load)file|require)\s*\(?['"]\zs[^'"]+\ze['"]]=]vim.opt_local.includeexpr = "v:lua.find_required_path(v:fname)"
 |