Skip to content

Commit b1083bf

Browse files
authored
Merge pull request #218 from prabirshrestha/fix-216
Correct end position for editing
2 parents 8a8734a + eba9ca2 commit b1083bf

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

autoload/lsp/client.vim

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ function! s:lsp_is_error(obj_or_response) abort
240240
return has_key(a:obj_or_response, 'error')
241241
endfunction
242242

243+
function! s:lsp_is_error(obj_or_response) abort
244+
return has_key(a:obj_or_response, 'error')
245+
endfunction
246+
247+
243248
function! s:is_server_instantiated_notification(notification) abort
244249
return !has_key(a:notification, 'request')
245250
endfunction
@@ -270,6 +275,18 @@ function! lsp#client#is_error(obj_or_response) abort
270275
return s:lsp_is_error(a:obj_or_response)
271276
endfunction
272277

278+
function! lsp#client#error_message(obj_or_response) abort
279+
try
280+
return a:obj_or_response['error']['data']['message']
281+
catch
282+
endtry
283+
try
284+
return a:obj_or_response['error']['message']
285+
catch
286+
endtry
287+
return string(a:obj_or_response)
288+
endfunction
289+
273290
function! lsp#client#is_server_instantiated_notification(notification) abort
274291
return s:is_server_instantiated_notification(a:notification)
275292
endfunction

autoload/lsp/ui/vim.vim

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ function! s:handle_symbol(server, last_req_id, type, data) abort
298298
endif
299299

300300
if lsp#client#is_error(a:data['response'])
301-
call lsp#utils#error('Failed to retrieve '. a:type . ' for ' . a:server)
301+
call lsp#utils#error('Failed to retrieve '. a:type . ' for ' . a:server . ': ' . lsp#client#error_message(a:data['response']))
302302
return
303303
endif
304304

@@ -322,7 +322,7 @@ function! s:handle_location(ctx, server, type, data) abort "ctx = {counter, list
322322
let a:ctx['counter'] = a:ctx['counter'] - 1
323323

324324
if lsp#client#is_error(a:data['response'])
325-
call lsp#utils#error('Failed to retrieve '. a:type . ' for ' . a:server)
325+
call lsp#utils#error('Failed to retrieve '. a:type . ' for ' . a:server . ': ' . lsp#client#error_message(a:data['response']))
326326
else
327327
let a:ctx['list'] = a:ctx['list'] + lsp#ui#vim#utils#locations_to_loc_list(a:data)
328328
endif
@@ -353,8 +353,8 @@ function! s:handle_workspace_edit(server, last_req_id, type, data) abort
353353
return
354354
endif
355355

356-
if lsp#client#is_error(a:data)
357-
call lsp#utils#error('Failed to retrieve '. a:type . ' for ' . a:server)
356+
if lsp#client#is_error(a:data['response'])
357+
call lsp#utils#error('Failed to retrieve '. a:type . ' for ' . a:server . ': ' . lsp#client#error_message(a:data['response']))
358358
return
359359
endif
360360

@@ -369,7 +369,7 @@ function! s:handle_text_edit(server, last_req_id, type, data) abort
369369
endif
370370

371371
if lsp#client#is_error(a:data['response'])
372-
call lsp#utils#error('Failed to '. a:type . ' for ' . a:server)
372+
call lsp#utils#error('Failed to '. a:type . ' for ' . a:server . ': ' . lsp#client#error_message(a:data['response']))
373373
return
374374
endif
375375

@@ -490,7 +490,7 @@ function! s:apply_text_edits(uri, text_edits) abort
490490
let l:was_view = winsaveview()
491491

492492
set paste
493-
set selection=inclusive
493+
set selection=exclusive
494494
set virtualedit=onemore
495495

496496
execute l:cmd
@@ -588,7 +588,7 @@ function! s:generate_sub_cmd_insert(text_edit) abort
588588
let l:new_text = s:parse(a:text_edit['newText'])
589589

590590
let l:sub_cmd = s:preprocess_cmd(a:text_edit['range'])
591-
let l:sub_cmd .= s:generate_move_cmd(l:start_line, l:start_character)
591+
let l:sub_cmd .= s:generate_move_start_cmd(l:start_line, l:start_character)
592592

593593
if len(l:new_text) == 0
594594
let l:sub_cmd .= 'x'
@@ -613,9 +613,9 @@ function! s:generate_sub_cmd_replace(text_edit) abort
613613
let l:new_text = substitute(a:text_edit['newText'], '\n$', '', '')
614614

615615
let l:sub_cmd = s:preprocess_cmd(a:text_edit['range'])
616-
let l:sub_cmd .= s:generate_move_cmd(l:start_line, l:start_character) " move to the first position
616+
let l:sub_cmd .= s:generate_move_start_cmd(l:start_line, l:start_character) " move to the first position
617617
let l:sub_cmd .= 'v'
618-
let l:sub_cmd .= s:generate_move_cmd(l:end_line, l:end_character) " move to the last position
618+
let l:sub_cmd .= s:generate_move_end_cmd(l:end_line, l:end_character) " move to the last position
619619

620620
if len(l:new_text) == 0
621621
let l:sub_cmd .= 'x'
@@ -627,14 +627,24 @@ function! s:generate_sub_cmd_replace(text_edit) abort
627627
return l:sub_cmd
628628
endfunction
629629

630-
function! s:generate_move_cmd(line_pos, character_pos) abort
630+
function! s:generate_move_start_cmd(line_pos, character_pos) abort
631631
let l:result = printf('%dG0', a:line_pos) " move the line and set to the cursor at the beginning
632632
if a:character_pos > 0
633633
let l:result .= printf('%dl', a:character_pos) " move right until the character
634634
endif
635635
return l:result
636636
endfunction
637637

638+
function! s:generate_move_end_cmd(line_pos, character_pos) abort
639+
let l:result = printf('%dG0', a:line_pos) " move the line and set to the cursor at the beginning
640+
if a:character_pos > 0
641+
let l:result .= printf('%dl', a:character_pos) " move right until the character
642+
else
643+
let l:result = printf('%dG$', a:line_pos - 1) " move most right
644+
endif
645+
return l:result
646+
endfunction
647+
638648
function! s:parse(text) abort
639649
" https://stackoverflow.com/questions/71417/why-is-r-a-newline-for-vim
640650
return substitute(a:text, '\(^\n|\n$\|\r\n\)', '\r', 'g')

0 commit comments

Comments
 (0)