It would be nice if we have snippet support. i.e. that LSP snippets would expand using UltiSnips
I found some code already but I didn't nail every part down yet. Do you think it makes sense to implement that in this plugin?
function! s:escape_string(str) abort
let l:ret = substitute(a:str, '\%x00', '\\n', 'g')
let l:ret = substitute(l:ret, '"', '\\"', 'g')
return l:ret
endfunction
function! s:clear_inserted_text(line, done_position, complete_position, completed_item, completion_item) abort
" Remove commit characters.
call setline('.', a:line)
" Create range to remove v:completed_item.
let l:range = {
\ 'start': {
\ 'line': a:done_position[1] - 1,
\ 'character': lsp#utils#to_char('%', a:done_position[1], a:done_position[2] + a:done_position[3]) - strchars(a:completed_item['word'])
\ },
\ 'end': {
\ 'line': a:done_position[1] - 1,
\ 'character': lsp#utils#to_char('%', a:done_position[1], a:done_position[2] + a:done_position[3])
\ }
\ }
" Expand remove range to textEdit.
if has_key(a:completion_item, 'textEdit')
let l:range = {
\ 'start': {
\ 'line': a:completion_item['textEdit']['range']['start']['line'],
\ 'character': a:completion_item['textEdit']['range']['start']['character'],
\ },
\ 'end': {
\ 'line': a:completion_item['textEdit']['range']['end']['line'],
\ 'character': a:completion_item['textEdit']['range']['end']['character'] + strchars(a:completed_item['word']) - (a:complete_position['character'] - l:range['start']['character'])
\ }
\ }
endif
" Remove v:completed_item.word (and textEdit range if need).
call lsp#utils#text_edit#apply_text_edits(lsp#utils#get_buffer_uri(bufnr('%')), [{
\ 'range': l:range,
\ 'newText': ''
\ }])
" Move to complete start position.
call cursor(lsp#utils#position#lsp_to_vim('%', l:range['start']))
endfunction
function! s:get_expand_text(completed_item, completion_item) abort
let l:text = a:completed_item['word']
if has_key(a:completion_item, 'textEdit') && type(a:completion_item['textEdit']) == v:t_dict
let l:text = a:completion_item['textEdit']['newText']
elseif has_key(a:completion_item, 'insertText')
let l:text = a:completion_item['insertText']
endif
return l:text
endfunction
function! s:handle_completion() abort
if empty(v:completed_item)
return
endif
let l:completion_item = v:completed_item.user_data.nvim.lsp.completion_item
let l:new_text = s:get_expand_text(v:completed_item, l:completion_item)
if strlen(l:new_text) > 0
" call s:clear_inserted_text(
" \ l:line,
" \ l:done_position,
" \ l:complete_position,
" \ l:completed_item,
" \ l:completion_item,
" \ )
call feedkeys("i\<C-r>=UltiSnips#Anon(\"" . s:escape_string(l:new_text) . "\", \"\")\<CR>", 'i')
endif
endfunction
autocmd CompleteDonePre * call s:handle_completion()