diagnostic-nvim icon indicating copy to clipboard operation
diagnostic-nvim copied to clipboard

Always use popup instead of virtual text

Open nhooyr opened this issue 5 years ago • 16 comments

Would be nice to have an option for this.

At the moment the popup only shows up jump.

nhooyr avatar Jun 03 '20 06:06 nhooyr

You can easily do this with

autocmd CursorHold * lua vim.lsp.util.show_line_diagnostics()

haorenW1025 avatar Jun 03 '20 07:06 haorenW1025

Thank you!

Def should be an option I'd say. Much better experience imo than the virtual text.

nhooyr avatar Jun 03 '20 08:06 nhooyr

Expanding with a more realistic example for anyone else coming here (i.e. add it to the on_attach callback) so that it's only enabled for buffers with an actual language server.

local nvim_command = vim.api.nvim_command

local on_attach = function(client, bufnr)
  nvim_command('autocmd CursorHold <buffer> lua vim.lsp.util.show_line_diagnostics()')
end

nvim_lsp.foobar.setup { on_attach = on_attach }

lithammer avatar Jun 03 '20 08:06 lithammer

So it works for me if I run lua vim.lsp.util.show_line_diagnostics() but doesn't work as in the autocmd for some reason.

My LSP configuration:

function! s:lsp() abort
  lua << EOF
  local lsp = require 'nvim_lsp'
  local diagnostic = require 'diagnostic'
  local nvim_command = vim.api.nvim_command

  lsp.gopls.setup{ on_attach = diagnostic.on_attach }
  lsp.tsserver.setup{ on_attach = diagnostic.on_attach }
  lsp.vimls.setup{ on_attach = diagnostic.on_attach }
EOF

  inoremap <silent> <M-f> <C-x><C-f>
  inoremap <silent> <M-g> <C-x><C-o>
  set completeopt=menuone,longest,noselect
  set pumheight=10

  function! s:b_lsp() abort
    nnoremap <silent> <buffer> gd    <cmd>lua vim.lsp.buf.declaration()<CR>
    nnoremap <silent> <buffer> <c-]> <cmd>lua vim.lsp.buf.definition()<CR>
    nnoremap <silent> <buffer> K     <cmd>lua vim.lsp.buf.hover()<CR>
    nnoremap <silent> <buffer> gD    <cmd>lua vim.lsp.buf.implementation()<CR>
    nnoremap <silent> <buffer> <c-k> <cmd>lua vim.lsp.buf.signature_help()<CR>
    nnoremap <silent> <buffer> 1gD   <cmd>lua vim.lsp.buf.type_definition()<CR>
    nnoremap <silent> <buffer> gr    <cmd>lua vim.lsp.buf.references()<CR>
    nnoremap <silent> <buffer> g0    <cmd>lua vim.lsp.buf.document_symbol()<CR>
    nnoremap <silent> <buffer> gW    <cmd>lua vim.lsp.buf.workspace_symbol()<CR>
    setlocal omnifunc=v:lua.vim.lsp.omnifunc
  endfunction

  augroup nhooyr_lsp
    autocmd!
    autocmd FileType go,vim,typescript* call s:b_lsp()
    autocmd CursorHold * lua vim.lsp.util.show_line_diagnostics()
  augroup END                                                     
endfunction  
call s:lsp()

nhooyr avatar Jun 03 '20 08:06 nhooyr

Are you sure though? Because CursorHold can be quite slow. It uses 'updatetime' which defaults to 4000ms.

lithammer avatar Jun 03 '20 08:06 lithammer

Positive. My update time is 100ms

nhooyr avatar Jun 03 '20 08:06 nhooyr

Switched to:

    autocmd CursorHold * echo 'meow' | lua vim.lsp.util.show_line_diagnostics()

I see the echo but no diagnostics. And manually running does show them.

nhooyr avatar Jun 03 '20 08:06 nhooyr

Try disabling diagnostic-nvim. Might be some conflict there.

lithammer avatar Jun 03 '20 08:06 lithammer

Oh my bad, I thought it was part of the plugin.

nhooyr avatar Jun 03 '20 08:06 nhooyr

Yup works now!

How do I disable the virtual text now from native lsp?

nhooyr avatar Jun 03 '20 08:06 nhooyr

Guess the answer is somewhere in this plugin!

nhooyr avatar Jun 03 '20 08:06 nhooyr

Something like this maybe:

do
  local diagnostic_ns = vim.api.nvim_create_namespace('vim_lsp_diagnostics')
  local default_callback = vim.lsp.callbacks['textDocument/publishDiagnostics']

  vim.lsp.callbacks['textDocument/publishDiagnostics'] = function(...)
    default_callback(...)

    local _, _, result = ...
    local bufnr = vim.uri_to_bufnr(result.uri)
    api.nvim_buf_clear_namespace(bufnr, diagnostic_ns, 0, -1)
  end
end

You can use the default callback as inspiration: https://github.com/neovim/neovim/blob/60c581b35db439dd6b32cdc2ebe1a5aed933b44c/runtime/lua/vim/lsp/callbacks.lua#L67-L92

lithammer avatar Jun 03 '20 09:06 lithammer

Works perfectly now. Not really sure what I did to fix it but must have been some user error.

function! s:lsp() abort
  lua << EOF
  local lsp = require 'nvim_lsp'
  local on_attach = function(client)
    require'diagnostic'.on_attach()
    require'completion'.on_attach()
  end

  lsp.gopls.setup{ on_attach = on_attach }
  lsp.tsserver.setup{ on_attach = on_attach }
  lsp.vimls.setup{ on_attach = on_attach }
EOF

  inoremap <silent> <M-x> <C-x>
  set completeopt=menuone,longest,noselect
  set pumheight=10

  let g:diagnostic_insert_delay = 1
  let g:completion_enable_snippet = 'Neosnippet'
  imap <C-k> <cmd>lua require'source'.nextCompletion()<CR>

  function! s:b_lsp() abort
    nnoremap <silent> <buffer> gd    <cmd>lua vim.lsp.buf.declaration()<CR>
    nnoremap <silent> <buffer> <C-]> <cmd>lua vim.lsp.buf.definition()<CR>
    nnoremap <silent> <buffer> K     <cmd>lua vim.lsp.buf.hover()<CR>
    nnoremap <silent> <buffer> gD    <cmd>lua vim.lsp.buf.implementation()<CR>
    nnoremap <silent> <buffer> <C-k> <cmd>lua vim.lsp.buf.signature_help()<CR>
    nnoremap <silent> <buffer> 1gD   <cmd>lua vim.lsp.buf.type_definition()<CR>
    nnoremap <silent> <buffer> gr    <cmd>lua vim.lsp.buf.references()<CR>
    nnoremap <silent> <buffer> g0    <cmd>lua vim.lsp.buf.document_symbol()<CR>
    nnoremap <silent> <buffer> gW    <cmd>lua vim.lsp.buf.workspace_symbol()<CR>
    setlocal omnifunc=v:lua.vim.lsp.omnifunc
  endfunction

  augroup lsp
    autocmd!
    autocmd FileType go,vim,typescript* call s:b_lsp()
    autocmd CursorHold * lua vim.lsp.util.show_line_diagnostics()
    autocmd BufEnter * lua require'completion'.on_attach()
  augroup END
endfunction
call s:lsp()

nhooyr avatar Jun 03 '20 09:06 nhooyr

Is it possible to show diagnostics window only if a popup isn't opened already? When I hover a variable and do lua vim.lsp.buf.hover() I see the popup which after 300ms gets overridden by Diagnostics popup.

desprit avatar Apr 14 '21 08:04 desprit

yes same concern as @desprit

Looks like diag messages were originally geared toward virtual text and handling a "popup only" display of diag messages is kinda rought.

Along with Desprit's concer, I use <C-n> and <C-p> to move around diag messages. This breaks if you begin to use CursorHold to have your messages pop up. Those key strokes will place you inside the actual pop-up menu, not allowing you to jump to the next diag message.

ldelossa avatar Jun 20 '21 14:06 ldelossa

This repository is deprecated by the way.

For your concern of CursorHold placing you inside the pop-up menu @ldelossa , you can use : lua vim.lsp.diagnostic.show_line_diagnostics({focusable = false})

jemag avatar Jun 20 '21 15:06 jemag