Files
vim-lsp-mirror/autoload/lsp/internal/show_message_request.vim
Prabir Shrestha 51eb1f6676 add support for window/showMessageRequest (#919)
* show message request
* materialize so doesn't throw error and add message to input list
* fix lint issues and rename flag to lsp_show_message_request_enabled
* use action and fix filter
* document g:lsp_show_message_request_enabled
2020-10-18 08:46:03 -07:00

59 lines
2.1 KiB
VimL

function! lsp#internal#show_message_request#_enable() abort
if !g:lsp_show_message_request_enabled | return | endif
let s:Dispose = lsp#callbag#pipe(
\ lsp#stream(),
\ lsp#callbag#filter({x->
\ g:lsp_show_message_request_enabled &&
\ has_key(x, 'request') && !has_key(x, 'response') &&
\ has_key(x['request'], 'method') && x['request']['method'] ==# 'window/showMessageRequest'
\ }),
\ lsp#callbag#map({x->s:show_message_request(x['server'], x['request'])}),
\ lsp#callbag#map({x->s:send_message_response(x['server'], x['request'], x['action'])}),
\ lsp#callbag#flatten(),
\ lsp#callbag#materialize(),
\ lsp#callbag#subscribe({ 'error': function('s:on_error') }),
\ )
endfunction
function! lsp#internal#show_message_request#_disable() abort
if exists('s:Dispose')
call s:Dispose()
unlet s:Dispose
endif
endfunction
function! s:on_error(e) abort
call lsp#log('lsp#internal#show_message_request error', a:e)
if exists('s:Dispose')
call s:Dispose()
unlet s:Dispose
endif
endfunction
function! s:show_message_request(server_name, request) abort
let l:params = a:request['params']
let l:selected_action = v:null
if has_key(l:params, 'actions') && !empty(l:params['actions'])
let l:options = map(copy(l:params['actions']), {i, action ->
\ printf('%d - [%s] %s', i + 1, a:server_name, action['title'])
\ })
let l:index = inputlist([l:params['message']] + l:options)
if l:index > 0 && l:index <= len(l:index)
let l:selected_action = l:params['actions'][l:index - 1]
endif
else
echom l:params['message']
endif
return { 'server': a:server_name, 'request': a:request, 'action': l:selected_action }
endfunction
function! s:send_message_response(server_name, request, action) abort
return lsp#request(a:server_name, {
\ 'id': a:request['id'],
\ 'result': a:action
\})
endfunction