feat: Move 'LspAttach' autocmd boilerplate to dedicated library function
This commit is contained in:
parent
45b1cb99ee
commit
432f7e0595
4 changed files with 121 additions and 120 deletions
|
@ -1,6 +1,8 @@
|
||||||
---@class lib
|
---@class lib
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
|
M.lsp = require('lib.lsp')
|
||||||
|
|
||||||
---Find the root of a project based on `vim.g.root_spec`. Defaults to
|
---Find the root of a project based on `vim.g.root_spec`. Defaults to
|
||||||
---`{ '.git' }` if unset.
|
---`{ '.git' }` if unset.
|
||||||
---@return string?
|
---@return string?
|
||||||
|
|
20
nvim/lua/lib/lsp.lua
Normal file
20
nvim/lua/lib/lsp.lua
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---@class lib.lsp
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---Boilerplate to create an autocommand to do something on LspAttach.
|
||||||
|
---@param callback fun(client:vim.lsp.Client, buffer:number)
|
||||||
|
---@param name? string
|
||||||
|
function M.on_attach(callback, name)
|
||||||
|
return vim.api.nvim_create_autocmd('LspAttach', {
|
||||||
|
callback = function(args)
|
||||||
|
local buffer = args.buf ---@type number
|
||||||
|
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
||||||
|
|
||||||
|
if client and (not name or client.name == name) then
|
||||||
|
return callback(client, buffer)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
155
nvim/lua/lsp.lua
155
nvim/lua/lsp.lua
|
@ -82,102 +82,89 @@ vim.lsp.config('*', {
|
||||||
vim.lsp.enable({ 'lua-language-server' })
|
vim.lsp.enable({ 'lua-language-server' })
|
||||||
|
|
||||||
-- Keymaps -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
-- Keymaps -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||||
vim.api.nvim_create_autocmd('LspAttach', {
|
MarleyVim.lsp.on_attach(function(client)
|
||||||
callback = function(args)
|
local set = vim.keymap.set
|
||||||
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
|
||||||
|
|
||||||
if not client then
|
set('n', 'gD', vim.lsp.buf.declaration, { desc = 'declaration' })
|
||||||
return
|
set('n', 'gI', vim.lsp.buf.implementation, { desc = 'implementation' })
|
||||||
end
|
|
||||||
|
|
||||||
local set = vim.keymap.set
|
set('n', 'gr', vim.lsp.buf.references, { desc = 'references', nowait = true })
|
||||||
|
|
||||||
set('n', 'gD', vim.lsp.buf.declaration, { desc = 'declaration' })
|
set('n', 'gy', vim.lsp.buf.type_definition, { desc = 'type definition' })
|
||||||
set('n', 'gI', vim.lsp.buf.implementation, { desc = 'implementation' })
|
|
||||||
|
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(
|
set(
|
||||||
'n',
|
'n',
|
||||||
'gr',
|
'<LEADER>cC',
|
||||||
vim.lsp.buf.references,
|
vim.lsp.codelens.refresh,
|
||||||
{ desc = 'references', nowait = true }
|
{ desc = 'refresh & display codelens' }
|
||||||
)
|
)
|
||||||
|
end
|
||||||
|
|
||||||
set('n', 'gy', vim.lsp.buf.type_definition, { desc = 'type definition' })
|
if client.supports_method('textDocument/definition') then
|
||||||
|
set('n', 'gd', vim.lsp.buf.definition, { desc = 'definition' })
|
||||||
|
end
|
||||||
|
|
||||||
set('n', 'K', function()
|
if client.supports_method('textDocument/documentHighlight') then
|
||||||
return vim.lsp.buf.hover()
|
if Snacks.words.is_enabled() then
|
||||||
end, { desc = 'hover' })
|
set('n', '<A-n>', function()
|
||||||
|
Snacks.words.jump(vim.v.count1, true)
|
||||||
|
end, { desc = 'next reference' })
|
||||||
|
|
||||||
if client.supports_method('textDocument/codeAction') then
|
set('n', '<A-p>', function()
|
||||||
set(
|
Snacks.words.jump(-vim.v.count1, true)
|
||||||
{ 'n', 'v' },
|
end, { desc = 'prev reference' })
|
||||||
'<LEADER>ca',
|
|
||||||
vim.lsp.buf.code_action,
|
set('n', ']]', function()
|
||||||
{ desc = 'code action' }
|
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
|
||||||
|
end
|
||||||
|
|
||||||
if client.supports_method('textDocument/codeLens') then
|
if client.supports_method('textDocument/rename') then
|
||||||
set(
|
set('n', '<LEADER>cr', vim.lsp.buf.rename, { desc = 'rename' })
|
||||||
{ 'n', 'v' },
|
end
|
||||||
'<LEADER>cc',
|
|
||||||
vim.lsp.codelens.run,
|
|
||||||
{ desc = 'run codelens' }
|
|
||||||
)
|
|
||||||
|
|
||||||
set(
|
if client.supports_method('textDocument/signatureHelp') then
|
||||||
'n',
|
set('i', '<C-k>', function()
|
||||||
'<LEADER>cC',
|
return vim.lsp.buf.signature_help()
|
||||||
vim.lsp.codelens.refresh,
|
end, { desc = 'signature help' })
|
||||||
{ desc = 'refresh & display codelens' }
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
if client.supports_method('textDocument/definition') then
|
set('n', 'gK', function()
|
||||||
set('n', 'gd', vim.lsp.buf.definition, { desc = 'definition' })
|
vim.lsp.buf.signature_help()
|
||||||
end
|
end, { desc = 'signature help' })
|
||||||
|
end
|
||||||
|
|
||||||
if client.supports_method('textDocument/documentHighlight') then
|
if
|
||||||
if Snacks.words.is_enabled() then
|
client.supports_method('workspace/didRenameFiles')
|
||||||
set('n', '<A-n>', function()
|
or client.supports_method('workspace/willRenameFiles')
|
||||||
Snacks.words.jump(vim.v.count1, true)
|
then
|
||||||
end, { desc = 'next reference' })
|
set('n', '<LEADER>cR', function()
|
||||||
|
Snacks.rename.rename_file()
|
||||||
set('n', '<A-p>', function()
|
end, { desc = 'rename file' })
|
||||||
Snacks.words.jump(-vim.v.count1, true)
|
end
|
||||||
end, { desc = 'prev reference' })
|
end)
|
||||||
|
|
||||||
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,
|
|
||||||
})
|
|
||||||
|
|
|
@ -248,47 +248,39 @@ return {
|
||||||
require('fzf-lua').setup(opts)
|
require('fzf-lua').setup(opts)
|
||||||
|
|
||||||
-- LSP keybinds.
|
-- LSP keybinds.
|
||||||
vim.api.nvim_create_autocmd('LspAttach', {
|
MarleyVim.lsp.on_attach(function(client)
|
||||||
callback = function(args)
|
local set = vim.keymap.set
|
||||||
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
|
||||||
|
|
||||||
if not client then
|
local pickOpts =
|
||||||
return
|
{ jump_to_single_result = true, ignore_current_line = true }
|
||||||
end
|
|
||||||
|
|
||||||
local set = vim.keymap.set
|
set(
|
||||||
|
'n',
|
||||||
local pickOpts =
|
'gI',
|
||||||
{ jump_to_single_result = true, ignore_current_line = true }
|
pick('lsp_implementations', pickOpts),
|
||||||
|
{ desc = 'implementation' }
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
'n',
|
||||||
|
'gr',
|
||||||
|
pick('lsp_references', pickOpts),
|
||||||
|
{ desc = 'references', nowait = true }
|
||||||
|
)
|
||||||
|
set(
|
||||||
|
'n',
|
||||||
|
'gy',
|
||||||
|
pick('lsp_typedefs', pickOpts),
|
||||||
|
{ desc = 't[y]pe definition' }
|
||||||
|
)
|
||||||
|
|
||||||
|
if client.supports_method('textDocument/definition') then
|
||||||
set(
|
set(
|
||||||
'n',
|
'n',
|
||||||
'gI',
|
'gd',
|
||||||
pick('lsp_implementations', pickOpts),
|
pick('lsp_definitions', pickOpts),
|
||||||
{ desc = 'implementation' }
|
{ desc = 'definition' }
|
||||||
)
|
)
|
||||||
set(
|
end
|
||||||
'n',
|
end)
|
||||||
'gr',
|
|
||||||
pick('lsp_references', pickOpts),
|
|
||||||
{ desc = 'references', nowait = true }
|
|
||||||
)
|
|
||||||
set(
|
|
||||||
'n',
|
|
||||||
'gy',
|
|
||||||
pick('lsp_typedefs', pickOpts),
|
|
||||||
{ desc = 't[y]pe definition' }
|
|
||||||
)
|
|
||||||
|
|
||||||
if client.supports_method('textDocument/definition') then
|
|
||||||
set(
|
|
||||||
'n',
|
|
||||||
'gd',
|
|
||||||
pick('lsp_definitions', pickOpts),
|
|
||||||
{ desc = 'definition' }
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue