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