vim 书写自己的折叠表达式
学习总是充满了各种各样的坑, 纵然是小坑,也能使不留意的人摔个跟头.
书写了一个vim 折叠代码, 实现遇见'{'开始折叠,遇到'}' 折叠结束.
非常简单的代码,只需要写一个折叠计算函数, 灵foldexpr 调用该函数即可. 即set foldexpr=你的函数.
代码不过区区几行,但一些概念很关键! 这里把一些关键点及结果写下来, 希望你有所启发.
1. vim 函数的第一个字母不能是小写,必须是大写字母,以区别于系统函数
2. vim 函数的引入方式或加载方式,
不能用 '<,'>source 的命令来执行, 也不能用:source " 来执行,错误提示是source 不支持范围
source 命令的参数是文件名,是用来加载文件的.
3. 可以用function 命令来查看加载的函数列表.
4. function 的参数必须要加a: 来引用.
5. 语句不能像类c语言等加分号结尾, 那样会出错.
6. 声明变量最好加限定符号,例如l:, g:, b:,s:等.
所以正确的方式是: 写一个函数,保存为文件,例如1.vim, 然后用source 1.vim 来加载你写的函数,用function 可查看函数的存在.
举例:
"fold-expr 表达式
function! Myexpr(thisline)
let l:p1=match(a:thisline,'{')
let l:p2=match(a:thisline,'}')
if l:p1>=0 && l:p2>=0
return '='
elseif l:p1>=0
return 'a1'
elseif l:p2>=0
return 's1'
else
return '='
endif
endfunction
举这个例子是你可以用它来写folder 折叠的级别, a1,s1都有特殊的含义, 参考h fold-expr
测试:
echo Myexpr("test")
使用:
在.vimrc 添加如下代码
"fold-expr 表达式
function! Myexpr(thisline)
let l:p1=match(a:thisline,'{')
let l:p2=match(a:thisline,'}')
if l:p1>=0 && l:p2>=0
return '='
elseif l:p1>=0
return 'a1'
elseif l:p2>=0
return 's1'
else
return '='
endif
endfunction
set foldexpr=Myexpr(getline(v:lnum))
当打开一个文件时, 为了折叠,可以输入如下命令: set fdm=expr