Skip to content

Commit 507565f

Browse files
authored
fix eat of typing char after completion done (#1468)
When using typescript-language-server, in content `Math.ab|`, if you type `<C-X><C-o>` for omni completion, it will be completed with `s`. Then, the content will become `Math.abs|`. If you continue typing `(`, the `(` will be removed. Also, if type `<CR>`, a new line will be added, resulting in `Math.abs|s\nMath.ab`. This patch attempts to fix this issue.
1 parent 80644e1 commit 507565f

File tree

3 files changed

+23
-21
lines changed

3 files changed

+23
-21
lines changed

autoload/lsp/omni.vim

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -311,44 +311,43 @@ function! lsp#omni#get_vim_completion_items(options) abort
311311
\ 'icase': 1,
312312
\ }
313313
let l:range = lsp#utils#text_edit#get_range(get(l:completion_item, 'textEdit', {}))
314+
let l:complete_word = ''
314315
if has_key(l:completion_item, 'textEdit') && type(l:completion_item['textEdit']) == s:t_dict && !empty(l:range) && has_key(l:completion_item['textEdit'], 'newText')
315316
let l:text_edit_new_text = l:completion_item['textEdit']['newText']
316317
if has_key(l:completion_item, 'filterText') && !empty(l:completion_item['filterText']) && matchstr(l:text_edit_new_text, '^' . l:refresh_pattern) ==# ''
317318
" Use filterText as word.
318-
let l:vim_complete_item['word'] = l:completion_item['filterText']
319+
let l:complete_word = l:completion_item['filterText']
319320
else
320321
" Use textEdit.newText as word.
321-
let l:vim_complete_item['word'] = l:text_edit_new_text
322+
let l:complete_word = l:text_edit_new_text
322323
endif
323324

324-
" Fix overlapped text if needed.
325325
let l:item_start_character = l:range['start']['character']
326-
if l:item_start_character < l:default_start_character
327-
" Add already typed word. The typescript-language-server returns `[Symbol]` item for the line of `Hoo.|`. So we should add `.` (`.[Symbol]`) .
328-
let l:overlap_text = strcharpart(l:current_line, l:item_start_character, l:default_start_character - l:item_start_character)
329-
if stridx(l:vim_complete_item['word'], l:overlap_text) != 0
330-
let l:vim_complete_item['word'] = l:overlap_text . l:vim_complete_item['word']
331-
endif
332-
endif
333326
let l:start_character = min([l:item_start_character, l:start_character])
334327
let l:start_characters += [l:item_start_character]
335328
elseif has_key(l:completion_item, 'insertText') && !empty(l:completion_item['insertText'])
336-
let l:vim_complete_item['word'] = l:completion_item['insertText']
329+
let l:complete_word = l:completion_item['insertText']
337330
let l:start_characters += [l:default_start_character]
338331
else
339-
let l:vim_complete_item['word'] = l:completion_item['label']
332+
let l:complete_word = l:completion_item['label']
340333
let l:start_characters += [l:default_start_character]
341334
endif
342335

343336
if l:expandable
344-
let l:vim_complete_item['word'] = lsp#utils#make_valid_word(substitute(l:vim_complete_item['word'], '\$[0-9]\+\|\${\%(\\.\|[^}]\)\+}', '', 'g'))
337+
let l:vim_complete_item['word'] = lsp#utils#make_valid_word(substitute(l:complete_word, '\$[0-9]\+\|\${\%(\\.\|[^}]\)\+}', '', 'g'))
345338
let l:vim_complete_item['abbr'] = l:completion_item['label'] . '~'
346339
else
340+
let l:vim_complete_item['word'] = l:complete_word
347341
let l:vim_complete_item['abbr'] = l:completion_item['label']
348342
endif
349343

350344
if s:is_user_data_support
351-
let l:vim_complete_item['user_data'] = s:create_user_data(l:completion_item, l:server_name, l:complete_position, l:start_characters[len(l:start_characters) - 1])
345+
let l:vim_complete_item['user_data'] = s:create_user_data(
346+
\ l:completion_item,
347+
\ l:server_name,
348+
\ l:complete_position,
349+
\ l:start_characters[-1],
350+
\ l:complete_word)
352351
endif
353352

354353
let l:vim_complete_items += [l:vim_complete_item]
@@ -382,13 +381,14 @@ endfunction
382381
"
383382
" create item's user_data.
384383
"
385-
function! s:create_user_data(completion_item, server_name, complete_position, start_character) abort
384+
function! s:create_user_data(completion_item, server_name, complete_position, start_character, complete_word) abort
386385
let l:user_data_key = s:create_user_data_key(s:managed_user_data_key_base)
387386
let s:managed_user_data_map[l:user_data_key] = {
388387
\ 'complete_position': a:complete_position,
389388
\ 'server_name': a:server_name,
390389
\ 'completion_item': a:completion_item,
391390
\ 'start_character': a:start_character,
391+
\ 'complete_word': a:complete_word,
392392
\ }
393393
let s:managed_user_data_key_base += 1
394394
return l:user_data_key

autoload/lsp/ui/vim/completion.vim

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ function! s:on_complete_done() abort
5050

5151
let s:context['done_line'] = getline('.')
5252
let s:context['done_line_nr'] = line('.')
53-
let s:context['completed_item'] = copy(v:completed_item)
5453
let s:context['done_position'] = lsp#utils#position#vim_to_lsp('%', getpos('.')[1 : 2])
5554
let s:context['complete_position'] = l:managed_user_data['complete_position']
5655
let s:context['server_name'] = l:managed_user_data['server_name']
5756
let s:context['completion_item'] = l:managed_user_data['completion_item']
5857
let s:context['start_character'] = l:managed_user_data['start_character']
58+
let s:context['complete_word'] = l:managed_user_data['complete_word']
5959
call feedkeys(printf("\<C-r>=<SNR>%d_on_complete_done_after()\<CR>", s:SID()), 'n')
6060
endfunction
6161

@@ -73,12 +73,12 @@ function! s:on_complete_done_after() abort
7373

7474
let l:done_line = s:context['done_line']
7575
let l:done_line_nr = s:context['done_line_nr']
76-
let l:completed_item = s:context['completed_item']
7776
let l:done_position = s:context['done_position']
7877
let l:complete_position = s:context['complete_position']
7978
let l:server_name = s:context['server_name']
8079
let l:completion_item = s:context['completion_item']
8180
let l:start_character = s:context['start_character']
81+
let l:complete_word = s:context['complete_word']
8282

8383
" check the commit characters are <BS> or <C-w>.
8484
if line('.') ==# l:done_line_nr && strlen(getline('.')) < strlen(l:done_line)
@@ -95,7 +95,7 @@ function! s:on_complete_done_after() abort
9595
let l:completion_item = s:resolve_completion_item(l:completion_item, l:server_name)
9696

9797
" clear completed string if need.
98-
let l:is_expandable = s:is_expandable(l:done_line, l:done_position, l:complete_position, l:completion_item, l:completed_item)
98+
let l:is_expandable = s:is_expandable(l:done_line, l:done_position, l:complete_position, l:completion_item, l:complete_word)
9999
if l:is_expandable
100100
call s:clear_auto_inserted_text(l:done_line, l:done_position, l:complete_position)
101101
endif
@@ -162,7 +162,7 @@ endfunction
162162
"
163163
" is_expandable
164164
"
165-
function! s:is_expandable(done_line, done_position, complete_position, completion_item, completed_item) abort
165+
function! s:is_expandable(done_line, done_position, complete_position, completion_item, complete_word) abort
166166
if get(a:completion_item, 'textEdit', v:null) isnot# v:null
167167
let l:range = lsp#utils#text_edit#get_range(a:completion_item['textEdit'])
168168
if l:range['start']['line'] != l:range['end']['line']
@@ -177,7 +177,7 @@ function! s:is_expandable(done_line, done_position, complete_position, completio
177177
let l:text_edit_after = strcharpart(l:completed_line, l:range['end']['character'], strchars(l:completed_line) - l:range['end']['character'])
178178
return a:done_line !=# l:text_edit_before . s:trim_unmeaning_tabstop(a:completion_item['textEdit']['newText']) . l:text_edit_after
179179
endif
180-
return s:get_completion_text(a:completion_item) !=# s:trim_unmeaning_tabstop(a:completed_item['word'])
180+
return s:get_completion_text(a:completion_item) !=# s:trim_unmeaning_tabstop(a:complete_word)
181181
endfunction
182182

183183
"
@@ -246,7 +246,7 @@ endfunction
246246
function! s:clear_auto_inserted_text(done_line, done_position, complete_position) abort
247247
let l:before = strcharpart(a:done_line, 0, a:complete_position['character'])
248248
let l:after = strcharpart(a:done_line, a:done_position['character'], (strchars(a:done_line) - a:done_position['character']))
249-
call setline('.', l:before . l:after)
249+
call setline(a:done_position['line'] + 1, l:before . l:after)
250250
call cursor([a:done_position['line'] + 1, strlen(l:before) + 1])
251251
endfunction
252252

test/lsp/omni.vimspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Describe lsp#omni
8484
\ 'completion_item': item,
8585
\ 'complete_position': { 'line': 1, 'character': 1 },
8686
\ 'start_character': 0,
87+
\ 'complete_word': 'yyy',
8788
\ })
8889
End
8990

@@ -187,6 +188,7 @@ Describe lsp#omni
187188
\ 'completion_item': item,
188189
\ 'complete_position': { 'line': 1, 'character': 1 },
189190
\ 'start_character': 0,
191+
\ 'complete_word': 'System.out.println(${0});',
190192
\ })
191193
End
192194

0 commit comments

Comments
 (0)