aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-11-19 00:39:11 +0800
committercrupest <crupest@outlook.com>2023-11-19 00:39:11 +0800
commit61a6cc36e4f0309523a4a0f42174460999e536e6 (patch)
tree0fa6e76f7f6ef734d4fb1b866cb531dd53c3b59f
parent78dca2c748a27a2d37741cea159f981f1d325792 (diff)
downloadcrupest-61a6cc36e4f0309523a4a0f42174460999e536e6.tar.gz
crupest-61a6cc36e4f0309523a4a0f42174460999e536e6.tar.bz2
crupest-61a6cc36e4f0309523a4a0f42174460999e536e6.zip
config(nvim): refactor lint, make all lint optional.
-rw-r--r--configs/nvim/init.lua8
-rw-r--r--configs/nvim/lazy-lock.json20
-rw-r--r--configs/nvim/lua/crupest/nvim/plugins/format.lua114
-rw-r--r--configs/nvim/lua/crupest/nvim/plugins/lint.lua90
-rw-r--r--configs/nvim/lua/crupest/nvim/plugins/snip.lua2
-rw-r--r--configs/nvim/lua/crupest/system/find.lua100
-rw-r--r--configs/nvim/lua/crupest/table.lua14
7 files changed, 285 insertions, 63 deletions
diff --git a/configs/nvim/init.lua b/configs/nvim/init.lua
index 9e4c742..b57c0bf 100644
--- a/configs/nvim/init.lua
+++ b/configs/nvim/init.lua
@@ -93,9 +93,9 @@ require("nvim-autopairs").setup {}
-- setup gitsigns
require('gitsigns').setup()
--- setup formatter
-local formatter = require("crupest.nvim.plugins.formatter")
-formatter.setup_formatter()
+-- setup format
+local format = require("crupest.nvim.plugins.format")
+format.setup_formatter()
-- setup lint
local lint = require("crupest.nvim.plugins.lint")
@@ -169,7 +169,7 @@ vim.api.nvim_create_autocmd('LspAttach', {
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
- vim.keymap.set('n', '<space>f', formatter.run_formatter, opts)
+ vim.keymap.set('n', '<space>f', format.run_formatter, opts)
end,
})
diff --git a/configs/nvim/lazy-lock.json b/configs/nvim/lazy-lock.json
index 2deb237..2f0730a 100644
--- a/configs/nvim/lazy-lock.json
+++ b/configs/nvim/lazy-lock.json
@@ -1,24 +1,24 @@
{
- "LuaSnip": { "branch": "master", "commit": "80a8528f084a97b624ae443a6f50ff8074ba486b" },
+ "LuaSnip": { "branch": "master", "commit": "1f4ad8bb72bdeb60975e98652636b991a9b7475d" },
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
"cmp-cmdline": { "branch": "main", "commit": "8ee981b4a91f536f52add291594e89fb6645e451" },
"cmp-nvim-lsp": { "branch": "main", "commit": "44b16d11215dce86f253ce0c30949813c0a90765" },
"cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
"cmp_luasnip": { "branch": "master", "commit": "05a9ab28b53f71d1aece421ef32fee2cb857a843" },
"everforest": { "branch": "master", "commit": "72f101bd63228a1a45012325e39c5280ec22c828" },
- "formatter.nvim": { "branch": "master", "commit": "34dcdfa0c75df667743b2a50dd99c84a557376f0" },
- "gitsigns.nvim": { "branch": "main", "commit": "af0f583cd35286dd6f0e3ed52622728703237e50" },
- "lazy.nvim": { "branch": "main", "commit": "16603c6917435d8446f7357cb61095138a417085" },
+ "formatter.nvim": { "branch": "master", "commit": "91651e6afaf6f73b0ffb8b433c06cd4e06f90403" },
+ "gitsigns.nvim": { "branch": "main", "commit": "0ccd5fb2316b3f8d8b2f775bc31cae7bc6a77a55" },
+ "lazy.nvim": { "branch": "main", "commit": "96584866b9c5e998cbae300594d0ccfd0c464627" },
"lualine.nvim": { "branch": "master", "commit": "2248ef254d0a1488a72041cfb45ca9caada6d994" },
- "neo-tree.nvim": { "branch": "main", "commit": "936b029e514adc1fa7ab51c6c1a8a2c872a58797" },
+ "neo-tree.nvim": { "branch": "main", "commit": "f86e871584bd3c5a00b4ff8344305889eb52ebff" },
"nui.nvim": { "branch": "main", "commit": "c0c8e347ceac53030f5c1ece1c5a5b6a17a25b32" },
"nvim-autopairs": { "branch": "master", "commit": "0f04d78619cce9a5af4f355968040f7d675854a1" },
- "nvim-cmp": { "branch": "main", "commit": "51260c02a8ffded8e16162dcf41a23ec90cfba62" },
- "nvim-lint": { "branch": "master", "commit": "962a76877a4479a535b935bd7ef35ad41ba308b2" },
- "nvim-lspconfig": { "branch": "master", "commit": "d0467b9574b48429debf83f8248d8cee79562586" },
- "nvim-web-devicons": { "branch": "master", "commit": "5de460ca7595806044eced31e3c36c159a493857" },
+ "nvim-cmp": { "branch": "main", "commit": "0b751f6beef40fd47375eaf53d3057e0bfa317e4" },
+ "nvim-lint": { "branch": "master", "commit": "15fcab91e6a4e2a3e41dc55c5b3471f66c11ce39" },
+ "nvim-lspconfig": { "branch": "master", "commit": "7384e7149e79365c96dc623d9fa3444737776982" },
+ "nvim-web-devicons": { "branch": "master", "commit": "3523d6e6d40ab11fd66c1b2732b3d6b60affa951" },
"omnisharp-extended-lsp.nvim": { "branch": "main", "commit": "53edfb413a54c9e55dcddc9e9fa4977a897e4425" },
"plenary.nvim": { "branch": "master", "commit": "50012918b2fc8357b87cff2a7f7f0446e47da174" },
- "telescope.nvim": { "branch": "master", "commit": "4522d7e3ea75ffddabdc39957168a8a7060b5df0" },
+ "telescope.nvim": { "branch": "master", "commit": "18774ec7929c8a8003a91e9e1f69f6c32258bbfe" },
"toggleterm.nvim": { "branch": "main", "commit": "c80844fd52ba76f48fabf83e2b9f9b93273f418d" }
} \ No newline at end of file
diff --git a/configs/nvim/lua/crupest/nvim/plugins/format.lua b/configs/nvim/lua/crupest/nvim/plugins/format.lua
new file mode 100644
index 0000000..9f6138f
--- /dev/null
+++ b/configs/nvim/lua/crupest/nvim/plugins/format.lua
@@ -0,0 +1,114 @@
+local fs = require("crupest.system.fs")
+local find_npm_exe = require("crupest.system.find").find_npm_exe;
+
+local prettier_formatter = function()
+ local current_buffer = vim.api.nvim_buf_get_name(0)
+ local prettier_exe = find_npm_exe(current_buffer, "prettier") or "prettier"
+
+ if vim.fn.has("win32") ~= 0 then
+ local escape = fs.escape_space
+ current_buffer = escape(current_buffer)
+ prettier_exe = escape(prettier_exe)
+ end
+
+ return {
+ exe = prettier_exe,
+ args = {
+ "--stdin-filepath",
+ current_buffer
+ },
+ stdin = true,
+ }
+end
+
+local formatters_for_filetype = {
+ html = {
+ prettier_formatter
+ },
+ css = {
+ prettier_formatter
+ },
+ javascript = {
+ prettier_formatter
+ },
+ javascriptreact = {
+ prettier_formatter
+ },
+ typescript = {
+ prettier_formatter
+ },
+ typescriptreact = {
+ prettier_formatter
+ }
+}
+
+local function get_formatter_name(formatter)
+ if formatter == prettier_formatter then return "prettier" end
+ return nil
+end
+
+local function get_formatter_name_list(formatters)
+ local result = {}
+ for _, formatter in ipairs(formatters) do
+ table.insert(result, get_formatter_name(formatter))
+ end
+ return result
+end
+
+local function setup_formatter()
+ require("formatter").setup {
+ filetype = formatters_for_filetype
+ }
+end
+
+
+local function get_custom_formatters(bufnr)
+ local filetype = vim.api.nvim_buf_get_option(bufnr, "filetype")
+ for ft, formatters in pairs(formatters_for_filetype) do
+ if filetype == ft then
+ return true, get_formatter_name_list(formatters)
+ end
+ end
+ return false, {}
+end
+
+local function run_formatter(opt)
+ if not opt then
+ opt = {}
+ end
+
+ if not opt.buf then
+ opt.buf = 0
+ end
+
+ local has_custom_formatter, formatter_names = get_custom_formatters(opt.buf)
+
+ local formatter_name_str = ""
+ for i, name in ipairs(formatter_names) do
+ if i == 1 then
+ formatter_name_str = name
+ else
+ formatter_name_str = formatter_name_str .. " " .. name
+ end
+ end
+
+ if has_custom_formatter then
+ print("Use custom formatters: " .. formatter_name_str .. ".")
+ vim.cmd("Format")
+ return
+ end
+
+ local has_lsp = vim.lsp.get_active_clients({ bufnr = 0 })
+ if has_lsp then
+ print("Use lsp formatter.")
+ vim.lsp.buf.format { async = true }
+ return
+ end
+
+ vim.notify("No formatters found.", vim.log.levels.ERROR);
+end
+
+return {
+ setup_formatter = setup_formatter,
+ run_formatter = run_formatter
+}
diff --git a/configs/nvim/lua/crupest/nvim/plugins/lint.lua b/configs/nvim/lua/crupest/nvim/plugins/lint.lua
index 46832bd..491c0d1 100644
--- a/configs/nvim/lua/crupest/nvim/plugins/lint.lua
+++ b/configs/nvim/lua/crupest/nvim/plugins/lint.lua
@@ -1,5 +1,5 @@
-local fs = require("crupest.system.fs")
local lint = require("lint")
+local find = require('crupest.system.find')
local cspell_config_filenames = {
".cspell.json",
@@ -15,70 +15,72 @@ local cspell_config_filenames = {
"cspell.yml",
}
-local cspell_enable_dirs = {}
+local frontend_file_type = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }
-local function detect_cspell(file)
- for _, dir in ipairs(cspell_enable_dirs) do
- if string.find(fs.full_path(file), dir, 0, true) == 1 then
- return true
- end
- end
- return fs.walk_up(file, function(current_path)
- for _, name in ipairs(cspell_config_filenames) do
- local cspell_config_file = current_path .. "/" .. name
- if fs.isfile(cspell_config_file) then
- table.insert(cspell_enable_dirs, current_path)
- return true
- end
- end
- return nil
- end) or false
-end
+local my_linters = {
+ {
+ name = "cspell",
+ exe_places = { "npm", "global" },
+ config_files = cspell_config_filenames,
+ },
+ {
+ name = "eslint",
+ exe_places = { "npm" },
+ filetypes = frontend_file_type,
+ config_files = { "package.json" }
+ },
+ {
+ name = "deno",
+ exe_places = { "global" },
+ filetypes = frontend_file_type,
+ config_files = { "deno.json", "deno.jsonc" }
+ }
+}
local function run_lint(opt)
if not opt then
opt = {}
end
- if not opt.file then
- opt.file = vim.api.nvim_buf_get_name(0)
+ if not opt.buf then
+ opt.buf = 0
end
- if opt.run_cspell == nil then
- opt.run_cspell = detect_cspell(opt.file)
+ local linters = {}
+
+ for _, l in ipairs(my_linters) do
+ local linter = find.find_exe_for_buf(opt.buf, l)
+ if linter then table.insert(linters, linter) end
end
- lint.try_lint()
- if opt.run_cspell then
- lint.try_lint("cspell")
+ local linter_names = {}
+
+ for _, linter in ipairs(linters) do
+ table.insert(linter_names, linter.name)
+ require('lint.linters.' .. linter.name).cmd = linter.exe_path
end
+
+ lint.try_lint(linter_names)
end
local function setup_lint()
- local linter_eslint = require("lint.linters.eslint")
-
- linter_eslint.cmd = function()
- local current_buffer = vim.api.nvim_buf_get_name(0)
- return require("crupest.system.find").find_npm_exe(current_buffer, "eslint")
+ if require('crupest.system').is_win then
+ for _, l in ipairs(my_linters) do
+ local name = l.name
+ local linter = require('lint.linters.' .. name)
+ if linter.cmd == 'cmd.exe' then
+ linter.cmd = linter.args[2]
+ end
+ table.remove(linter.args, 1)
+ table.remove(linter.args, 1)
+ end
end
- -- lint library use 'cmd /C' to run exe, but we don't need this, so explicitly
- -- set args to empty.
- linter_eslint.args = {}
- linter_eslint.append_fname = true
-
- lint.linters_by_ft = {
- javascript = { "eslint" },
- javascriptreact = { "eslint" },
- typescript = { "eslint" },
- typescriptreact = { "eslint" },
- }
-
vim.api.nvim_create_autocmd({ "BufWritePost" }, {
callback = function(opt)
run_lint({
- file = opt.file
+ buf = opt.buffer
})
end,
})
diff --git a/configs/nvim/lua/crupest/nvim/plugins/snip.lua b/configs/nvim/lua/crupest/nvim/plugins/snip.lua
index 1dde7d3..1cf1b7c 100644
--- a/configs/nvim/lua/crupest/nvim/plugins/snip.lua
+++ b/configs/nvim/lua/crupest/nvim/plugins/snip.lua
@@ -59,7 +59,7 @@ local function setup_snip()
f(copy, 1),
t("("),
i(0),
- t({") { }", "", ""}),
+ t({ ") { }", "", "" }),
f(copy, 1),
t("::~"),
f(copy, 1),
diff --git a/configs/nvim/lua/crupest/system/find.lua b/configs/nvim/lua/crupest/system/find.lua
index a2631a6..0876622 100644
--- a/configs/nvim/lua/crupest/system/find.lua
+++ b/configs/nvim/lua/crupest/system/find.lua
@@ -1,15 +1,17 @@
local system = require("crupest.system")
local fs = require("crupest.system.fs");
+local win_exe_exts = { "exe", "CMD", "cmd", "ps1" }
+
+
local function get_exe(path)
if system.is_win then
- local exts = { "exe", "CMD", "cmd", "ps1" }
- for _, ext in ipairs(exts) do
+ for _, ext in ipairs(win_exe_exts) do
if string.find(path, "%." .. ext .. "$") and fs.isfile(path) then
return path
end
end
- for _, ext in ipairs(exts) do
+ for _, ext in ipairs(win_exe_exts) do
local p = path .. "." .. ext
if fs.isfile(p) then return p end
end
@@ -23,6 +25,14 @@ local function get_exe(path)
return nil
end
+local function find_global_exe(name)
+ if vim.fn.executable(name) ~= 0 then
+ return name
+ end
+
+ return nil
+end
+
local function first_exe(paths)
for _, v in ipairs(paths) do
local exe = get_exe(v)
@@ -32,6 +42,44 @@ local function first_exe(paths)
return nil
end
+local function find_file_or_directory(path, name)
+ return fs.walk_up(path, function(current_path)
+ local p = current_path .. "/" .. name
+ if fs.isdir(p) then
+ return p, "directory"
+ elseif fs.isfile(p) then
+ return p, "file"
+ end
+ return nil
+ end)
+end
+
+local function find_file(path, name)
+ return fs.walk_up(path, function(current_path)
+ local p = current_path .. "/" .. name
+ if fs.isfile(p) then
+ return p
+ end
+ return nil
+ end)
+end
+
+local function find_files_or_directories(path, names)
+ for _, name in ipairs(names) do
+ local p, type = find_file_or_directory(path, name)
+ if p then return p, type end
+ end
+ return nil
+end
+
+local function find_files(path, names)
+ for _, name in ipairs(names) do
+ local p = find_file(path, name)
+ if p then return p end
+ end
+ return nil
+end
+
local function find_node_modules(path)
return fs.walk_up(path, function(current_path)
local node_modules_path = current_path .. "/node_modules"
@@ -51,9 +99,55 @@ local function find_npm_exe(path, exe)
return nil
end
+local function find_exe(path, exe, places)
+ for _, place in ipairs(places) do
+ if place == "npm" then
+ local r = find_npm_exe(path, exe)
+ if r then return r end
+ end
+ if place == "global" then
+ local r = find_global_exe(exe)
+ if r then return r end
+ end
+ end
+ return nil
+end
+
+local function find_exe_for_buf(buf, opts)
+ local r = {}
+ r.name = opts.name
+ r.file = vim.api.nvim_buf_get_name(buf)
+ r.filetype = vim.api.nvim_buf_get_option(buf, "filetype")
+ r.exe_name = opts.name
+ r.exe_places = opts.exe_places or { "global" }
+
+ if opts.config_files then
+ r.config_file = find_files(r.file, opts.config_files)
+ if r.config_file == nil then return nil end
+ end
+
+ if opts.filetypes then
+ if not require("crupest.table").includes(opts.filetypes, r.filetype) then
+ return nil
+ end
+ end
+
+ r.exe_path = find_exe(r.file, r.exe_name, r.exe_places)
+ if r.exe_path == nil then return nil end
+
+ return r
+end
+
return {
get_exe = get_exe,
+ find_global_exe = find_global_exe,
first_exe = first_exe,
+ find_file_or_directory = find_file_or_directory,
+ find_files_or_directories = find_files_or_directories,
+ find_file = find_file,
+ find_files = find_files,
find_node_modules = find_node_modules,
find_npm_exe = find_npm_exe,
+ find_exe = find_exe,
+ find_exe_for_buf = find_exe_for_buf,
}
diff --git a/configs/nvim/lua/crupest/table.lua b/configs/nvim/lua/crupest/table.lua
index ab069ce..22419b0 100644
--- a/configs/nvim/lua/crupest/table.lua
+++ b/configs/nvim/lua/crupest/table.lua
@@ -23,8 +23,20 @@ local function element_at(tbl, element)
return at
end
+local function includes(tbl, element)
+ for _, v in ipairs(tbl) do
+ if v == element then return true end
+ end
+ return false
+end
+
+local function string_start_with(str, prefix)
+ return string.find(str, prefix, 0, true) == 1
+end
+
return {
remove_element = remove_element,
element_at = element_at,
+ includes = includes,
+ string_start_with = string_start_with,
}
-