【问题标题】:How detect Vim buffer contains a fold?如何检测 Vim 缓冲区包含折叠?
【发布时间】:2012-03-29 17:08:41
【问题描述】:

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

如果当前缓冲区中定义了折叠,则尝试调用mkview

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

function fold_defined()
  ???
endfunction

【问题讨论】:

    标签: vim folding


    【解决方案1】:
    function! HasFold()
        let v = winsaveview()
        let fold = 0
        for mv in ['zj', 'zk']
            exe 'keepj norm!' mv
            if foldlevel('.') > 0
                let fold = 1
                break
            endif
        endfor
        call winrestview(v)
        return fold
    endfunction
    

    【讨论】:

    • Thx,“快捷方式”命令 'zj' 和 'zk' 绝对是优化改进。
    • @DavidUnric:这个功能能解决你的问题吗?请告诉我。
    • 派对迟到了,但想知道这是否有效/有效......我想把一些部分放在一起,根据是否有折叠自动打开和关闭foldcolumn。当没有任何折叠时,我很难找到一个不会在我的终端发出哔哔声的功能。测试表明这也会发出哔哔声。
    【解决方案2】:

    基于perreal's advice,我确实为我的问题写了一个可能的解决方案:

    " 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
    

    【讨论】:

    【解决方案3】:
    function! FoldDefined()
       return len(filter(range(1, line('$')), 'foldlevel(v:val)>1'))>0
    endfunction
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多