【问题标题】:Vim, foldexpr, like folding in outshine.el effect on init.elvim, foldexpr, 像在 init.el 上折叠 outshine.el 效果
【发布时间】:2014-09-10 08:33:29
【问题描述】:

我想让foldexproutshine.el 一样处理我的.emacs 文件。换句话说,我想得到这个例子中的折叠级别:

        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 对降价折叠的讨论,尤其是 Omar Antolí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

【问题讨论】:

    标签: vim


    【解决方案1】:

    首先我必须在autocmd 行中删除一个无用的v:lnum,并使用lets 进行减法。一旦折叠起作用了,我重新评估并发现我想要的级别分配是不正确的。我觉得应该是

            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
    

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2012-06-13
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多