【问题标题】:Is there any way to make VIM fold one line more?有什么办法可以让vim多折叠一行?
【发布时间】:2014-06-20 02:50:58
【问题描述】:

我正在使用对已发布的 herehere 的 VIM 折叠设置的改编。现在,请注意下面的程序:

当在我的 VIM 上折叠时,它会产生以下结果:

我不太喜欢这种外观,我更喜欢以下外观:

我通过重写代码得到的:

但是留下这样的代码是可怕的。是否可以更新 VimScript 以便获得我想要的折叠,而不必像那样保留 JavaScript 代码?

这是我的确切设置:

setlocal foldmethod=expr
setlocal foldexpr=GetPotionFold(v:lnum)
setlocal foldminlines=0

function! s:NextNonBlankLine(lnum)
    let numlines = line('$')
    let current = a:lnum + 1

    while current <= numlines
        if getline(current) =~? '\v\S'
            return current
        endif

        let current += 1
    endwhile

    return -2
endfunction

function! s:IndentLevel(lnum)
    return indent(a:lnum) / &shiftwidth
endfunction

function! GetPotionFold(lnum)
    if getline(a:lnum) =~? '\v^\s*$'
        return '-1'
    endif

    let this_indent = <SID>IndentLevel(a:lnum)
    let next_indent = <SID>IndentLevel(<SID>NextNonBlankLine(a:lnum))

    if next_indent == this_indent
        return this_indent
    elseif next_indent < this_indent
        return this_indent
    elseif next_indent > this_indent
        return '>' . next_indent
    endif
endfunction

function! NeatFoldText()
  let line = getline(v:foldstart)
  let lines_count = v:foldend - v:foldstart + 1
  let lines_count_text = '| ' . printf("%10s", lines_count . ' lines') . ' |'
  let foldchar = ' '
  let foldtextstart = strpart(line, 0, (winwidth(0)*2)/3)
  let foldtextend = lines_count_text . repeat(foldchar, 6)
  let foldtextlength = strlen(substitute(foldtextstart . foldtextend, '.', 'x', 'g')) + &foldcolumn
  return foldtextstart . repeat(foldchar, winwidth(0)-foldtextlength) . foldtextend
endfunction
set foldtext=NeatFoldText()

hi Folded ctermbg=255 ctermfg=21
hi FoldColumn ctermbg=white ctermfg=darkred

这里是示例代码:

function foo(x){
    var y = x*x;
    var z = y+y;
    return z;
};

function bar(x){
    var y = x*x;
    var z = y+y;
    return z;
};

function foobar(x){
    var y = x*x;
    var z = y+y;
    return z;
};

function barfoo(x){
    var y = x*x;
    var z = y+y;
    return z;
};

【问题讨论】:

    标签: vim folding


    【解决方案1】:
    set foldmethod=marker
    set foldmarker={,}
    

    应该给你你想要的。

    【讨论】:

      【解决方案2】:

      您正在使用折叠表达式(就我一眼看出)设计用于缩进折叠(用于 HAML、Python、Haskell 和其他缩进语法语言)。

      对于 C,您应该只使用 :set foldmethod=syntax

      【讨论】:

      • 很奇怪,:set foldmethod=syntax 似乎使折叠不再适用于此处提供的 JS 代码。
      • 啊,对了,我没注意。 JavaScript 没有好的语法定义。你可以使用JavaScript Syntax plugin来解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多