feat: nvim-lspconfig -> vim.lsp.config()

This commit is contained in:
punkfairie 2025-01-01 18:56:17 -08:00
parent e5354bfa28
commit e7cddfde33
Signed by: punkfairie
GPG key ID: A509E8F77FB9D696
6 changed files with 222 additions and 235 deletions

View file

@ -91,9 +91,6 @@ with final.pkgs.lib; let
]
))
# LSP
nvim-lspconfig
# Coding
blink-cmp
luasnip

View file

@ -12,6 +12,7 @@ require('keymaps')
require('autocmds')
require('snacks-nvim')
require('lsp')
require('lz.n').load('plugins')

View file

@ -0,0 +1,38 @@
return {
filetypes = { 'lua' },
cmd = { 'lua-language-server' },
root_markers = {
'.luarc.json',
'.luarc.jsonc',
'.luacheckrc',
'.stylua.toml',
'stylua.toml',
'selene.toml',
'selene.yml',
},
settings = {
Lua = {
workspace = {
checkThirdParty = false,
},
codeLens = {
enable = true,
},
completion = {
callSnippet = 'Replace',
},
doc = {
privateName = { '^_' },
},
hint = {
enable = true,
setType = false,
paramType = true,
paramName = 'Disable',
semicolon = 'Disable',
arrayIndex = 'Disable',
},
},
},
}

183
nvim/lua/lsp.lua Normal file
View file

@ -0,0 +1,183 @@
local i = require('icons')
-- Diagnostics -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
---@type vim.diagnostic.Opts
local diagnosticConfig = {
underline = true,
update_in_insert = true,
virtual_text = {
spacing = 4,
source = 'if_many',
prefix = function(diagnostic)
for d, icon in pairs(i.diagnostics) do
if diagnostic.severity == vim.diagnostic.severity[d:upper()] then
return icon
end
end
return ''
end,
},
severity_sort = true,
signs = {
text = {
[vim.diagnostic.severity.ERROR] = i.diagnostics.Error,
[vim.diagnostic.severity.WARN] = i.diagnostics.Warn,
[vim.diagnostic.severity.HINT] = i.diagnostics.Hint,
[vim.diagnostic.severity.INFO] = i.diagnostics.Info,
},
},
}
for severity, icon in pairs(diagnosticConfig.signs.text) do
local name =
vim.diagnostic.severity[severity]:lower():gsub('^%l', string.upper)
name = 'DiagnosticSign' .. name
vim.fn.sign_define(name, { text = icon, texthl = name, numhl = '' })
end
vim.diagnostic.config(diagnosticConfig)
-- Codelens -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
vim.api.nvim_create_autocmd('User', {
pattern = 'LspSupportsMethod',
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
local buffer = args.data.buffer
if client and args.data.method == 'textDocument/codeLens' then
vim.lsp.codelens.refresh()
vim.api.nvim_create_autocmd({ 'BufEnter', 'CursorHold', 'InsertLeave' }, {
buffer = buffer,
callback = vim.lsp.codelens.refresh,
})
end
end,
})
-- Server Setup -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
local has_blink, blink = pcall(require, 'blink.cmp')
local capabilities = vim.tbl_deep_extend(
'force',
{},
vim.lsp.protocol.make_client_capabilities(),
has_blink and blink.get_lsp_capabilities() or {},
{
workspace = {
fileOperations = {
didRename = true,
willRename = true,
},
},
}
)
vim.lsp.config('*', {
root_markers = { '.git' },
capabilities = capabilities,
})
vim.lsp.enable({ 'lua-language-server' })
-- Keymaps -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
vim.api.nvim_create_autocmd('LspAttach', {
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
if not client then
return
end
local set = vim.keymap.set
set('n', 'gD', vim.lsp.buf.declaration, { desc = 'declaration' })
set('n', 'gI', vim.lsp.buf.implementation, { desc = 'implementation' })
set(
'n',
'gr',
vim.lsp.buf.references,
{ desc = 'references', nowait = true }
)
set('n', 'gy', vim.lsp.buf.type_definition, { desc = 'type definition' })
set('n', 'K', function()
return vim.lsp.buf.hover()
end, { desc = 'hover' })
if client.supports_method('textDocument/codeAction') then
set(
{ 'n', 'v' },
'<LEADER>ca',
vim.lsp.buf.code_action,
{ desc = 'code action' }
)
end
if client.supports_method('textDocument/codeLens') then
set(
{ 'n', 'v' },
'<LEADER>cc',
vim.lsp.codelens.run,
{ desc = 'run codelens' }
)
set(
'n',
'<LEADER>cC',
vim.lsp.codelens.refresh,
{ desc = 'refresh & display codelens' }
)
end
if client.supports_method('textDocument/definition') then
set('n', 'gd', vim.lsp.buf.definition, { desc = 'definition' })
end
if client.supports_method('textDocument/documentHighlight') then
if Snacks.words.is_enabled() then
set('n', '<A-n>', function()
Snacks.words.jump(vim.v.count1, true)
end, { desc = 'next reference' })
set('n', '<A-p>', function()
Snacks.words.jump(-vim.v.count1, true)
end, { desc = 'prev reference' })
set('n', ']]', function()
Snacks.words.jump(vim.v.count1)
end, { desc = 'next reference' })
set('n', '[[', function()
Snacks.words.jump(-vim.v.count1)
end, { desc = 'prev reference' })
end
end
if client.supports_method('textDocument/rename') then
set('n', '<LEADER>cr', vim.lsp.buf.rename, { desc = 'rename' })
end
if client.supports_method('textDocument/signatureHelp') then
set('i', '<C-k>', function()
return vim.lsp.buf.signature_help()
end, { desc = 'signature help' })
set('n', 'gK', function()
vim.lsp.buf.signature_help()
end, { desc = 'signature help' })
end
if
client.supports_method('workspace/didRenameFiles')
or client.supports_method('workspace/willRenameFiles')
then
set('n', '<LEADER>cR', function()
Snacks.rename.rename_file()
end, { desc = 'rename file' })
end
end,
})

View file

@ -1,5 +0,0 @@
local req = MarleyVim.local_require('plugins.lsp')
return {
req('nvim-lspconfig'),
}

View file

@ -1,227 +0,0 @@
return {
'nvim-lspconfig',
event = { 'BufRead', 'BufWinEnter', 'BufNewFile' },
cmd = { 'LspStart', 'LspRestart', 'LspStop', 'LspLog' },
after = function()
local i = require('icons')
-- Diagnostics -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
---@type vim.diagnostic.Opts
local diagnosticConfig = {
underline = true,
update_in_insert = true,
virtual_text = {
spacing = 4,
source = 'if_many',
prefix = function(diagnostic)
for d, icon in pairs(i.diagnostics) do
if diagnostic.severity == vim.diagnostic.severity[d:upper()] then
return icon
end
end
return ''
end,
},
severity_sort = true,
signs = {
text = {
[vim.diagnostic.severity.ERROR] = i.diagnostics.Error,
[vim.diagnostic.severity.WARN] = i.diagnostics.Warn,
[vim.diagnostic.severity.HINT] = i.diagnostics.Hint,
[vim.diagnostic.severity.INFO] = i.diagnostics.Info,
},
},
}
for severity, icon in pairs(diagnosticConfig.signs.text) do
local name =
vim.diagnostic.severity[severity]:lower():gsub('^%l', string.upper)
name = 'DiagnosticSign' .. name
vim.fn.sign_define(name, { text = icon, texthl = name, numhl = '' })
end
vim.diagnostic.config(diagnosticConfig)
-- Codelens -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
vim.api.nvim_create_autocmd('User', {
pattern = 'LspSupportsMethod',
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
local buffer = args.data.buffer
if client and args.data.method == 'textDocument/codeLens' then
vim.lsp.codelens.refresh()
vim.api.nvim_create_autocmd(
{ 'BufEnter', 'CursorHold', 'InsertLeave' },
{
buffer = buffer,
callback = vim.lsp.codelens.refresh,
}
)
end
end,
})
-- Server Setup -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
local has_blink, blink = pcall(require, 'blink.cmp')
local capabilities = vim.tbl_deep_extend(
'force',
{},
vim.lsp.protocol.make_client_capabilities(),
has_blink and blink.get_lsp_capabilities() or {},
{
workspace = {
fileOperations = {
didRename = true,
willRename = true,
},
},
}
)
local lspconfig = require('lspconfig')
lspconfig.util.default_config = vim.tbl_extend(
'force',
lspconfig.util.default_config,
{ capabilities = capabilities }
)
lspconfig.lua_ls.setup({
settings = {
Lua = {
workspace = {
checkThirdParty = false,
},
codeLens = {
enable = true,
},
completion = {
callSnippet = 'Replace',
},
doc = {
privateName = { '^_' },
},
hint = {
enable = true,
setType = false,
paramType = true,
paramName = 'Disable',
semicolon = 'Disable',
arrayIndex = 'Disable',
},
},
},
})
-- Keymaps -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
vim.api.nvim_create_autocmd('LspAttach', {
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
if not client then
return
end
local set = vim.keymap.set
set('n', '<LEADER>cl', '<CMD>LspInfo<CR>', { desc = 'lsp info' })
set('n', 'gD', vim.lsp.buf.declaration, { desc = 'declaration' })
set('n', 'gI', vim.lsp.buf.implementation, { desc = 'implementation' })
set(
'n',
'gr',
vim.lsp.buf.references,
{ desc = 'references', nowait = true }
)
set(
'n',
'gy',
vim.lsp.buf.type_definition,
{ desc = 'type definition' }
)
set('n', 'K', function()
return vim.lsp.buf.hover()
end, { desc = 'hover' })
if client.supports_method('textDocument/codeAction') then
set(
{ 'n', 'v' },
'<LEADER>ca',
vim.lsp.buf.code_action,
{ desc = 'code action' }
)
end
if client.supports_method('textDocument/codeLens') then
set(
{ 'n', 'v' },
'<LEADER>cc',
vim.lsp.codelens.run,
{ desc = 'run codelens' }
)
set(
'n',
'<LEADER>cC',
vim.lsp.codelens.refresh,
{ desc = 'refresh & display codelens' }
)
end
if client.supports_method('textDocument/definition') then
set('n', 'gd', vim.lsp.buf.definition, { desc = 'definition' })
end
if client.supports_method('textDocument/documentHighlight') then
if Snacks.words.is_enabled() then
set('n', '<A-n>', function()
Snacks.words.jump(vim.v.count1, true)
end, { desc = 'next reference' })
set('n', '<A-p>', function()
Snacks.words.jump(-vim.v.count1, true)
end, { desc = 'prev reference' })
set('n', ']]', function()
Snacks.words.jump(vim.v.count1)
end, { desc = 'next reference' })
set('n', '[[', function()
Snacks.words.jump(-vim.v.count1)
end, { desc = 'prev reference' })
end
end
if client.supports_method('textDocument/rename') then
set('n', '<LEADER>cr', vim.lsp.buf.rename, { desc = 'rename' })
end
if client.supports_method('textDocument/signatureHelp') then
set('i', '<C-k>', function()
return vim.lsp.buf.signature_help()
end, { desc = 'signature help' })
set('n', 'gK', function()
vim.lsp.buf.signature_help()
end, { desc = 'signature help' })
end
if
client.supports_method('workspace/didRenameFiles')
or client.supports_method('workspace/willRenameFiles')
then
set('n', '<LEADER>cR', function()
Snacks.rename.rename_file()
end, { desc = 'rename file' })
end
end,
})
end,
}