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 and response.result.contents.value then for line in response.result.contents.value: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 = {}, yamlls = {} } 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