Skip to content

Commit 395c63e

Browse files
committed
Correct end position for editing
When end column is 0, This mean 'whole-line'. Fixes #216
1 parent 8a8734a commit 395c63e

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

autoload/lsp/ui/vim.vim

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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 .= '$' " 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)