如何更好地翻阅Vim中的折叠?

时间:2011-08-11 01:15:33

标签: vim

我通常有foldclose = all set所以当我滚动代码时,折叠会自动打开和关闭。但有时我也喜欢使用< C-d>快速翻阅文本。和< C-u>。问题是,在我有机会看到最后一点之前,这经常跳出我正在查看的折叠并关闭它。我所追求的是一种翻阅文本的方法,如果我处于一个开放的折叠中,如果下一页将我带出它,则在折叠结束时停止。如果光标位置已经位于折叠的最后一行,则下一个分页操作将实际推进一个页面。我猜这需要一个vimscript函数,所以只想看看是否有人做过类似的事情。

3 个答案:

答案 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