如何检测Vim缓冲区是否有折叠?

问题描述 投票:0回答:3

我正在寻找有关如何以编程方式检测 Vim 中的当前缓冲区是否至少有一个折叠的建议 - 无论折叠是打开还是关闭。

我需要此功能来定义一个自动命令,用于在保存缓冲区时调用

mkview
如果其中定义了折叠:

autocmd BufWrite ?* if FoldIsDefined() | mkview | endif

function FoldIsDefined()
  ???
endfunction
vim folding
3个回答
4
投票
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

0
投票

根据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

0
投票
function! FoldDefined()
   return len(filter(range(1, line('$')), 'foldlevel(v:val)>1'))>0
endfunction
© www.soinside.com 2019 - 2024. All rights reserved.