Преглед на файлове

refactor(autocmds): clean up filetype detection rules (#3625)

* refactor(lua): simplify gf utility

* refactor(autocmds): cleanup

* refactor(ftdetect): use vim.filetype.add instead
kylo252 преди 2 години
родител
ревизия
b661efb317
променени са 6 файла, в които са добавени 42 реда и са изтрити 119 реда
  1. 0 3
      ftdetect/json.lua
  2. 0 1
      ftdetect/plaintex.lua
  3. 0 3
      ftdetect/zig.lua
  4. 0 88
      ftplugin/lua.lua
  5. 10 0
      lua/lvim/config/settings.lua
  6. 32 24
      lua/lvim/core/autocmds.lua

+ 0 - 3
ftdetect/json.lua

@@ -1,3 +0,0 @@
-vim.cmd [[
- au BufRead,BufNewFile tsconfig.json set filetype=jsonc
-]]

+ 0 - 1
ftdetect/plaintex.lua

@@ -1 +0,0 @@
-vim.cmd [[ au BufRead,BufNewFile *.tex set filetype=tex ]]

+ 0 - 3
ftdetect/zig.lua

@@ -1,3 +0,0 @@
-vim.cmd [[
-  au BufRead,BufNewFile *.zir set filetype=zir
-]]

+ 0 - 88
ftplugin/lua.lua

@@ -1,88 +0,0 @@
-local fmt = string.format
--- luacheck: ignore
--- TODO: fix lint violations
-
--- Iterator that splits a string o a given delimiter
-local 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 "/"
-  end
-end
-
--- 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
-  end
-end
-
--- Search for nvim lua include paths
-local 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
-  end
-end
-
--- Global function that searches the path for the required file
-function 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
-  end
-end
-
--- Set options to open require with gf
-vim.opt_local.include = [=[\v<((do|load)file|require)\s*\(?['"]\zs[^'"]+\ze['"]]=]
-vim.opt_local.includeexpr = "v:lua.find_required_path(v:fname)"

+ 10 - 0
lua/lvim/config/settings.lua

@@ -64,6 +64,16 @@ M.load_default_options = function()
   for k, v in pairs(default_options) do
     vim.opt[k] = v
   end
+
+  vim.filetype.add {
+    extension = {
+      tex = "tex",
+      zir = "zir",
+    },
+    pattern = {
+      ["[jt]sconfig.*.json"] = "jsonc",
+    },
+  }
 end
 
 M.load_headless_options = function()

+ 32 - 24
lua/lvim/core/autocmds.lua

@@ -3,25 +3,6 @@ local Log = require "lvim.core.log"
 
 --- Load the default set of autogroups and autocommands.
 function M.load_defaults()
-  vim.api.nvim_create_autocmd({ "FileType" }, {
-    pattern = {
-      "Jaq",
-      "qf",
-      "help",
-      "man",
-      "lspinfo",
-      "spectre_panel",
-      "lir",
-      "DressingSelect",
-      "tsplayground",
-    },
-    callback = function()
-      vim.cmd [[
-      nnoremap <silent> <buffer> q :close<CR>
-      set nobuflisted
-    ]]
-    end,
-  })
   local definitions = {
     {
       "TextYankPost",
@@ -30,7 +11,7 @@ function M.load_defaults()
         pattern = "*",
         desc = "Highlight text on yank",
         callback = function()
-          require("vim.highlight").on_yank { higroup = "Search", timeout = 100 }
+          vim.highlight.on_yank { higroup = "Search", timeout = 100 }
         end,
       },
     },
@@ -46,16 +27,43 @@ function M.load_defaults()
       "FileType",
       {
         group = "_filetype_settings",
-        pattern = "qf",
-        command = "set nobuflisted",
+        pattern = { "lua" },
+        desc = "fix gf functionality inside .lua files",
+        callback = function()
+          ---@diagnostic disable: assign-type-mismatch
+          -- credit: https://github.com/sam4llis/nvim-lua-gf
+          vim.opt_local.include = [[\v<((do|load)file|require|reload)[^''"]*[''"]\zs[^''"]+]]
+          vim.opt_local.includeexpr = "substitute(v:fname,'\\.','/','g')"
+          vim.opt_local.suffixesadd:prepend ".lua"
+          vim.opt_local.suffixesadd:prepend "init.lua"
+
+          for _, path in pairs(vim.api.nvim_list_runtime_paths()) do
+            vim.opt_local.path:append(path .. "/lua")
+          end
+        end,
       },
     },
     {
       "FileType",
       {
         group = "_buffer_mappings",
-        pattern = { "qf", "help", "man", "floaterm", "lspinfo", "lsp-installer", "null-ls-info" },
-        command = "nnoremap <silent> <buffer> q :close<CR>",
+        pattern = {
+          "qf",
+          "help",
+          "man",
+          "floaterm",
+          "lspinfo",
+          "lir",
+          "lsp-installer",
+          "null-ls-info",
+          "tsplayground",
+          "DressingSelect",
+          "Jaq",
+        },
+        callback = function()
+          vim.keymap.set("n", "q", "<cmd>close<cr>", { buffer = true })
+          vim.opt_local.buflisted = false
+        end,
       },
     },
     {