257 lines
9.2 KiB
Lua
257 lines
9.2 KiB
Lua
-- 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
|
||
---------- </border ------------------------------
|
||
vim.diagnostic.config({ virtual_lines = { current_line = true } })
|
||
|
||
-- enable keybinds only for when lsp server available
|
||
local on_attach = function(_, bufnr)
|
||
-- keybind options
|
||
local opts = { noremap = true, silent = true, buffer = bufnr }
|
||
|
||
keymap.set("n", "g0", "<cmd>lua vim.lsp.buf.document_symbol()<CR>", opts)
|
||
-- keymap.set("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts) keymap.set("n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts) -- got to declaration
|
||
-- keymap.set("n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts) -- see definition and make edits in window
|
||
keymap.set("n", "gd", "<cmd>Telescope lsp_definitions<CR>", opts) -- see definition and make edits in window
|
||
keymap.set("n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts) -- go to implementation
|
||
-- keymap.set("n", "<leader>l", "<cmd>lua vim.lsp.buf.format()<CR>", opts) -- format code
|
||
keymap.set("n", "<leader>l", smart_format, opts) -- format code
|
||
keymap.set("n", "<leader>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opts) -- format code
|
||
-- keymap.set("n", "<leader>ca", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts) -- see available code actions
|
||
-- keymap.set("n", "<leader>ed", "<cmd>Telescope diagnostics<CR>", opts) -- jump to previous diagnostic in buffer
|
||
-- keymap.set("n", "K", "<cmd>lua vim.lsp.buf.hover()<CR>", opts) -- show documentation for what is under cursor
|
||
keymap.set(
|
||
"n",
|
||
"<leader>cbf",
|
||
":!phpcbf -w --standard=PSR12 %<CR>",
|
||
{ noremap = true, silent = false, buffer = bufnr }
|
||
)
|
||
|
||
keymap.set("n", "<leader>o", "<cmd>Lspsaga outline<CR>", opts) -- see outline on right hand side
|
||
keymap.set("n", "<leader>ss", "<cmd>Telescope lsp_dynamic_workspace_symbols<CR>", opts) -- workspace symbols
|
||
|
||
|
||
-- LSP Saga
|
||
keymap.set("n", "gsd", "<cmd>Lspsaga peek_definition<CR>", opts) -- see definition and make edits in window
|
||
keymap.set("n", "gr", "<cmd>Lspsaga finder<CR>", opts) -- see definition and make edits in window
|
||
keymap.set("n", "<leader>rn", "<cmd>Lspsaga rename<CR>", opts) -- smart rename
|
||
keymap.set("n", "<leader>ca", "<cmd>Lspsaga code_action<CR>", opts) -- see available code actions
|
||
-- keymap.set("n", "K", "<cmd>Lspsaga hover_doc<CR>", opts) -- show documentation for what is under cursor
|
||
keymap.set("n", "ge", "<cmd>Lspsaga show_line_diagnostics<CR>", opts) -- show diagnostics for line
|
||
keymap.set("n", "<a-cr>", "<cmd>Lspsaga code_action<CR>", opts)
|
||
-- diagnostic
|
||
keymap.set("n", "<leader>d", "<cmd>Telescope diagnostics<CR>", opts) -- jump to previous diagnostic in buffer
|
||
-- keymap.set("n", "<leader>d", "<cmd>Lspsaga show_buf_diagnostics<CR>")
|
||
keymap.set("n", "<leader>dn", "<cmd>Lspsaga diagnostic_jump_next<CR>") -- jump to next diagnostic in buffer
|
||
keymap.set("n", "<leader>dp", "<cmd>Lspsaga diagnostic_jump_prev<CR>") -- jump to previous diagnostic in buffer
|
||
|
||
keymap.set("n", "gj", "<cmd>lua require'nvim-treesitter.textobjects.move'.goto_next_start('@function.outer')<CR>",
|
||
opts) -- jump to next method
|
||
keymap.set("n", "gk", "<cmd>lua require'nvim-treesitter.textobjects.move'.goto_previous_start('@function.outer')<CR>",
|
||
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
|