Skip to content

Commit a2aa8af

Browse files
committed
Fix issue #49
This ensures that cursor position is not lost when a :ClangFormat is issued on a file that is open in multiple panes. This was taken from vim-go [1] see commit for full explanation [1] fatih/vim-go@99a1732
1 parent 894814b commit a2aa8af

File tree

1 file changed

+14
-41
lines changed

1 file changed

+14
-41
lines changed

autoload/clang_format.vim

+14-41
Original file line numberDiff line numberDiff line change
@@ -97,20 +97,6 @@ function! s:error_message(result) abort
9797
endif
9898
endfunction
9999

100-
function! s:restore_screen_pos(prev_screen) abort
101-
let screen_line = line('w0')
102-
if screen_line == a:prev_screen
103-
return
104-
endif
105-
let delta = screen_line - a:prev_screen
106-
if delta > 0
107-
let keys = delta . "\<C-y>"
108-
else
109-
let keys = (-delta) . "\<C-e>"
110-
endif
111-
execute "normal!" keys
112-
endfunction
113-
114100
function! clang_format#get_version() abort
115101
if &shell =~# 'csh$' && executable('/bin/bash')
116102
let shell_save = &shell
@@ -240,38 +226,25 @@ endfunction
240226

241227
" replace buffer {{{
242228
function! clang_format#replace(line1, line2, ...) abort
243-
244229
call s:verify_command()
245230

246231
let pos_save = a:0 >= 1 ? a:1 : getpos('.')
247-
let screen_save = a:0 >= 2 ? a:2 : line('w0')
248-
let sel_save = &l:selection
249-
let &l:selection = 'inclusive'
250-
let fold_closed_save = foldclosed(line('.'))
251-
let [save_g_reg, save_g_regtype] = [getreg('g'), getregtype('g')]
252-
let [save_unnamed_reg, save_unnamed_regtype] = [getreg(v:register), getregtype(v:register)]
253-
254-
try
255-
let formatted = clang_format#format(a:line1, a:line2)
256-
if s:success(formatted)
257-
call setreg('g', formatted, 'V')
258-
silent keepjumps normal! gg0VG"gp
259-
else
260-
call s:error_message(formatted)
232+
let formatted = clang_format#format(a:line1, a:line2)
233+
if s:success(formatted)
234+
let winview = winsaveview()
235+
let splitted = split(formatted, '\n')
236+
237+
silent! undojoin
238+
if line('$') > len(splitted)
239+
execute len(splitted) .',$delete'
261240
endif
262-
finally
263-
call setreg(v:register, save_unnamed_reg, save_unnamed_regtype)
264-
call setreg('g', save_g_reg, save_g_regtype)
265-
let &l:selection = sel_save
241+
call setline(1, splitted)
242+
call winrestview(winview)
266243
call setpos('.', pos_save)
267-
if fold_closed_save == -1
268-
let l = line('.')
269-
while foldclosed(l) >= 0
270-
foldopen
271-
endwhile
272-
endif
273-
call s:restore_screen_pos(screen_save)
274-
endtry
244+
else
245+
call s:error_message(formatted)
246+
endif
247+
275248
endfunction
276249
" }}}
277250

0 commit comments

Comments
 (0)