changeset 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
files .chezmoitemplates/init.lua
diffstat 1 files changed, 20 insertions(+), 77 deletions(-) [+]
line wrap: on
line diff
--- 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 {
-    '<c-p>',
-    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 {
+      '<c-p>',
+      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 { '<c-l>', vim.lsp.buf.signature_help, silent = true, buffer = 0 }