-- lsp.lua (replace your current file with this) -- import cmp-nvim-lsp plugin safely local cmp_nvim_lsp_status, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") if not cmp_nvim_lsp_status then return end local keymap = vim.keymap -- for conciseness -- smart format with null-ls if available local function smart_format() vim.lsp.buf.format({ filter = function(client) local ft = vim.bo.filetype if ft == "rust" then return client.name == "rust_analyzer" end -- Prefer null-ls for all non-Rust, otherwise allow anything if vim.tbl_contains({ "null-ls", "lua_ls", "jsonls", "tsserver" }, client.name) then return true end return false end, timeout_ms = 3000, }) end ---------- border >------------------------------ do local orig_floating_preview = vim.lsp.util.open_floating_preview vim.lsp.util.open_floating_preview = function(contents, syntax, opts, ...) opts = opts or {} opts.border = "rounded" return orig_floating_preview(contents, syntax, opts, ...) end end ---------- lua vim.lsp.buf.document_symbol()", opts) keymap.set("n", "gd", "Telescope lsp_definitions", opts) keymap.set("n", "gi", "lua vim.lsp.buf.implementation()", opts) keymap.set("n", "l", smart_format, opts) keymap.set("n", "rn", "lua vim.lsp.buf.rename()", opts) keymap.set( "n", "cbf", ":!phpcbf -w --standard=PSR12 %", { noremap = true, silent = false, buffer = bufnr } ) keymap.set("n", "o", "Lspsaga outline", opts) keymap.set("n", "ss", "Telescope lsp_dynamic_workspace_symbols", opts) -- LSP Saga keymap.set("n", "gsd", "Lspsaga peek_definition", opts) keymap.set("n", "gr", "Lspsaga finder", opts) keymap.set("n", "rn", "Lspsaga rename", opts) keymap.set("n", "ca", "Lspsaga code_action", opts) keymap.set("n", "ge", "Lspsaga show_line_diagnostics", opts) keymap.set("n", "", "Lspsaga code_action", opts) keymap.set("n", "d", "Telescope diagnostics", opts) keymap.set("n", "dn", "Lspsaga diagnostic_jump_next") keymap.set("n", "dp", "Lspsaga diagnostic_jump_prev") keymap.set("n", "gj", "lua require'nvim-treesitter.textobjects.move'.goto_next_start('@function.outer')", opts) keymap.set("n", "gk", "lua require'nvim-treesitter.textobjects.move'.goto_previous_start('@function.outer')", opts) end -- capabilities local capabilities = cmp_nvim_lsp.default_capabilities() -- helper for registering server configs (lazy attach) local function setup_server(name, config) local cfg = vim.tbl_deep_extend("force", { capabilities = capabilities, on_attach = on_attach, }, config or {}) -- register the config -- use the function form so it works in latest nvim vim.lsp.config(name, cfg) end -- servers setup_server("bashls", { filetypes = { "sh", "bin" } }) setup_server("lemminx", { filetypes = { "xml" } }) setup_server("yamlls", { filetypes = { "yaml", "yml" } }) setup_server("jsonls", { filetypes = { "json" } }) setup_server("pyright", { filetypes = { "py" } }) setup_server("html", { filetypes = { "html" } }) setup_server("cssls", { filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" } }) setup_server("tailwindcss", { filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) setup_server("emmet_ls", { filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) setup_server("eslint", { filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) setup_server("rust_analyzer", { settings = { ["rust-analyzer"] = { checkOnSave = true }, }, }) setup_server("lua_ls", { filetypes = { "lua" } }) -- setup_server("slint_lsp", { filetypes = { "slint" } }) -- PHP LSPs local util = require("lspconfig.util") root_dir = function(fname) return util.root_pattern("composer.json", ".git")(fname) or util.path.dirname(fname) end setup_server("phpactor", { filetypes = { "php" }, root_dir = fallback_root_dir, init_options = { ["language_server_phpstan.enabled"] = true, ["language_server_psalm.enabled"] = false, }, }) setup_server("intelephense", { filetypes = { "php" }, root_dir = fallback_root_dir, init_options = { licenceKey = vim.fn.readfile(vim.fn.expand("$HOME/.config/intelephense/license.txt"))[1], }, settings = { intelephense = { telemetry = { enabled = false }, files = { maxSize = 5000000, associations = { "**/*.php" }, }, completion = { fullyQualifyGlobalConstantsAndFunctions = false, triggerParameterHints = true, maxItems = 100, }, phpdoc = { enabled = true }, diagnostics = { enable = true }, format = { enable = false }, }, }, }) -- phpcs / phpstan configs vim.g.nvim_phpcs_config_phpcs_path = 'phpcs' vim.g.nvim_phpcs_config_phpcbf_path = 'phpcbf' vim.g.ale_php_phpstan_executable = '/home/mace/.config/composer/vendor/bin/phpstan' local phpcs_config = "/home/mace/repos/configs/phpcs.xml" local phpcs_config_new = "/home/mace/repos/dotfiles/phpcs.xml" if vim.loop.fs_stat(phpcs_config_new) then vim.g.nvim_phpcs_config_phpcs_standard = phpcs_config_new elseif vim.loop.fs_stat(phpcs_config) then vim.g.nvim_phpcs_config_phpcs_standard = phpcs_config end -- === ENABLE: tell Neovim to autostart these configs lazily (filetype + root_dir) -- call this early in your init (so FileType autocommands are installed before opening files) local enabled_servers = { "bashls", "lemminx", "yamlls", "jsonls", "pyright", "html", "cssls", "tailwindcss", "emmet_ls", "eslint", "rust_analyzer", "lua_ls", "phpactor", "intelephense" } vim.lsp.enable(enabled_servers)