Vim,foldexpr,就像在init.el上的outshine.el效果折叠一样

时间:2014-07-19 07:38:42

标签: vim

我希望foldexpr能够像.emacs一样处理我的outshine.el文件。换句话说,我想获得折叠级别,如下例所示:

        0
;;;     0
        1
        1
;;;;    1
        2
        2
;;;;;   2
        3
;;;;    1
        2
;;;     0
        1
        1

(在Advanced Folding _ Learn Vimscript the Hard Way找到的符号。)

总之,我认为foldexpr必须检查当前行和前一行。

如果当前行至少有3 ;,则折叠级别将减少3。否则,如果前一行至少为3,则当前折叠级别为2,否则折叠级别应等于前一行。

这是我试图用

实现的效果
function ELispLevel() 
    let n = len(matchstr(getline(v:lnum), '^;\+'))
    let m = len(matchstr(getline(v:lnum-1), '^;\+'))
    if n >= 2
        return ">" . n-3
    else 
        if m >= 2
            return ">" . m-2
        else 
            return "=" 
    endif 
endfunction

(大多数代码都会在Vim Markdown Folding? - Stack Overflow讨论降价折扣,尤其是OmarAntolín-Camarena的评论。)

我猜这不起作用。我的一些不那么微不足道的修改包括n-3m-2,所以也许我只是搞砸了那里的语法。但我担心我的错误可能在任何地方,并希望有人能找到它。

我还有以下内容尝试为我的init.el文件

激活它
aug filetype_lisp
    au!
    " au FileType lisp setl fdm=marker fmr=;;;,;;+
    au FileType lisp setlocal foldmethod=expr foldexpr=ELispLevel()
aug END

(顺便说一句,我从vim - Explaining foldexpr syntax - Stack Overflow了解到的第三个链接是<{3}})

1 个答案:

答案 0 :(得分:0)

首先,我必须删除v:lnum行中无用的autocmd,并使用let s进行减法。折叠完成后,我已经重新评估,发现我想要的等级分配是不正确的。我认为应该是

        0
;;;     1
        1
        1
;;;;    2
        2
        2
;;;;;   3
        3
;;;;    2
        2
;;;     1
        1
        1

我没想到Vim实际上是怎么做到的。这似乎更容易实现。

有效!

function! ELispLevel() 
    let n = len(matchstr(getline(v:lnum), '^;\+'))
    let m = n - 2
    if n >= 3
        return ">" . m
    else 
        return "=" 
    endif 
endfunction