Skip to content

Commit 76d579d

Browse files
committed
maintain current fold level in also operator mapping
1 parent 55bd01d commit 76d579d

File tree

2 files changed

+12
-33
lines changed

2 files changed

+12
-33
lines changed

autoload/clang_format.vim

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -218,18 +218,15 @@ endfunction
218218
" }}}
219219

220220
" replace buffer {{{
221-
function! clang_format#replace(line1, line2) abort
221+
function! clang_format#replace(line1, line2, ...) abort
222222

223223
call s:verify_command()
224224

225-
let pos_save = getpos('.')
226-
let screen_save = line('w0')
225+
let pos_save = a:0 >= 1 ? a:1 : getpos('.')
226+
let screen_save = a:0 >= 2 ? a:2 : line('w0')
227227
let sel_save = &l:selection
228228
let &l:selection = 'inclusive'
229-
let fold_save = 0
230-
if &foldenable
231-
let fold_save = foldlevel(line('.'))
232-
endif
229+
let fold_closed_save = foldclosed(line('.'))
233230
let [save_g_reg, save_g_regtype] = [getreg('g'), getregtype('g')]
234231
let [save_unnamed_reg, save_unnamed_regtype] = [getreg(v:register), getregtype(v:register)]
235232

@@ -246,18 +243,13 @@ function! clang_format#replace(line1, line2) abort
246243
call setreg('g', save_g_reg, save_g_regtype)
247244
let &l:selection = sel_save
248245
call setpos('.', pos_save)
249-
call s:restore_screen_pos(screen_save)
250-
if fold_save > 0
251-
let level = foldlevel(line('.'))
252-
while fold_save > level
246+
if fold_closed_save == -1
247+
let l = line('.')
248+
while foldclosed(l) >= 0
253249
foldopen
254-
let l = foldlevel(line('.'))
255-
if l == level
256-
break
257-
endif
258-
let level = l
259250
endwhile
260251
endif
252+
call s:restore_screen_pos(screen_save)
261253
endtry
262254
endfunction
263255
" }}}

autoload/operator/clang_format.vim

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,17 @@ function! s:is_empty_region(begin, end) abort
22
return a:begin[1] > a:end[1] || (a:begin[1] == a:end[1] && a:end[2] < a:begin[2])
33
endfunction
44

5-
function! s:restore_screen_pos() abort
6-
let line_diff = line('w0') - g:operator#clang_format#save_screen_pos
7-
if line_diff > 0
8-
execute 'silent normal!' line_diff."\<C-y>"
9-
elseif line_diff < 0
10-
execute 'silent normal!' (-line_diff)."\<C-e>"
11-
endif
12-
endfunction
13-
145
function! operator#clang_format#do(motion_wise) abort
156
if s:is_empty_region(getpos("'["), getpos("']"))
167
return
178
endif
189

19-
call clang_format#replace(getpos("'[")[1], getpos("']")[1])
20-
2110
" Do not move cursor and screen
22-
if exists('g:operator#clang_format#save_pos')
23-
call setpos('.', g:operator#clang_format#save_pos)
11+
if exists('g:operator#clang_format#save_pos') && exists('g:operator#clang_format#save_screen_pos')
12+
call clang_format#replace(getpos("'[")[1], getpos("']")[1], g:operator#clang_format#save_pos, g:operator#clang_format#save_screen_pos)
2413
unlet g:operator#clang_format#save_pos
25-
endif
26-
27-
if exists('g:operator#clang_format#save_screen_pos')
28-
call s:restore_screen_pos()
2914
unlet g:operator#clang_format#save_screen_pos
15+
else
16+
call clang_format#replace(getpos("'[")[1], getpos("']")[1])
3017
endif
3118
endfunction

0 commit comments

Comments
 (0)