-- import lspconfig plugin safely local lspconfig_status, lspconfig = pcall(require, "lspconfig") if not lspconfig_status then return end -- 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 aviable 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 >------------------------------ 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" -- You can also use "single", "double", or "shadow" return orig_floating_preview(contents, syntax, opts, ...) end ---------- lua vim.lsp.buf.document_symbol()", opts) -- keymap.set("n", "gr", "lua vim.lsp.buf.references()", opts) keymap.set("n", "gD", "lua vim.lsp.buf.declaration()", opts) -- got to declaration -- keymap.set("n", "gd", "lua vim.lsp.buf.definition()", opts) -- see definition and make edits in window keymap.set("n", "gd", "Telescope lsp_definitions", opts) -- see definition and make edits in window keymap.set("n", "gi", "lua vim.lsp.buf.implementation()", opts) -- go to implementation -- keymap.set("n", "l", "lua vim.lsp.buf.format()", opts) -- format code keymap.set("n", "l", smart_format, opts) -- format code keymap.set("n", "rn", "lua vim.lsp.buf.rename()", opts) -- format code -- keymap.set("n", "ca", "lua vim.lsp.buf.code_action()", opts) -- see available code actions -- keymap.set("n", "ed", "Telescope diagnostics", opts) -- jump to previous diagnostic in buffer -- keymap.set("n", "K", "lua vim.lsp.buf.hover()", opts) -- show documentation for what is under cursor keymap.set( "n", "cbf", ":!phpcbf -w --standard=PSR12 %", { noremap = true, silent = false, buffer = bufnr } ) keymap.set("n", "o", "Lspsaga outline", opts) -- see outline on right hand side keymap.set("n", "ss", "Telescope lsp_dynamic_workspace_symbols", opts) -- workspace symbols -- LSP Saga keymap.set("n", "gsd", "Lspsaga peek_definition", opts) -- see definition and make edits in window keymap.set("n", "gr", "Lspsaga finder", opts) -- see definition and make edits in window keymap.set("n", "rn", "Lspsaga rename", opts) -- smart rename keymap.set("n", "ca", "Lspsaga code_action", opts) -- see available code actions -- keymap.set("n", "K", "Lspsaga hover_doc", opts) -- show documentation for what is under cursor keymap.set("n", "ge", "Lspsaga show_line_diagnostics", opts) -- show diagnostics for line keymap.set("n", "", "Lspsaga code_action", opts) -- diagnostic keymap.set("n", "d", "Telescope diagnostics", opts) -- jump to previous diagnostic in buffer -- keymap.set("n", "d", "Lspsaga show_buf_diagnostics") keymap.set("n", "dn", "Lspsaga diagnostic_jump_next") -- jump to next diagnostic in buffer keymap.set("n", "dp", "Lspsaga diagnostic_jump_prev") -- jump to previous diagnostic in buffer keymap.set("n", "gj", "lua require'nvim-treesitter.textobjects.move'.goto_next_start('@function.outer')", opts) -- jump to next method keymap.set("n", "gk", "lua require'nvim-treesitter.textobjects.move'.goto_previous_start('@function.outer')", opts) -- jump to previous method end -- used to enable autocompletion (assign to every lsp server config) local capabilities = cmp_nvim_lsp.default_capabilities() lspconfig["bashls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "sh", "bin" }, }) -- XML LSP lspconfig["lemminx"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "xml" }, }) -- yaml LSP lspconfig["yamlls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "yaml", "yml" }, }) -- json LSP lspconfig["jsonls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "json" }, }) lspconfig["pyright"].setup({ on_attach = on_attach, filetypes = { "py" }, }) -- configure html server lspconfig["html"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "html" }, }) -- configure css server lspconfig["cssls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) -- configure tailwindcss server lspconfig["tailwindcss"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) -- configure emmet language server lspconfig["emmet_ls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) lspconfig["eslint"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte" }, }) -- rust lspconfig["rust_analyzer"].setup({ on_attach = on_attach, capabilities = capabilities, -- Server-specific settings... settings = { ["rust-analyzer"] = { -- enable clippy on save checkOnSave = true, }, }, }) lspconfig["yamlls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "yml", "yaml" }, }) -- -- configure lua server (with special settings) lspconfig["lua_ls"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "lua" }, }) local util = require("lspconfig.util") local fallback_root_dir = function(fname) return util.root_pattern("composer.json", ".git")(fname) or util.path.dirname(fname) end lspconfig["phpactor"].setup({ on_attach = on_attach, capabilities = capabilities, init_options = { ["language_server_phpstan.enabled"] = true, ["language_server_psalm.enabled"] = false, }, filetypes = { "php" }, root_dir = fallback_root_dir, }) lspconfig["intelephense"].setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "php" }, init_options = { licenceKey = vim.fn.readfile(vim.fn.expand("$HOME/.config/intelephense/license.txt"))[1], }, root_dir = fallback_root_dir, settings = { intelephense = { -- ✅ Enable property inference (Pro) telemetry = { enabled = false }, -- optional, privacy files = { maxSize = 5000000, -- increase if needed associations = { "**/*.php" }, }, -- environment = { -- includePaths = { -- "/path/to/your/stubs", -- ⬅️ Your custom stub folder -- }, -- }, completion = { fullyQualifyGlobalConstantsAndFunctions = false, triggerParameterHints = true, maxItems = 100, }, -- enables smarter inference phpdoc = { enabled = true, }, diagnostics = { enable = true, }, format = { enable = false, -- you’re using `phpcbf` anyway }, }, }, }) lspconfig["slint_lsp"].setup({ on_attach = on_attach, capabilities = capabilities, filetypes = { "slint" }, }) 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 end if vim.loop.fs_stat(phpcs_config) then vim.g.nvim_phpcs_config_phpcs_standard = phpcs_config end