我希望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-3
和m-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}})
答案 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