标题:Vim配置中遇到了正则表达式的问题
只看楼主
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
结帖率:66.67%
已结贴  问题点数:40 回复次数:8 
Vim配置中遇到了正则表达式的问题
请教一个问题,vim中配置脚本的时候那些正则表达式是怎么回事?
我基本上看不懂:
syn match    cFloat        display contained "\d\+f"
"floating point number, with dot, optional exponent
syn match    cFloat        display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
"floating point number, starting with a dot, optional exponent
syn match    cFloat        display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, without dot, with exponent
syn match    cFloat        display contained "\d\+e[-+]\=\d\+[fl]\=\>"
if !exists("c_no_c99")
  "hexadecimal floating point number, optional leading digits, with dot, with exponent
  syn match    cFloat        display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"
  "hexadecimal floating point number, with leading digits, optional dot, with exponent
  syn match    cFloat        display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"
endif
上面的代码摘自 vim的默认的c语言语法配置脚本,

"\d\+f"       是不是对应perl中的     <===>   m#\d+f#i;
"\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="   <===>   m#\d+\.\d*(e[-+]?\d+)?[fl]?#i;
"\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"    <===>   m#\.\d+(e[-+]?\d+)?[fl]?#i;

vim脚本中 为什么 '量词+' 前面要叫 '\', 而那个 量词'*'又不要。
那些个 '\=' 到底是什么意思,是不是相当于 perl中的 '量词?' ?
我想配置一个适合自己用的vim感觉太难了啊.


[ 本帖最后由 wfoo 于 2011-9-21 19:22 编辑 ]
搜索更多相关主题的帖子: starting display without number 表达式 
2011-09-21 19:18
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
被你整晕了

我就是真命天子,顺我者生,逆我者死!
2011-09-21 23:37
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
得分:0 
我想配置个VIM给自己用,
让 所有的类型名 宏名 函数名 显示不同的颜色。但是 vim默认的类型只能是 int float等这样的类型,不能用特殊的颜色显示自己定义的类型名 函数名。
如果要配置这样的脚本,应该怎么做?
2011-09-22 19:06
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:40 
vim 有自己的一些转义字符,肯定有些和 perl 不一样。
总的来说 vi 是继承自 ed 的。所以用的 regex 是传统的 basic regex。
+?这些符号要想表示数量修饰的话,要用 \ 转义一下。() {} 之类的也是一样。不用加 \ 的只有 * 这一个。如果你熟悉古老的 ed 的话,就会比较习惯这样。

比如第一个 "\d\+f"
\d 是指 [0-9],\+ 指重复至少一次以上,后面还要有个 f 的意思。就是匹配 123f 这样的东西。
后面的  "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=" 是匹配 123.456e-789f 这样的。凡是后缀了 \= 相当于 \?,表示 0 个或 1 个。但 \? 不能用于反向搜索,有语法渲染的时候反向搜索用的比较多,所以一般脚本里习惯用 \=,其它时候还是 \? 直观一些。

一般来说,想高亮类名和宏名比较困难的。虽然类名和宏名出现时的语法只有几类,但为了确定它的类型,要反向扫描整个文件寻找它的定义点,以确定类型。有时候甚至还要递归到头文件里去找。资源开销还是比较大的。
另外,至少 vim 的语法渲染几乎是一个实时的过程。凡是缓冲区内的文本有更改(比如说你打了几个字),或者屏幕的显示区域有变化(移屏或者刷屏),vim 都会重新分析并渲染一次语法高亮。这个过程伴随了大量的回溯搜索,虽然 vim 有一些加速分析语法的机制,因此并不用全文分析。但像我之前说的,如果某类对象的分析开销过大,其实就不太合适用于语法高亮。
虽然 vim 提供了非常多的语法分析机制,但其实它的灵活性和可定制性还是有限(不过我觉得挺够用了,我自己写过不少语法文件用于高亮我自己需要的特殊结构,都没有什么太多的技术问题)。
emacs 的可定制性是出了名的,因为它不是靠脚本而是靠编程。不过我对 emacs 的语法高亮这方面的知识了解的很有限。

还有就是我用过的其它编辑器,貌似也不高亮函数名或者宏名。楼主如果知道有什么编辑器可以高亮的话,可以提几个,我有空了也许去研究一下它们的工作原理。没准能在 vim 里模拟。
2011-09-22 22:54
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
得分:0 
首先,谢谢您了!
以前学c语言时用的dev c++,后来学其他脚本语言就不支持高亮了,所以才下了个vim.其他的都没用过了。但在配置脚本时遇到很多困难。对于函数名高亮我想过一种方法,对于.c .h文件首先指定一个脚本打开,这个脚本先扫描一遍文件,包括include后的文件,得到所有的函数名 宏名等,然后生成一个vim脚本,在用gvim利用这个脚本打开文件。不过也只能高亮原来就有的函数名。
2011-09-23 19:34
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
你用 vim 主要是写代码还是读代码?高亮这些名有什么用呀?

绝大多数(我已知的全部)编辑器都不高亮函数名。函数名和变量名一样,没什么高亮的价值。其实从另一个角度看,如果该高亮的都高亮了,没高亮的也就是剩下的了。
如果是读代码的话,vim 还有好多其他功能。比如 [d [D [i [I 之类的,不过用之前你可能的配置一下 &path。你可以 :h [i 看一看。vim 还可以配合 ctags 使用。

2011-09-23 23:57
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
得分:0 
用vim主要是读,但配置脚本是为了写。读代码的话,能跳到指定行 显示行号就好了,高不高亮没关系。高亮全局函数名 全局变量为了防止打错字,以及引起注意,毕竟一个程序会分成很多个.c .h文件。看了下ctag介绍,它也是预先扫描所有的源文件,然后把得到的函数名什么的全记录到一个文件里,以后要找那些东西就很方便了。确实功能很强大,比用Perl脚本扫描源文件然后生成vim脚本要简单得多,并且用脚本扫描其他语言代码时,还要重写脚本来分析不同语言的语法。
2011-09-24 13:00
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
如果是怕打错字的话,vim 有补全功能。常规情况 ctrl-p 就可以。它会自动去头文件里找,以你当前所打的几个字母开头的单词。这些都是实时搜索的,准确性比较高。
当然 vim 也有很多插件,帮助你写作各种东西或者完成各种功能。如果你感兴趣可以去官网找找,插件确实挺多的。不过一个是学插件的用法比较费时,另一个就是我觉得好多插件也不是太实用。所以我一般都不用。vim 自带功能和它自带的插件,我觉得其实是最有用的。
ctags 这种东西,一般是用来读代码的,就是代码基本不变的情况下用。这样提前扫描之后,就会比较方便跳转。
2011-09-24 14:06
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
得分:0 
谢谢了。
2011-09-24 17:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-350519-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021678 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved