| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | local M = {}local function lsp_highlight_document(client)  if lvim.lsp.document_highlight == false then    return -- we don't need further  end  -- Set autocommands conditional on server_capabilities  if client.resolved_capabilities.document_highlight then    vim.api.nvim_exec(      [[      hi LspReferenceRead cterm=bold ctermbg=red guibg=#464646      hi LspReferenceText cterm=bold ctermbg=red guibg=#464646      hi LspReferenceWrite cterm=bold ctermbg=red guibg=#464646      augroup lsp_document_highlight        autocmd! * <buffer>        autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()        autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()      augroup END    ]],      false    )  endendfunction M.lsp_highlight_document(client)  lsp_highlight_document(client)end-- Taken from https://www.reddit.com/r/neovim/comments/gyb077/nvimlsp_peek_defination_javascript_ttserver/function M.preview_location(location, context, before_context)  -- location may be LocationLink or Location (more useful for the former)  context = context or 15  before_context = before_context or 0  local uri = location.targetUri or location.uri  if uri == nil then    return  end  local bufnr = vim.uri_to_bufnr(uri)  if not vim.api.nvim_buf_is_loaded(bufnr) then    vim.fn.bufload(bufnr)  end  local range = location.targetRange or location.range  local contents = vim.api.nvim_buf_get_lines(    bufnr,    range.start.line - before_context,    range["end"].line + 1 + context,    false  )  local filetype = vim.api.nvim_buf_get_option(bufnr, "filetype")  return vim.lsp.util.open_floating_preview(contents, filetype, { border = lvim.lsp.popup_border })endfunction M.preview_location_callback(_, method, result)  local context = 15  if result == nil or vim.tbl_isempty(result) then    print("No location found: " .. method)    return nil  end  if vim.tbl_islist(result) then    M.floating_buf, M.floating_win = M.preview_location(result[1], context)  else    M.floating_buf, M.floating_win = M.preview_location(result, context)  endendfunction M.PeekDefinition()  if vim.tbl_contains(vim.api.nvim_list_wins(), M.floating_win) then    vim.api.nvim_set_current_win(M.floating_win)  else    local params = vim.lsp.util.make_position_params()    return vim.lsp.buf_request(0, "textDocument/definition", params, M.preview_location_callback)  endendfunction M.PeekTypeDefinition()  if vim.tbl_contains(vim.api.nvim_list_wins(), M.floating_win) then    vim.api.nvim_set_current_win(M.floating_win)  else    local params = vim.lsp.util.make_position_params()    return vim.lsp.buf_request(0, "textDocument/typeDefinition", params, M.preview_location_callback)  endendfunction M.PeekImplementation()  if vim.tbl_contains(vim.api.nvim_list_wins(), M.floating_win) then    vim.api.nvim_set_current_win(M.floating_win)  else    local params = vim.lsp.util.make_position_params()    return vim.lsp.buf_request(0, "textDocument/implementation", params, M.preview_location_callback)  endendfunction M.common_on_attach(client, bufnr)  if lvim.lsp.on_attach_callback then    lvim.lsp.on_attach_callback(client, bufnr)  end  lsp_highlight_document(client)endfunction M.no_formatter_on_attach(client, bufnr)  if lvim.lsp.on_attach_callback then    lvim.lsp.on_attach_callback(client, bufnr)  end  lsp_highlight_document(client)  client.resolved_capabilities.document_formatting = falseendfunction M.common_capabilities()  local capabilities = vim.lsp.protocol.make_client_capabilities()  capabilities.textDocument.completion.completionItem.snippetSupport = true  capabilities.textDocument.completion.completionItem.resolveSupport = {    properties = {      "documentation",      "detail",      "additionalTextEdits",    },  }  return capabilitiesendreturn M
 |