diff --git a/lua/plugins/telescope.lua b/lua/plugins/telescope.lua index b9ad9b4..49c586f 100644 --- a/lua/plugins/telescope.lua +++ b/lua/plugins/telescope.lua @@ -9,9 +9,6 @@ return { } local live_grep = { only_sort_text = true, - additional_args = function() - return { "--multiline" } - end, } if pcode.telescope_theme_find_file and pcode.telescope_theme_find_file ~= "center" then find_files = { @@ -23,9 +20,6 @@ return { live_grep = { theme = pcode.telescope_theme_live_grep, only_sort_text = true, - additional_args = function() - return { "--multiline" } - end, } end local actions = require("telescope.actions") diff --git a/lua/plugins/treesitter.lua b/lua/plugins/treesitter.lua new file mode 100644 index 0000000..e84b2c1 --- /dev/null +++ b/lua/plugins/treesitter.lua @@ -0,0 +1,186 @@ +return { + { + "nvim-treesitter/nvim-treesitter", + dependencies = { + { "nvim-treesitter/nvim-treesitter-context" }, + { + "JoosepAlviste/nvim-ts-context-commentstring", + lazy = true, + config = function() + require("ts_context_commentstring").setup({ + enable_autocmd = false, + }) + end, + }, + { + "windwp/nvim-autopairs", + lazy = true, + dependencies = "hrsh7th/nvim-cmp", + event = "InsertEnter", + opts = { + check_ts = true, + ts_config = { + lua = { "string", "source" }, + javascript = { "string", "template_string" }, + java = false, + }, + disable_filetype = { "TelescopePrompt", "spectre_panel" }, + fast_wrap = { + map = "", + chars = { "{", "[", "(", '"', "'", "`" }, + pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""), + offset = 0, -- Offset from pattern match + end_key = "$", + keys = "qwertyuiopzxcvbnmasdfghjkl", + check_comma = true, + highlight = "PmenuSel", + highlight_grey = "LineNr", + }, + }, + config = function(_, opts) + require("nvim-autopairs").setup(opts) + local cmp_autopairs = require("nvim-autopairs.completion.cmp") + local cmp_status_ok, cmp = pcall(require, "cmp") + if not cmp_status_ok then + return + end + cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done({ map_char = { tex = "" } })) + end, + }, + }, + version = false, -- last release is way too old and doesn't work on Windows + build = ":TSUpdate", + -- event = { "LazyFile", "VeryLazy" }, + lazy = true, + cmd = { + "TSInstall", + "TSUninstall", + "TSUpdate", + "TSUpdateSync", + "TSInstallInfo", + "TSInstallSync", + "TSInstallFromGrammar", + }, + event = { "BufRead", "VeryLazy" }, + opts = function() + return { + highlight = { enable = true }, + indent = { enable = true }, + ensure_installed = {}, + incremental_selection = { + enable = true, + }, + autopairs = { + enable = true, + }, + } + end, + config = function(_, opts) + if type(opts.ensure_installed) == "table" then + ---@type table + local added = {} + opts.ensure_installed = vim.tbl_filter(function(lang) + if added[lang] then + return false + end + added[lang] = true + return true + end, opts.ensure_installed) + end + require("nvim-treesitter.configs").setup(opts) + vim.schedule(function() + require("lazy").load({ plugins = { "nvim-treesitter-textobjects" } }) + end) + end, + }, + { + "nvim-treesitter/nvim-treesitter-textobjects", + lazy = true, + config = function() + -- When in diff mode, we want to use the default + -- vim text objects c & C instead of the treesitter ones. + local move = require("nvim-treesitter.textobjects.move") ---@type table + local configs = require("nvim-treesitter.configs") + for name, fn in pairs(move) do + if name:find("goto") == 1 then + move[name] = function(q, ...) + if vim.wo.diff then + local config = configs.get_module("textobjects.move")[name] ---@type table + for key, query in pairs(config or {}) do + if q == query and key:find("[%]%[][cC]") then + vim.cmd("normal! " .. key) + return + end + end + end + return fn(q, ...) + end + end + end + end, + }, + -- Automatically add closing tags for HTML and JSX + { + "windwp/nvim-ts-autotag", + lazy = true, + event = "BufRead", + opts = {}, + }, + + { + "RRethy/vim-illuminate", + lazy = true, + event = "BufRead", + opts = { + options = { + -- providers: provider used to get references in the buffer, ordered by priority + providers = { + "lsp", + "treesitter", + "regex", + }, + -- delay: delay in milliseconds + delay = 120, + -- filetype_overrides: filetype specific overrides. + -- The keys are strings to represent the filetype while the values are tables that + -- supports the same keys passed to .configure except for filetypes_denylist and filetypes_allowlist + filetype_overrides = {}, + -- filetypes_denylist: filetypes to not illuminate, this overrides filetypes_allowlist + filetypes_denylist = { + "dirvish", + "fugitive", + "alpha", + "NvimTree", + "lazy", + "neogitstatus", + "Trouble", + "lir", + "Outline", + "spectre_panel", + "toggleterm", + "DressingSelect", + "TelescopePrompt", + }, + -- filetypes_allowlist: filetypes to illuminate, this is overridden by filetypes_denylist + filetypes_allowlist = {}, + -- modes_denylist: modes to not illuminate, this overrides modes_allowlist + modes_denylist = {}, + -- modes_allowlist: modes to illuminate, this is overridden by modes_denylist + modes_allowlist = {}, + -- providers_regex_syntax_denylist: syntax to not illuminate, this overrides providers_regex_syntax_allowlist + -- Only applies to the 'regex' provider + -- Use :echom synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name') + providers_regex_syntax_denylist = {}, + -- providers_regex_syntax_allowlist: syntax to illuminate, this is overridden by providers_regex_syntax_denylist + -- Only applies to the 'regex' provider + -- Use :echom synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name') + providers_regex_syntax_allowlist = {}, + -- under_cursor: whether or not to illuminate under the cursor + under_cursor = true, + }, + }, + config = function(_, opts) + require("illuminate").configure(opts) + end, + }, +} diff --git a/lua/plugins/treesitter_blade.lua b/lua/plugins/treesitter_blade.lua new file mode 100644 index 0000000..1026804 --- /dev/null +++ b/lua/plugins/treesitter_blade.lua @@ -0,0 +1,36 @@ +local ts_list = { + "lua", + "vim", + "vimdoc", +} +for _, ts in pairs(pcode.treesitter_ensure_installed or {}) do + table.insert(ts_list, ts) +end +return { + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = ts_list, + }, + config = function(_, opts) + local parser_config = require("nvim-treesitter.parsers").get_parser_configs() + + parser_config.blade = { + install_info = { + url = "https://github.com/EmranMR/tree-sitter-blade", + files = { "src/parser.c" }, + branch = "main", + }, + filetype = "blade", + } + + vim.filetype.add({ + pattern = { + [".*%.blade%.php"] = "blade", + }, + }) + + require("nvim-treesitter.configs").setup(opts) + end, + }, +} diff --git a/lua/user/lsp/handlers.lua b/lua/user/lsp/handlers.lua index 3ef7adc..7292e3c 100644 --- a/lua/user/lsp/handlers.lua +++ b/lua/user/lsp/handlers.lua @@ -2,7 +2,7 @@ local M = {} local status_cmp_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") if not status_cmp_ok then - return + return end local lspvitualtext = pcode.lsp_virtualtext or false @@ -13,135 +13,95 @@ M.capabilities.textDocument.completion.completionItem.snippetSupport = true M.capabilities = cmp_nvim_lsp.default_capabilities(M.capabilities) M.setup = function() - local signs = { - { name = "DiagnosticSignError", text = icons.diagnostics.Error }, - { name = "DiagnosticSignWarn", text = icons.diagnostics.Warning }, - { name = "DiagnosticSignHint", text = icons.diagnostics.Hint }, - { name = "DiagnosticSignInfo", text = icons.diagnostics.Info }, - } + local signs = { + { name = "DiagnosticSignError", text = icons.diagnostics.Error }, + { name = "DiagnosticSignWarn", text = icons.diagnostics.Warning }, + { name = "DiagnosticSignHint", text = icons.diagnostics.Hint }, + { name = "DiagnosticSignInfo", text = icons.diagnostics.Info }, + } - for _, sign in ipairs(signs) do - vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" }) - end + for _, sign in ipairs(signs) do + vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" }) + end - local config = { - virtual_text = lspvitualtext, -- disable virtual text - signs = { - active = signs, -- show signs - }, - update_in_insert = true, - underline = true, - severity_sort = true, - float = { - focusable = true, - style = "minimal", - border = "rounded", - source = "always", - header = "", - prefix = "", - }, - } + local config = { + virtual_text = lspvitualtext, -- disable virtual text + signs = { + active = signs, -- show signs + }, + update_in_insert = true, + underline = true, + severity_sort = true, + float = { + focusable = true, + style = "minimal", + border = "rounded", + source = "always", + header = "", + prefix = "", + }, + } - vim.diagnostic.config(config) + vim.diagnostic.config(config) - vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { - border = "rounded", - }) + vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { + border = "rounded", + }) - vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { - border = "rounded", - }) + vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { + border = "rounded", + }) end local function attach_navic(client, bufnr) - vim.g.navic_silence = true - local status_ok, navic = pcall(require, "nvim-navic") - if not status_ok then - return - end - navic.attach(client, bufnr) + vim.g.navic_silence = true + local status_ok, navic = pcall(require, "nvim-navic") + if not status_ok then + return + end + navic.attach(client, bufnr) end -function FORMAT_FILTER(client) - local filetype = vim.bo.filetype - local n = require("null-ls") - local s = require("null-ls.sources") - local method = n.methods.FORMATTING - local available_formatters = s.get_available(filetype, method) - - if #available_formatters > 0 then - return client.name == "null-ls" - elseif client.supports_method("textDocument/formatting") then - return true - else - return false - end -end - --- stylua: ignore -local function lsp_keymaps(bufnr, on_save) - local opts = { noremap = true, silent = true } - local keymap = vim.api.nvim_buf_set_keymap - keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) - keymap(bufnr, "n", "gd", "lua vim.lsp.buf.definition()", opts) - keymap(bufnr, "n", "K", "lua vim.lsp.buf.hover()", opts) - keymap(bufnr, "n", "gI", "lua vim.lsp.buf.implementation()", opts) - keymap(bufnr, "n", "gr", "lua vim.lsp.buf.references()", opts) - keymap(bufnr, "n", "gl", "lua vim.diagnostic.open_float()", opts) - keymap(bufnr, "n", "lf", "lua vim.lsp.buf.format{ async = true }", opts) - keymap(bufnr, "n", "li", "LspInfo", opts) - keymap(bufnr, "n", "lI", "Mason", opts) - keymap(bufnr, "n", "la", "lua vim.lsp.buf.code_action()", opts) - keymap(bufnr, "n", "lj", "lua vim.diagnostic.goto_next({buffer=0})", opts) - keymap(bufnr, "n", "lk", "lua vim.diagnostic.goto_prev({buffer=0})", opts) - keymap(bufnr, "n", "lr", "lua vim.lsp.buf.rename()", opts) - keymap(bufnr, "n", "ls", "lua vim.lsp.buf.signature_help()", opts) - keymap(bufnr, "n", "lq", "lua vim.diagnostic.setloclist()", opts) - if on_save then - local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) - vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) - vim.api.nvim_create_autocmd("BufWritePre", { - group = augroup, - buffer = bufnr, - callback = function() - vim.lsp.buf.format({ bufnr = bufnr, timeout_ms = pcode.format_timeout_ms or 5000, filter = FORMAT_FILTER }) - end, - }) - else - vim.schedule(function() - pcall(function() - vim.api.nvim_clear_autocmds({ group = "LspFormatting" }) - end) - end) - end +local function lsp_keymaps(bufnr) + local opts = { noremap = true, silent = true } + local keymap = vim.api.nvim_buf_set_keymap + keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) + keymap(bufnr, "n", "gd", "lua vim.lsp.buf.definition()", opts) + keymap(bufnr, "n", "K", "lua vim.lsp.buf.hover()", opts) + keymap(bufnr, "n", "gI", "lua vim.lsp.buf.implementation()", opts) + keymap(bufnr, "n", "gr", "lua vim.lsp.buf.references()", opts) + keymap(bufnr, "n", "gl", "lua vim.diagnostic.open_float()", opts) + keymap(bufnr, "n", "lf", "lua vim.lsp.buf.format{ async = true }", opts) + keymap(bufnr, "n", "li", "LspInfo", opts) + keymap(bufnr, "n", "lI", "Mason", opts) + keymap(bufnr, "n", "la", "lua vim.lsp.buf.code_action()", opts) + keymap(bufnr, "n", "lj", "lua vim.diagnostic.goto_next({buffer=0})", opts) + keymap(bufnr, "n", "lk", "lua vim.diagnostic.goto_prev({buffer=0})", opts) + keymap(bufnr, "n", "lr", "lua vim.lsp.buf.rename()", opts) + keymap(bufnr, "n", "ls", "lua vim.lsp.buf.signature_help()", opts) + keymap(bufnr, "n", "lq", "lua vim.diagnostic.setloclist()", opts) end M.on_attach = function(client, bufnr) - attach_navic(client, bufnr) - if client.name == "tsserver" then - client.server_capabilities.documentFormattingProvider = false - end + attach_navic(client, bufnr) + if client.name == "tsserver" then + client.server_capabilities.documentFormattingProvider = false + end - if client.name == "lua_ls" then - client.server_capabilities.documentFormattingProvider = false - end + if client.name == "lua_ls" then + client.server_capabilities.documentFormattingProvider = false + end - if client.supports_method("textDocument/inlayHint") then - -- vim.lsp.inlay_hint.enable(bufnr, true) - vim.lsp.inlay_hint.enable(true) - end + if client.supports_method("textDocument/inlayHint") then + -- vim.lsp.inlay_hint.enable(bufnr, true) + vim.lsp.inlay_hint.enable(true) + end - local on_save = pcode.format_on_save or false - -- disable if conform active - local status, _ = pcall(require, "conform") - if status then - on_save = false - end - lsp_keymaps(bufnr, on_save) - local status_ok, illuminate = pcall(require, "illuminate") - if not status_ok then - return - end - illuminate.on_attach(client) + lsp_keymaps(bufnr) + local status_ok, illuminate = pcall(require, "illuminate") + if not status_ok then + return + end + illuminate.on_attach(client) end return M diff --git a/lua/user/lsp/settings/lua_ls.lua b/lua/user/lsp/settings/lua_ls.lua index f711a41..5b4d132 100644 --- a/lua/user/lsp/settings/lua_ls.lua +++ b/lua/user/lsp/settings/lua_ls.lua @@ -1,41 +1,38 @@ -- https://luals.github.io/wiki/settings/ return { - settings = { - Lua = { - format = { - enable = false, - }, - diagnostics = { - globals = { "vim", "spec" }, - }, - runtime = { - version = "LuaJIT", - special = { - spec = "require", - }, - }, - -- workspace = { - -- checkThirdParty = false, - -- library = { - -- [vim.fn.expand("$VIMRUNTIME/lua")] = true, - -- [vim.fn.stdpath("config") .. "/lua"] = true, - -- }, - -- }, - workspace = { - checkThirdParty = false, - }, - hint = { - enable = false, - arrayIndex = "Disable", -- "Enable" | "Auto" | "Disable" - await = true, - paramName = "Disable", -- "All" | "Literal" | "Disable" - paramType = true, - semicolon = "All", -- "All" | "SameLine" | "Disable" - setType = false, - }, - telemetry = { - enable = false, - }, - }, - }, + settings = { + Lua = { + format = { + enable = false, + }, + diagnostics = { + globals = { "vim", "spec" }, + }, + runtime = { + version = "LuaJIT", + special = { + spec = "require", + }, + }, + workspace = { + checkThirdParty = false, + library = { + [vim.fn.expand("$VIMRUNTIME/lua")] = true, + [vim.fn.stdpath("config") .. "/lua"] = true, + }, + }, + hint = { + enable = false, + arrayIndex = "Disable", -- "Enable" | "Auto" | "Disable" + await = true, + paramName = "Disable", -- "All" | "Literal" | "Disable" + paramType = true, + semicolon = "All", -- "All" | "SameLine" | "Disable" + setType = false, + }, + telemetry = { + enable = false, + }, + }, + }, } diff --git a/lua/user/lsp/settings/stimulus_ls.lua b/lua/user/lsp/settings/stimulus_ls.lua index 682198d..bf53a0b 100644 --- a/lua/user/lsp/settings/stimulus_ls.lua +++ b/lua/user/lsp/settings/stimulus_ls.lua @@ -1,5 +1,4 @@ return { - filetypes = { "blade" }, root_dir = require("lspconfig.util").root_pattern("composer.json", ".git") or vim.loop.cwd() or vim.fn.getcwd(), singe_file_support = true, } diff --git a/lua/user/utils/formatter.lua b/lua/user/utils/formatter.lua index 1fba9cb..32cf578 100644 --- a/lua/user/utils/formatter.lua +++ b/lua/user/utils/formatter.lua @@ -1,14 +1,10 @@ -local ok, null_ls = pcall(require, "null-ls") +local null_ls = require("null-ls") local M = {} M.list_registered = function(filetype) - if ok then - local method = null_ls.methods.FORMATTING - local registered_providers = require("user.utils.lsp").list_registered_providers_names(filetype) - return registered_providers[method] or {} - else - return {} - end + local method = null_ls.methods.FORMATTING + local registered_providers = require("user.utils.lsp").list_registered_providers_names(filetype) + return registered_providers[method] or {} end M.list_registered_all = function() diff --git a/lua/user/utils/linter.lua b/lua/user/utils/linter.lua index 5fbb7b5..3ab99e4 100644 --- a/lua/user/utils/linter.lua +++ b/lua/user/utils/linter.lua @@ -1,27 +1,19 @@ -local ok, null_ls = pcall(require, "null-ls") +local null_ls = require("null-ls") local M = {} -if ok then - M.alternative_methods = { - null_ls.methods.DIAGNOSTICS, - null_ls.methods.DIAGNOSTICS_ON_OPEN, - null_ls.methods.DIAGNOSTICS_ON_SAVE, - } -else - M.alternative_methods = {} -end +M.alternative_methods = { + null_ls.methods.DIAGNOSTICS, + null_ls.methods.DIAGNOSTICS_ON_OPEN, + null_ls.methods.DIAGNOSTICS_ON_SAVE, +} M.linter_list_registered = function(filetype) - if ok then - local registered_providers = require("user.utils.lsp").list_registered_providers_names(filetype) - local providers_for_methods = vim.iter(vim.tbl_map(function(m) - return registered_providers[m] or {} - end, M.alternative_methods)) + local registered_providers = require("user.utils.lsp").list_registered_providers_names(filetype) + local providers_for_methods = vim.iter(vim.tbl_map(function(m) + return registered_providers[m] or {} + end, M.alternative_methods)) - return providers_for_methods - else - return {} - end + return providers_for_methods end return M diff --git a/lua/user/utils/lualine_component.lua b/lua/user/utils/lualine_component.lua index e2ba53c..dc6e0c4 100644 --- a/lua/user/utils/lualine_component.lua +++ b/lua/user/utils/lualine_component.lua @@ -93,8 +93,7 @@ return { if type(msg) == "boolean" or #msg == 0 then return "LSP Inactive" end - -- return msg - table.insert(buf_client_names, msg) + return msg end -- add client for _, client in pairs(buf_clients) do