From 7c2ea00eae7c273bb26181d2fa438076c3ac8446 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Sun, 13 Jun 2021 13:56:45 +0200 Subject: Setup neovim lsp --- vim/.config/nvim/lua/lsp/init.lua | 91 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 vim/.config/nvim/lua/lsp/init.lua (limited to 'vim/.config/nvim/lua') diff --git a/vim/.config/nvim/lua/lsp/init.lua b/vim/.config/nvim/lua/lsp/init.lua new file mode 100644 index 0000000..2e2ea9f --- /dev/null +++ b/vim/.config/nvim/lua/lsp/init.lua @@ -0,0 +1,91 @@ +local first_hover_code_i = 0 +local first_hover_code_line = -1 +local first_hover_code_col = -1 +local first_hover_code_prev = '' + +-- Returns the first code block from the markdown returned for the LSP request +-- textDocument/hover. Multiple lines are joined with a space. +function _G.lsp_first_hover_code() + --[[ NB: there is a bug that causes statusline to be reloaded continuously; + see https://github.com/neovim/neovim/issues/14303. It is not good to do a + sync request every time. Instead, keep track of line & col and only + update when either has changed. This should be fixed in nvim 0.5, after + which the first_hover_code_* variables and this logic can be removed. ]] + + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + if line == first_hover_code_line and col == first_hover_code_col then + return first_hover_code_prev + end + first_hover_code_line = line + first_hover_code_col = col + + --[[ To check whether the bug has been fixed: + vim.api.nvim_echo({{'request '},{tostring(first_hover_code_i)},{tostring(line)}},false,{}) + first_hover_code_i = first_hover_code_i + 1 + --]] + + if not vim.lsp.buf.server_ready() then return '' end + + local responses = vim.lsp.buf_request_sync( + 0, + 'textDocument/hover', + vim.lsp.util.make_position_params(), + 1000 + ) + + if not responses then return '' end + + local full_result = '' + local markdown_started = false + + for _, response in ipairs(responses) do + if response.result then + response = response.result.contents.value + for line in response:gmatch '[^\n]+' do + if line:sub(0,3) == '```' then + if markdown_started then + first_hover_code_prev = full_result + return full_result + else + markdown_started = true + end + else + full_result = full_result .. ' ' .. line + end + end + end + end + + first_hover_code_prev = full_result + return full_result +end + +local function on_attach (client, bufnr) + local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end + local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end + + buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') + + local opts = {noremap=true, silent=true} + + buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) + buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) + buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) + buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) + buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) + buf_set_keymap('n', 't', 'lua vim.lsp.buf.type_definition()', opts) + buf_set_keymap('n', 'd', 'lua vim.lsp.diagnostic.show_line_diagnostics {show_header=false}', opts) +end + +local default_config = { + on_attach = on_attach +} + +local servers = { + hls = {} +} + +local nvim_lsp = require('lspconfig') +for server, config in pairs(servers) do + nvim_lsp[server].setup(vim.tbl_deep_extend('force', default_config, config)) +end -- cgit v1.2.3