Mercurial > dotfiles
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 } |