comparison .chezmoitemplates/init.lua @ 513:2476af02ba12

Use lsp tagfunc and formatexpr
author zegervdv <zegervdv@me.com>
date Tue, 28 Dec 2021 11:43:51 +0100
parents fc7a15e47e72
children f0c94c3f5fd9
comparison
equal deleted inserted replaced
512:fc7a15e47e72 513:2476af02ba12
691 691
692 -- LSP config 692 -- LSP config
693 local lsp = require 'lspconfig' 693 local lsp = require 'lspconfig'
694 local null_ls = require 'null-ls' 694 local null_ls = require 'null-ls'
695 695
696 -- Use builtin tagfunc to query LSP
697 -- source: https://github.com/mfussenegger/dotfiles/blob/076d77eafabe90327d1355dfbfb807085a795367/vim/.config/nvim/lua/me/lsp/ext.lua#L54
698 local function make_tag_item(name, range, uri)
699 local start = range.start
700 return {
701 name = name,
702 filename = vim.uri_to_fname(uri),
703 cmd = string.format('call cursor(%d, %d)', start.line + 1, start.character + 1),
704 }
705 end
706
707 local function tag_definition_request(pattern)
708 local params = vim.lsp.util.make_position_params()
709 local results, err = vim.lsp.buf_request_sync(0, 'textDocument/definition', params, 10000)
710 if err then
711 print(vim.inspect(err))
712 end
713
714 local tags = {}
715
716 for _, lsp_result in pairs(results) do
717 local result = lsp_result.result or {}
718 if result.range then
719 table.insert(tags, make_tag_item(pattern, result.range, result.uri))
720 else
721 for _, item in pairs(result) do
722 if item.range then
723 table.insert(tags, make_tag_item(pattern, item.range, item.uri))
724 else
725 table.insert(tags, make_tag_item(pattern, item.targetSelectionRange, item.targetUri))
726 end
727 end
728 end
729 end
730 return tags
731 end
732
733 local function tag_symbol_request(pattern)
734 local results, err = vim.lsp.buf_request_sync(0, 'workspace/symbol', { query = pattern }, 10000)
735 if err then
736 print(vim.inspect(err))
737 end
738
739 local tags = {}
740
741 for _, symbols in pairs(results) do
742 for _, symbol in pairs(symbols.result or {}) do
743 local loc = symbol.location
744 local item = make_tag_item(symbol.name, loc.range, loc.uri)
745 item.kind = (vim.lsp.protocol.SymbolKind[symbol.kind] or 'Unknown')[1]
746 table.insert(tags, item)
747 end
748 end
749 return tags
750 end
751
752 _G.tagfunc = function(pattern, flags)
753 if flags == 'c' then
754 return tag_definition_request(pattern)
755 elseif flags == '' or flags == 'r' then
756 return tag_symbol_request(pattern)
757 else
758 return vim.NIL
759 end
760 end
761
762 local on_attach = function(client) 696 local on_attach = function(client)
763 local nnoremap = vim.keymap.nnoremap 697 local nnoremap = vim.keymap.nnoremap
764 local inoremap = vim.keymap.inoremap 698 local inoremap = vim.keymap.inoremap
765 699
766 vim.bo.tagfunc = 'v:lua.tagfunc' 700 if client.resolved_capabilities.goto_definition == true then
701 vim.bo.tagfunc = 'v:lua.vim.lsp.tagfunc'
702 nnoremap { 'gp', require('goto-preview').goto_preview_definition, silent = true, buffer = 0 }
703 nnoremap { 'gP', require('goto-preview').close_all_win, silent = true, buffer = 0 }
704 end
767 705
768 nnoremap { 'gd', vim.lsp.buf.declaration, silent = true, buffer = 0 } 706 nnoremap { 'gd', vim.lsp.buf.declaration, silent = true, buffer = 0 }
769 nnoremap { 'K', vim.lsp.buf.hover, silent = true, buffer = 0 } 707 nnoremap { 'K', vim.lsp.buf.hover, silent = true, buffer = 0 }
770 nnoremap { 'gD', vim.lsp.buf.implementation, silent = true, buffer = 0 } 708 nnoremap { 'gD', vim.lsp.buf.implementation, silent = true, buffer = 0 }
771 nnoremap { '1gD', vim.lsp.buf.type_definition, silent = true, buffer = 0 } 709 nnoremap { '1gD', vim.lsp.buf.type_definition, silent = true, buffer = 0 }
772 nnoremap { 'gr', vim.lsp.buf.references, silent = true, buffer = 0 } 710 nnoremap { 'gr', vim.lsp.buf.references, silent = true, buffer = 0 }
773 nnoremap { 'g0', vim.lsp.buf.document_symbol, silent = true, buffer = 0 } 711 nnoremap { 'g0', vim.lsp.buf.document_symbol, silent = true, buffer = 0 }
774 nnoremap { 712
775 '<c-p>', 713 if client.resolved_capabilities.document_formatting == true then
776 function() 714 nnoremap {
777 vim.lsp.buf.formatting_sync({}, 5000) 715 '<c-p>',
778 end, 716 function()
779 silent = true, 717 vim.lsp.buf.formatting_sync({}, 5000)
780 buffer = 0, 718 end,
781 } 719 silent = true,
782 nnoremap { 'gp', require('goto-preview').goto_preview_definition, silent = true, buffer = 0 } 720 buffer = 0,
783 nnoremap { 'gP', require('goto-preview').close_all_win, silent = true, buffer = 0 } 721 }
722 end
723
724 if client.resolved_capabilities.document_range_formatting == true then
725 vim.bo.formatexpr = 'v:lua.vim.lsp.formatexpr()'
726 end
784 727
785 inoremap { '<c-l>', vim.lsp.buf.signature_help, silent = true, buffer = 0 } 728 inoremap { '<c-l>', vim.lsp.buf.signature_help, silent = true, buffer = 0 }
786 729
787 vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single' }) 730 vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single' })
788 vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single' }) 731 vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single' })