Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17424
  • 博文数量: 6
  • 博客积分: 280
  • 博客等级: 二等列兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-12 19:48
文章分类

全部博文(6)

文章存档

2011年(1)

2008年(5)

我的朋友
最近访客

分类: BSD

2008-04-16 18:00:22

开始在FreeBSD下使用Vim时还不太适应,觉得没有Linux下的Vim好看,语法也不高亮,缩进也不自动,后来查了查Vim的文档才知道了,这不是Vim的问题,而是我的问题。Vim为我的定制自己的编辑器提供了极强的扩展能力。使用Vim脚本,你可以让你的编辑器成为任意你想要的样子。这几天用Vim编程,学习了下Vim的脚本,把我在网上下的一段折叠用的代码修改了下,下面做下分析。

这段脚本是给c和c++定义的折叠方式。

" 这儿定义依表达式折叠用的函数

function MyFoldfun(lineNum)

    if getline(a:lineNum)=~'^ *{' && getline(a:lineNum) !~ '}'

        return 'a1'

    elseif getline(a:lineNum)=~'^ *}' && getline(a:lineNum)!~'{'

        return 's1'

    elseif getline(a:lineNum)=~'.\+{' && getline(a:lineNum) !~'}'  &&                   getline(a:lineNum)!~'".*{.*"' 

       return 'a1'

    elseif getline(a:lineNum)=~'.\+}' && getline(a:lineNum) !~ '{' &&

           getline(a:lineNum)!~'".*}.*"'

       return 's1'

    elseif getline(a:lineNum)=~'^//' && getline(a:lineNum+1)=~'^//' &&

           getline(a:lineNum-1)!~'^//'

        return 'a1'

    elseif getline(a:lineNum)=~'^//' && getline(a:lineNum-1)=~'^//'&&

           getline(a:lineNum+1)=~'^//'

        return '='

   elseif getline(a:lineNum)=~'^//'&&getline(a:lineNum-1)=~'^//'&&

          getline(a:lineNum+1)!~'^//'

       return 's1'

   else return '='

   endif

endfunction

“设置折叠方式

set foldmethod=expr
set foldexpr=MyFoldfun(v:lnum)


getline()函数是Vim内置函数,它可以取得缓冲区中的某一行,参数为行号。
=~ 表示模式匹配关系,如果左边的字符中含有右边定义的模式时,表达式为真,   否则为假。
!~ 与=~相反,它表示如果左边的字符中不含有右边定义的模式时,表达式为真,
   否则为假。
模式就是普通的正则表达式。
a1 表示折叠级别加一
s1 表示折叠级别减一
=  表示折叠级别与上一行相同
这里只用到了这三种级别操作。
例如:
if getline(a:lineNum)=~'^ *{' && getline(a:lineNum) !~ '}'

        return 'a1'

这行代码中,

getline(a:lineNum)=~'^ *{'表示在a:lineNum行中,是否有行首包含任意个空格,之后有"{"的模式出现。通俗的说,"{"是否为改行的第一个非空格字符。

getline(a:lineNum) !~ '}' 这行代码很简单了,就是该行中是否不含有字符"}"。&&是与逻辑。这句代码是为在一行中有块出现时不进行折叠。

最后两行设置折叠方式。将以上代码粘贴到主目录下.vimrc文件种可看到效果。

不过一般vim有自带的语法折叠脚本,在vim命令提示符下输入:
set foldmethod=syntax即可,不过我的vim没有,所有用上面的办法。

阅读(1473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~