vim语法高亮和语法折叠怎么兼具?

Vim、Emacs配置和使用
回复
arkar
帖子: 32
注册时间: 2006-03-23 18:31
送出感谢: 0
接收感谢: 0

vim语法高亮和语法折叠怎么兼具?

#1

帖子 arkar » 2011-01-29 18:26

我用vim编辑matlab,想同时实现语法高亮和语法折叠。但似乎同一个关键字不能同时被标记为高亮关键字和region的start/end匹配字符。

例如,如果我单独定义:
syn region matlabFoldBlock start='\<classdef\>\|\<methods\>\|\<events\>\|\<properties\>\|\<if\>\|\<while\>\|\<for\>\|\<switch\>\|\<try\>\|\<function\>' end='\(([^()]*\)\@!\<end\>\([^()]*)\)\@!' contains=ALL fold transparent
没有语法高亮,但所有的折叠都是正确的。只要同时定义了:
syn keyword matlabStatement return function
syn keyword matlabConditional switch case else elseif end if otherwise break continue
syn keyword matlabRepeat do for while
syn keyword matlabStorageClass classdef methods properties events persistent global
syn keyword matlabExceptions try catch rethrow throw
这些关键字可以高亮,但折叠就都没有了。

有没有办法可以同时实现语法高亮和语法折叠?我知道表达式折叠、记号折叠、缩进折叠能work around,但就是想知道语法折叠怎么实现。
谢谢先。
arkar
帖子: 32
注册时间: 2006-03-23 18:31
送出感谢: 0
接收感谢: 0

Re: vim语法高亮和语法折叠怎么兼具?

#2

帖子 arkar » 2011-02-04 13:27

没人知道吗?
还是用表达式缩进实现了,贴出来,看看有没有同学需要。

~/.vim/ftplugin/matlab.vim


if exists("g:matlab_fold_enable") && g:matlab_fold_enable > 0
setlocal foldmethod=expr
setlocal foldexpr=MatlabFold(v:lnum)
setlocal foldenable
endif

function! MatlabFold(lnum)
let line=getline(a:lnum)
let pline=getline(a:lnum-1)
let nline=getline(a:lnum+1)

let fold_in=0
let fold_out=0

if line=~ '^\s*%'
" fold multiple-line comments
if line=~ '^\s*%{\@!' && pline!~ '^\s*%{\@!' && nline=~ '^\s*%{\@!'
let fold_in+=1
endif

if line=~ '^\s*%{\@!' && pline=~ '^\s*%{\@!' && nline!~ '^\s*%{\@!'
let fold_out+=1
endif

if line=~ '%{'
let fold_in+=1
endif

if line=~ '%}'
let fold_out+=1
endif
else
if line=~ '\(([^()]*\)\@!\<end\>\([^()]*)\)\@!\|%}'
let fold_out+=1
endif

if line=~ '\<classdef\>\|\<methods\>\|\<events\>\|\<properties\>\|\<if\>\|\<while\>\|\<for\>\|\<switch\>\|\<try\>\|\<function\>\|%{'
let fold_in+=1
endif
endif

if fold_in == fold_out
return '='
endif

if fold_in > fold_out
return 'a' . (fold_in - fold_out)
endif

if fold_out > fold_in
return 's' . (fold_out - fold_in)
endif

endfunction

然后在 .vimrc 文件里设置:
let g:matlab_fold_enable=1

就可以用了。注意如果编辑的文件很大,这个就会很耗CPU……
回复

回到 “Vim和Emacs”