4
4
function ! s: _SID () abort
5
5
return matchstr (expand (' <sfile>' ), ' <SNR>\zs\d\+\ze__SID$' )
6
6
endfunction
7
- execute join ([' function! vital#_lsp#VS#LSP#TextEdit#import() abort' , printf (" return map({'set_method': '', '_vital_depends': '', 'get_method': '', 'is_text_mark_preserved': '', 'apply': '', 'get_methods': '', '_vital_loaded': ''}, \" vital#_lsp#function('<SNR>%s_' . v:key)\" )" , s: _SID ()), ' endfunction' ], " \n " )
7
+ execute join ([' function! vital#_lsp#VS#LSP#TextEdit#import() abort' , printf (" return map({'set_method': '', '_vital_depends': '', 'get_method': '', 'is_text_mark_preserved': '', 'apply': '', 'get_methods': '', 'delete': '', ' _vital_loaded': ''}, \" vital#_lsp#function('<SNR>%s_' . v:key)\" )" , s: _SID ()), ' endfunction' ], " \n " )
8
8
delfunction s: _SID
9
9
" ___vital___
10
10
"
@@ -55,8 +55,10 @@ function! s:get_method() abort
55
55
if s: _method == # ' auto'
56
56
if exists (' *nvim_buf_set_text' )
57
57
return ' nvim_buf_set_text'
58
- else
58
+ elseif ! has ( ' nvim ' )
59
59
return ' normal'
60
+ else
61
+ return ' function'
60
62
endif
61
63
endif
62
64
return s: _method
@@ -66,7 +68,7 @@ endfunction
66
68
" get_methods
67
69
"
68
70
function ! s: get_methods () abort
69
- return [' function ' , ' nvim_buf_set_text ' , ' normal ' ]
71
+ return [' nvim_buf_set_text ' , ' normal ' , ' function ' ]
70
72
endfunction
71
73
72
74
"
@@ -89,7 +91,7 @@ function! s:apply(path, text_edits) abort
89
91
let [l: has_overflowed , l: text_edits ] = s: _normalize (bufnr (l: target_bufname ), a: text_edits )
90
92
let l: fix_cursor = s: _methods [s: get_method ()](bufnr (l: target_bufname ), l: text_edits , l: cursor_position )
91
93
if l: has_overflowed && getline (' $' ) == # ' '
92
- $ delete _
94
+ call s: delete( bufnr ( l: target_bufname ), ' $ ' , ' $ ' )
93
95
endif
94
96
call s: _switch (l: current_bufname )
95
97
catch /.*/
@@ -135,7 +137,7 @@ function! s:_methods.normal(bufnr, text_edits, cursor_position) abort
135
137
136
138
try
137
139
let l: Restore = s: Option .define ({
138
- \ ' foldenable' : ' 1 ' ,
140
+ \ ' foldenable' : ' 0 ' ,
139
141
\ ' virtualedit' : ' onemore' ,
140
142
\ ' whichwrap' : ' h' ,
141
143
\ ' selection' : ' exclusive' ,
@@ -172,50 +174,41 @@ endfunction
172
174
"
173
175
function ! s: _methods .function (bufnr , text_edits, cursor_position) abort
174
176
let l: fix_cursor = v: false
175
- try
176
- let l: Restore = s: Option .define ({
177
- \ ' foldenable' : ' 1' ,
178
- \ })
179
177
180
- for l: text_edit in a: text_edits
181
- let l: start_line = getline (l: text_edit .range .start .line + 1 )
182
- let l: end_line = getline (l: text_edit .range .end .line + 1 )
183
- let l: before_line = strcharpart (l: start_line , 0 , l: text_edit .range .start .character )
184
- let l: after_line = strcharpart (l: end_line , l: text_edit .range .end .character , strchars (l: end_line ) - l: text_edit .range .end .character )
185
-
186
- " create lines.
187
- let l: lines = s: Text .split_by_eol (l: text_edit .newText)
188
- let l: lines [0 ] = l: before_line . l: lines [0 ]
189
- let l: lines [-1 ] = l: lines [-1 ] . l: after_line
190
-
191
- " save length.
192
- let l: lines_len = len (l: lines )
193
- let l: range_len = (l: text_edit .range .end .line - l: text_edit .range .start .line ) + 1
194
-
195
- " append or delete lines.
196
- if l: lines_len > l: range_len
197
- call append (l: text_edit .range .end .line , repeat ([' ' ], l: lines_len - l: range_len ))
198
- elseif l: lines_len < l: range_len
199
- execute printf (' %s,%sdelete _' , l: text_edit .range .start .line + l: lines_len , l: text_edit .range .end .line )
178
+ for l: text_edit in a: text_edits
179
+ let l: start_line = getline (l: text_edit .range .start .line + 1 )
180
+ let l: end_line = getline (l: text_edit .range .end .line + 1 )
181
+ let l: before_line = strcharpart (l: start_line , 0 , l: text_edit .range .start .character )
182
+ let l: after_line = strcharpart (l: end_line , l: text_edit .range .end .character , strchars (l: end_line ) - l: text_edit .range .end .character )
183
+
184
+ " create lines.
185
+ let l: lines = s: Text .split_by_eol (l: text_edit .newText)
186
+ let l: lines [0 ] = l: before_line . l: lines [0 ]
187
+ let l: lines [-1 ] = l: lines [-1 ] . l: after_line
188
+
189
+ " save length.
190
+ let l: lines_len = len (l: lines )
191
+ let l: range_len = (l: text_edit .range .end .line - l: text_edit .range .start .line ) + 1
192
+
193
+ " append or delete lines.
194
+ if l: lines_len > l: range_len
195
+ call append (l: text_edit .range .end .line , repeat ([' ' ], l: lines_len - l: range_len ))
196
+ elseif l: lines_len < l: range_len
197
+ call s: delete (a: bufnr , l: text_edit .range .start .line + l: lines_len , l: text_edit .range .end .line )
198
+ endif
199
+
200
+ " set lines.
201
+ let l: i = 0
202
+ while l: i < len (l: lines )
203
+ let l: lnum = l: text_edit .range .start .line + l: i + 1
204
+ if get (getbufline (a: bufnr , l: lnum ), 0 , v: null ) !=# l: lines [l: i ]
205
+ call setline (l: lnum , l: lines [l: i ])
200
206
endif
207
+ let l: i += 1
208
+ endwhile
201
209
202
- " set lines.
203
- let l: i = 0
204
- while l: i < len (l: lines )
205
- let l: lnum = l: text_edit .range .start .line + l: i + 1
206
- if get (getbufline (a: bufnr , l: lnum ), 0 , v: null ) !=# l: lines [l: i ]
207
- call setline (l: lnum , l: lines [l: i ])
208
- endif
209
- let l: i += 1
210
- endwhile
211
-
212
- let l: fix_cursor = s: _fix_cursor (a: cursor_position , l: text_edit , s: Text .split_by_eol (l: text_edit .newText))
213
- endfor
214
- catch /.*/
215
- echomsg string ({ ' exception' : v: exception , ' throwpoint' : v: throwpoint })
216
- finally
217
- call l: Restore ()
218
- endtry
210
+ let l: fix_cursor = s: _fix_cursor (a: cursor_position , l: text_edit , s: Text .split_by_eol (l: text_edit .newText))
211
+ endfor
219
212
220
213
return l: fix_cursor
221
214
endfunction
@@ -279,7 +272,6 @@ function! s:_check(text_edits) abort
279
272
\ l: range .end .line == l: text_edit .range .start .line &&
280
273
\ l: range .end .character > l: text_edit .range .start .character
281
274
\ )
282
-
283
275
echomsg ' VS.LSP.TextEdit: range overlapped.'
284
276
endif
285
277
let l: range = l: text_edit .range
@@ -337,3 +329,18 @@ function! s:_switch(path) abort
337
329
endif
338
330
endfunction
339
331
332
+ "
333
+ " delete
334
+ "
335
+ function ! s: delete (bufnr , start , end ) abort
336
+ if exists (' *deletebufline' )
337
+ call deletebufline (a: bufnr , a: start , a: end )
338
+ else
339
+ try
340
+ let l: Restore = s: Option .define ({ ' foldenable' : ' 0' })
341
+ execute printf (' %s,%sdelete _' , a: start , a: end )
342
+ finally
343
+ call l: Restore ()
344
+ endtry
345
+ endif
346
+ endfunction
0 commit comments