# HG changeset patch # User zegervdv # Date 1640688231 -3600 # Node ID 2476af02ba1208586153f4c00d2a6d2fcdd80f4f # Parent fc7a15e47e7257117654d12e0ca097aa300cc92e Use lsp tagfunc and formatexpr diff -r fc7a15e47e72 -r 2476af02ba12 .chezmoitemplates/init.lua --- a/.chezmoitemplates/init.lua Tue Dec 21 10:55:25 2021 +0100 +++ b/.chezmoitemplates/init.lua Tue Dec 28 11:43:51 2021 +0100 @@ -693,77 +693,15 @@ local lsp = require 'lspconfig' local null_ls = require 'null-ls' --- Use builtin tagfunc to query LSP --- source: https://github.com/mfussenegger/dotfiles/blob/076d77eafabe90327d1355dfbfb807085a795367/vim/.config/nvim/lua/me/lsp/ext.lua#L54 -local function make_tag_item(name, range, uri) - local start = range.start - return { - name = name, - filename = vim.uri_to_fname(uri), - cmd = string.format('call cursor(%d, %d)', start.line + 1, start.character + 1), - } -end - -local function tag_definition_request(pattern) - local params = vim.lsp.util.make_position_params() - local results, err = vim.lsp.buf_request_sync(0, 'textDocument/definition', params, 10000) - if err then - print(vim.inspect(err)) - end - - local tags = {} - - for _, lsp_result in pairs(results) do - local result = lsp_result.result or {} - if result.range then - table.insert(tags, make_tag_item(pattern, result.range, result.uri)) - else - for _, item in pairs(result) do - if item.range then - table.insert(tags, make_tag_item(pattern, item.range, item.uri)) - else - table.insert(tags, make_tag_item(pattern, item.targetSelectionRange, item.targetUri)) - end - end - end - end - return tags -end - -local function tag_symbol_request(pattern) - local results, err = vim.lsp.buf_request_sync(0, 'workspace/symbol', { query = pattern }, 10000) - if err then - print(vim.inspect(err)) - end - - local tags = {} - - for _, symbols in pairs(results) do - for _, symbol in pairs(symbols.result or {}) do - local loc = symbol.location - local item = make_tag_item(symbol.name, loc.range, loc.uri) - item.kind = (vim.lsp.protocol.SymbolKind[symbol.kind] or 'Unknown')[1] - table.insert(tags, item) - end - end - return tags -end - -_G.tagfunc = function(pattern, flags) - if flags == 'c' then - return tag_definition_request(pattern) - elseif flags == '' or flags == 'r' then - return tag_symbol_request(pattern) - else - return vim.NIL - end -end - local on_attach = function(client) local nnoremap = vim.keymap.nnoremap local inoremap = vim.keymap.inoremap - vim.bo.tagfunc = 'v:lua.tagfunc' + if client.resolved_capabilities.goto_definition == true then + vim.bo.tagfunc = 'v:lua.vim.lsp.tagfunc' + nnoremap { 'gp', require('goto-preview').goto_preview_definition, silent = true, buffer = 0 } + nnoremap { 'gP', require('goto-preview').close_all_win, silent = true, buffer = 0 } + end nnoremap { 'gd', vim.lsp.buf.declaration, silent = true, buffer = 0 } nnoremap { 'K', vim.lsp.buf.hover, silent = true, buffer = 0 } @@ -771,16 +709,21 @@ nnoremap { '1gD', vim.lsp.buf.type_definition, silent = true, buffer = 0 } nnoremap { 'gr', vim.lsp.buf.references, silent = true, buffer = 0 } nnoremap { 'g0', vim.lsp.buf.document_symbol, silent = true, buffer = 0 } - nnoremap { - '', - function() - vim.lsp.buf.formatting_sync({}, 5000) - end, - silent = true, - buffer = 0, - } - nnoremap { 'gp', require('goto-preview').goto_preview_definition, silent = true, buffer = 0 } - nnoremap { 'gP', require('goto-preview').close_all_win, silent = true, buffer = 0 } + + if client.resolved_capabilities.document_formatting == true then + nnoremap { + '', + function() + vim.lsp.buf.formatting_sync({}, 5000) + end, + silent = true, + buffer = 0, + } + end + + if client.resolved_capabilities.document_range_formatting == true then + vim.bo.formatexpr = 'v:lua.vim.lsp.formatexpr()' + end inoremap { '', vim.lsp.buf.signature_help, silent = true, buffer = 0 }