我通常有foldclose = all set所以当我滚动代码时,折叠会自动打开和关闭。但有时我也喜欢使用< C-d>快速翻阅文本。和< C-u>。问题是,在我有机会看到最后一点之前,这经常跳出我正在查看的折叠并关闭它。我所追求的是一种翻阅文本的方法,如果我处于一个开放的折叠中,如果下一页将我带出它,则在折叠结束时停止。如果光标位置已经位于折叠的最后一行,则下一个分页操作将实际推进一个页面。我猜这需要一个vimscript函数,所以只想看看是否有人做过类似的事情。
答案 0 :(得分:2)
你可以从这开始:
function! FoldawareCD()
let there = line('.') + &scroll
let nextl = line('.') + 1
if foldlevel('.') > 0 && foldclosed('.') == -1 && (foldclosed(there) != -1 || foldlevel(there) == 0) && (foldclosed(nextl) == -1 && foldlevel(nextl) > 0)
call feedkeys("]z")
else
call feedkeys("^D")
endif
endfunction
noremap <F1> :call FoldawareCD()<CR>
If
exaplanation foldlevel('.') > 0 && foldclosed('.') == -1
当我们处于公开场合时
(foldclosed(there) != -1 || foldlevel(there) == 0)
当 ^ D 落在封闭的折叠上或非折叠上时
(foldclosed(nextl) == -1 && foldlevel(nextl) > 0)
当下一行在我们的折叠中时是真的(所以我们在开放折叠的最后一行不)
答案 1 :(得分:0)
您可以尝试以下映射
nnoremap <C-D> Lz.
nnoremap <C-U> Hz.
将光标移动到第一个/最后一个可见线和滚动,使其成为中间线。
答案 2 :(得分:-2)
尝试将此添加到.vimrc文件中。我不确定它是否符合你的要求,但它是我发现的最好的。
set foldmethod=syntax "fold based on indent
set foldnestmax=10 "deepest fold is 10 levels
set nofoldenable "dont fold by default
set foldlevel=1 "this is just what i use