mirror of
https://github.com/prabirshrestha/vim-lsp.git
synced 2025-12-14 20:35:59 +01:00
54 lines
1.9 KiB
VimL
54 lines
1.9 KiB
VimL
" https://microsoft.github.io/language-server-protocol/specification#textDocument_hover
|
|
" options - {
|
|
" server - 'server_name' " optional
|
|
" }
|
|
function! lsp#internal#document_hover#under_cursor#do(options) abort
|
|
let l:bufnr = bufnr('%')
|
|
if has_key(a:options, 'server')
|
|
let l:servers = [a:options['server']]
|
|
else
|
|
let l:servers = filter(lsp#get_allowed_servers(), 'lsp#capabilities#has_hover_provider(v:val)')
|
|
endif
|
|
|
|
if len(l:servers) == 0
|
|
let l:filetype = getbufvar(l:bufnr, '&filetype')
|
|
call lsp#utils#error('textDocument/hover not supported for ' . l:filetype)
|
|
return
|
|
endif
|
|
|
|
redraw | echo 'Retrieving hover ...'
|
|
|
|
call lsp#_new_command()
|
|
|
|
" TODO: ask user to select server for formatting if there are multiple servers
|
|
let l:request = {
|
|
\ 'method': 'textDocument/hover',
|
|
\ 'params': {
|
|
\ 'textDocument': lsp#get_text_document_identifier(),
|
|
\ 'position': lsp#get_position(),
|
|
\ },
|
|
\ }
|
|
call lsp#callbag#pipe(
|
|
\ lsp#callbag#fromList(l:servers),
|
|
\ lsp#callbag#flatMap({server->
|
|
\ lsp#request(server, l:request)
|
|
\ }),
|
|
\ lsp#callbag#tap({x->s:show_hover(x['server_name'], x['request'], x['response'])}),
|
|
\ lsp#callbag#takeUntil(lsp#callbag#pipe(
|
|
\ lsp#stream(),
|
|
\ lsp#callbag#filter({x->has_key(x, 'command')}),
|
|
\ )),
|
|
\ lsp#callbag#subscribe(),
|
|
\ )
|
|
endfunction
|
|
|
|
function! s:show_hover(server_name, request, response) abort
|
|
if !has_key(a:response, 'result') || empty(a:response['result']) ||
|
|
\ empty(a:response['result']['contents'])
|
|
call lsp#utils#error('No hover information found in server - ' . a:server_name)
|
|
return
|
|
endif
|
|
|
|
call lsp#ui#vim#output#preview(a:server_name, a:response['result']['contents'], {'statusline': ' LSP Hover'})
|
|
endfunction
|