当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : vim语法高亮和语法折叠怎么兼具?
帖子发表于 : 2011-01-29 18:26 

注册: 2006-03-23 18:31
帖子: 32
送出感谢: 0 次
接收感谢: 0 次
我用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,但就是想知道语法折叠怎么实现。
谢谢先。


页首
 用户资料  
 
2 楼 
 文章标题 : Re: vim语法高亮和语法折叠怎么兼具?
帖子发表于 : 2011-02-04 13:27 

注册: 2006-03-23 18:31
帖子: 32
送出感谢: 0 次
接收感谢: 0 次
没人知道吗?
还是用表达式缩进实现了,贴出来,看看有没有同学需要。

~/.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……


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译