我正在寻找有关如何以编程方式检测 Vim 中的当前缓冲区是否至少有一个折叠的建议 - 无论折叠是打开还是关闭。
我需要此功能来定义一个自动命令,用于在保存缓冲区时调用
mkview
仅如果其中定义了折叠:
autocmd BufWrite ?* if FoldIsDefined() | mkview | endif
function FoldIsDefined()
???
endfunction
func! CurrentWindowHasFolds()
let view = winsaveview()
for move in ['zj', 'zk']
sil! exec 'keepjumps norm!' move
if foldlevel('.') > 0
call winrestview(view)
return 1
endif
endfor
return 0
endfunc
根据perreal的建议,我确实为我的问题写了一个可能的解决方案:
" Detect presence of fold definition in the current buffer
function FoldDefined()
let result = 0
let save_cursor = getpos('.')
call cursor(1,1)
let scanline = line('.')
let lastline = line('$')
while scanline <= lastline
if foldlevel(scanline) > 0
let result = 1
break
endif
let scanline = scanline + 1
endwhile
call setpos('.', save_cursor)
return result
endfunction
function! FoldDefined()
return len(filter(range(1, line('$')), 'foldlevel(v:val)>1'))>0
endfunction