comparison .chezmoitemplates/init.lua @ 462:676d7ef5fecb

Use tagfunc to query LSP for definitions
author zegervdv <zegervdv@me.com>
date Fri, 24 Sep 2021 09:44:17 +0200
parents ae7e377bced8
children 1d2e33dfe0c6
comparison
equal deleted inserted replaced
461:a5fb80022655 462:676d7ef5fecb
567 567
568 -- LSP config 568 -- LSP config
569 local lsp = require 'lspconfig' 569 local lsp = require 'lspconfig'
570 local null_ls = require 'null-ls' 570 local null_ls = require 'null-ls'
571 571
572 -- Use builtin tagfunc to query LSP
573 -- source: https://github.com/mfussenegger/dotfiles/blob/076d77eafabe90327d1355dfbfb807085a795367/vim/.config/nvim/lua/me/lsp/ext.lua#L54
574 local function make_tag_item(name, range, uri)
575 local start = range.start
576 return {
577 name = name,
578 filename = vim.uri_to_fname(uri),
579 cmd = string.format('call cursor(%d, %d)', start.line + 1, start.character + 1),
580 }
581 end
582
583 local function tag_definition_request(pattern)
584 local params = vim.lsp.util.make_position_params()
585 local results, err = vim.lsp.buf_request_sync(0, 'textDocument/definition', params, 10000)
586 if err then
587 print(vim.inspect(err))
588 end
589
590 local tags = {}
591
592 for _, lsp_result in pairs(results) do
593 local result = lsp_result.result or {}
594 if result.range then
595 table.insert(tags, make_tag_item(pattern, result.range, result.uri))
596 else
597 for _, item in pairs(result) do
598 if item.range then
599 table.insert(tags, make_tag_item(pattern, item.range, item.uri))
600 else
601 table.insert(tags, make_tag_item(pattern, item.targetSelectionRange, item.targetUri))
602 end
603 end
604 end
605 end
606 return tags
607 end
608
609 local function tag_symbol_request(pattern)
610 local results, err = vim.lsp.buf_request_sync(0, 'workspace/symbol', { query = pattern }, 10000)
611 if err then
612 print(vim.inspect(err))
613 end
614
615 local tags = {}
616
617 for _, symbols in pairs(results) do
618 for _, symbol in pairs(symbols.result or {}) do
619 local loc = symbol.location
620 local item = make_tag_item(symbol.name, loc.range, loc.uri)
621 item.kind = (vim.lsp.protocol.SymbolKind[symbol.kind] or 'Unknown')[1]
622 table.insert(tags, item)
623 end
624 end
625 return tags
626 end
627
628 _G.tagfunc = function(pattern, flags)
629 if flags == 'c' then
630 return tag_definition_request(pattern)
631 elseif flags == '' or flags == 'r' then
632 return tag_symbol_request(pattern)
633 else
634 return vim.NIL
635 end
636 end
637
572 local on_attach = function(client) 638 local on_attach = function(client)
573 local nnoremap = vim.keymap.nnoremap 639 local nnoremap = vim.keymap.nnoremap
574 local inoremap = vim.keymap.inoremap 640 local inoremap = vim.keymap.inoremap
641
642 vim.bo.tagfunc = 'v:lua.tagfunc'
643
575 nnoremap { 'gd', vim.lsp.buf.declaration, silent = true, buffer = 0 } 644 nnoremap { 'gd', vim.lsp.buf.declaration, silent = true, buffer = 0 }
576 nnoremap { '<c-]>', vim.lsp.buf.definition, silent = true, buffer = 0 }
577 nnoremap {
578 'g<c-]>',
579 function()
580 local params = vim.lsp.util.make_position_params()
581 opts = {}
582 local results_lsp = vim.lsp.buf_request_sync(0, 'textDocument/definition', params, opts.timeout or 10000)
583 if not results_lsp or vim.tbl_isempty(results_lsp) then
584 print 'No results from textDocument/definition'
585 return
586 end
587 for _, lsp_data in pairs(results_lsp) do
588 if lsp_data ~= nil and lsp_data.result ~= nil and not vim.tbl_isempty(lsp_data.result) then
589 for _, value in pairs(lsp_data.result) do
590 local range = value.range or value.targetRange
591 if range ~= nil then
592 local file = value.uri or value.targetUri
593 if file ~= nil then
594 vim.api.nvim_command [[split]]
595 vim.lsp.util.jump_to_location(value)
596 return
597 end
598 end
599 end
600 end
601 end
602 -- try to call default lsp function
603 vim.lsp.buf.definition()
604 end,
605 silent = true,
606 buffer = 0,
607 }
608 nnoremap { 'K', vim.lsp.buf.hover, silent = true, buffer = 0 } 645 nnoremap { 'K', vim.lsp.buf.hover, silent = true, buffer = 0 }
609 nnoremap { 'gD', vim.lsp.buf.implementation, silent = true, buffer = 0 } 646 nnoremap { 'gD', vim.lsp.buf.implementation, silent = true, buffer = 0 }
610 nnoremap { '1gD', vim.lsp.buf.type_definition, silent = true, buffer = 0 } 647 nnoremap { '1gD', vim.lsp.buf.type_definition, silent = true, buffer = 0 }
611 nnoremap { 'gr', vim.lsp.buf.references, silent = true, buffer = 0 } 648 nnoremap { 'gr', vim.lsp.buf.references, silent = true, buffer = 0 }
612 nnoremap { 'g0', vim.lsp.buf.document_symbol, silent = true, buffer = 0 } 649 nnoremap { 'g0', vim.lsp.buf.document_symbol, silent = true, buffer = 0 }