diff --git a/autoload/lsp.vim b/autoload/lsp.vim index 1ab073f1c..94b89bf42 100644 --- a/autoload/lsp.vim +++ b/autoload/lsp.vim @@ -153,6 +153,9 @@ function! s:on_text_document_did_open() abort call lsp#log('s:on_text_document_did_open()', l:buf, &filetype, getcwd(), lsp#utils#get_buffer_uri(l:buf)) for l:server_name in lsp#get_whitelisted_servers() call s:ensure_flush(l:buf, l:server_name, function('s:Noop')) + if g:lsp_hover_balloon_eval + setlocal ballooneval balloonexpr=lsp#ui#vim#hover#balloon() + endif endfor endfunction diff --git a/autoload/lsp/ui/vim/hover.vim b/autoload/lsp/ui/vim/hover.vim index 4166d7783..a0ef8cef4 100644 --- a/autoload/lsp/ui/vim/hover.vim +++ b/autoload/lsp/ui/vim/hover.vim @@ -2,6 +2,44 @@ function! s:not_supported(what) abort return lsp#utils#error(a:what.' not supported for '.&filetype) endfunction +function! lsp#ui#vim#hover#balloon() abort + let l:servers = filter(lsp#get_whitelisted_servers(), 'lsp#capabilities#has_hover_provider(v:val)') + + if len(l:servers) == 0 + echom 'Retrieving hover not supported for ' . &filetype + return '' + endif + + for l:server in l:servers + call lsp#send_request(l:server, { + \ 'method': 'textDocument/hover', + \ 'params': { + \ 'textDocument': lsp#get_text_document_identifier(), + \ 'position': { 'line': v:beval_lnum - 1, 'character': v:beval_col - 1 } + \ }, + \ 'on_notification': function('s:handle_balloon', [l:server]), + \ }) + endfor + + echom 'Retrieving hover ...' + return '' +endfunction + +function! s:handle_balloon(server, data) abort + if lsp#client#is_error(a:data['response']) + call lsp#utils#error('Failed to retrieve hover information for ' . a:server) + return + endif + + if !has_key(a:data['response'], 'result') + return + endif + + let l:contents = a:data['response']['result']['contents'] + + call balloon_show(l:contents.value) +endfunction + function! lsp#ui#vim#hover#get_hover_under_cursor() abort let l:servers = filter(lsp#get_whitelisted_servers(), 'lsp#capabilities#has_hover_provider(v:val)') diff --git a/plugin/lsp.vim b/plugin/lsp.vim index e7b723b0d..fce926499 100644 --- a/plugin/lsp.vim +++ b/plugin/lsp.vim @@ -4,6 +4,7 @@ endif let g:lsp_loaded = 1 let g:lsp_auto_enable = get(g:, 'lsp_auto_enable', 1) +let g:lsp_hover_balloon_eval = get(g:, 'lsp_hover_balloon_eval', has('balloon_eval')) let g:lsp_async_completion = get(g:, 'lsp_async_completion', 0) let g:lsp_log_file = get(g:, 'lsp_log_file', '') let g:lsp_log_verbose = get(g:, 'lsp_log_verbose', 1)