⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usr_44.cnx

📁 Vim 中文文档
💻 CNX
📖 第 1 页 / 共 2 页
字号:
		\ contains=cCondNest	:syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/		\ contains=cCondNest	:syntax region cCondNest start=/(/ end=/)/ contained transparent你现在可以用不同方式高亮显示 "cWhile" 和 "cFor"。"cCondNest" 条目可以出现在它们中间并不受它所处条目的影响,而以自己定义的方式高亮显示。这是 "transparent"参数产生的效果。   注意 "matchgroup" 参数和条目本身是同一组。为什么要定义它呢?使用"matchgroup" 的副作用是包含的条目并不会在开始条目的中找到匹配。这样就避免了cCondNest 组匹配 "for" 或 "while" 后面的 '('。否则,它会扫描整个文章直到匹配的')',区域从其后继续。现在 cConNest 只在开始模式匹配后才开始匹配,就是在第一个'(' 之后。偏 移 量假设你要定义一个在 "if" 之后并在 '(' 和 ')' 之间的区域。但是你不想包括 "if" 或者 '(' 和 ')'。你可以为模式定义一个偏移量。比如: >	:syntax region xCond start=/if\s*(/ms=e+1 end=/)/me=s-1开始模式的偏移量是 "ms=e+1"。"ms" 代表匹配开始(Match Start)。它定义模式开始的偏移量。"e+1" 的意思是匹配在模式结束处(End)后又忽略一个字符后开始匹配。   结尾模式的偏移量是 "me=s-1"。"me" 表示匹配结尾(Match End)。"s-1"的意思是在模式开始(Start)的前面一个字母处。下面这个代码的结果是:	if (foo == bar) ~只有 "foo == bar" 部分以 "xCond" 方式高亮显示。关于偏移量的更多信息,参考: |:syn-pattern-offset|。ONELINE"oneline" 参数说明区域不超过一行的范围。比如: >	:syntax region xIfThen start=/if/ end=/then/ oneline这定义了一个开始于 "if" 并在 "then" 结束的区域。但如果在 "if" 后没有 "then",这个区域就不会被匹配。	Note:	当使用 "oneline" 时,如果结尾模式没有在同一行被匹配,那么整个区域就不会	匹配。如果不指定 "oneline",Vim _不会_ 检查结尾模式是否匹配;即使结尾模	式在文件后面的部分没有匹配,区域也将开始匹配。后 续 行 及 避 免现在事情变得有点复杂。让我们来定义一个预处理行。它以 "#" 开始到行尾结束。一个以 '\' 结束的行使得下一行成为它的后续行。这样你可以允许语法条目包括一个后续行模式: >	:syntax region xPreProc start=/^#/ end=/$/ contains=xLineContinue	:syntax match xLineContinue "\\$" contained在本例中,虽然 'xPreProc' 一般只匹配单个行,它包含的组(xLineContinue)允许它使用多行。比如,它会匹配下面的两行:	#define SPAM  spam spam spam \ ~			bacon and spam ~在本例中,这就是你所需要的。如果它并不是你想要的,你可以通过给包含的模式添加"excludenl" 参数来使区域在一个单行上。比如,你想高亮显示 "xPreProc" 中只在行结尾处的"end"。为了避免 "xPreProc" 像 "xLineContinue" 那样向下一行继续,使用"excludenl": >	:syntax region xPreProc start=/^#/ end=/$/		\ contains=xLineContinue,xPreProcEnd	:syntax match xPreProcEnd excludenl /end$/ contained	:syntax match xLineContinue "\\$" contained"excludenl" 必须写在模式之前。因为 "xLineContinue" 并没有 "excludenl",它的匹配会像前面那样将 "xPrePorc" 继续到下一行。==============================================================================*44.8*	群组你会注意到开始编写语法文件时你要产生很多的语法文件。Vim 能让你定义一个语法的集合--群组(cluster)。   假设你有一个语言,它含有 "for" 循环,"if" 语句,"while" 循环和函数。它们都含有相同的语法元素: 数字,标识符。你可以这样定义它们: >	:syntax match xFor /^for.*/ contains=xNumber,xIdent	:syntax match xIf /^if.*/ contains=xNumber,xIdent	:syntax match xWhile /^while.*/ contains=xNumber,xIdent你需要重复使用 "contains" 参数。如果你想添加另一个包含条目,你需要把它加三次。语法群组简化了这些定义,你可以使用一个群组来代表这些语法组。   要为这三个组包含的两个条目定义一个群组,用下面的命令: >	:syntax cluster xState contains=xNumber,xIdent群组可以像语法组那样用在其它的条目内。它们的名字以 '@' 开头。因此你可以这样定义这三个组: >	:syntax match xFor /^for.*/ contains=@xState	:syntax match xIf /^if.*/ contains=@xState	:syntax match xWhile /^while.*/ contains=@xState你可以用 "add" 参数添加新组: >	:syntax cluster xState add=xString你也可以用 "remove" 参数删除某个组:	:syntax cluster xState remove=xNumber==============================================================================*44.9*	包含其它语法文件C++ 语言的语法是 C 语言的超集。因为你不想编写两个独立的语法文件,你可以在 C++语法文件中首先读入 C 语言的语法文件: >	:runtime! syntax/c.vim":runtime!" 命令会在 'runtimepath' 里搜索所有的 "syntax/c.vim" 文件。这使得 C语法定义成为 C 文件里使用的方式。如果你替换了 c.vim 语法文件,或是在另一个文件中增加了条目,这些都会被载入。   载入 C 语法条目之后,特定的 C++ 条目就可被定义。比如,添加一些没在 C 中用到的关键字: >	:syntax keyword cppStatement	new delete this friend using这会像任何其它的语法文件一样起作用。现在考虑一下 Perl 语言。它包括两个不同的部分: POD 格式的文档和用 Perl 本身编写的程序。POD 部分以 "=head" 开头并以 "=cut" 结尾。   你想要在一个文件中定义 POD 语法,并在 Perl 语法文件中使用它。":syntax include" 命令读入一个语法文件并将定义的元素储存到一个语法群组中。对Perl 来说,格式如下所示: >	:syntax include @Pod <sfile>:p:h/pod.vim	:syntax region perlPOD start=/^=head/ end=/^=cut/ contains=@PodperlPOD 开始于 Perl 文件中的 "=head"。在这个区域中,@Pod 群组被包括。所有在pod.vim 语法文件定义的条目均在这里匹配。当找到 "=cut",区域结束,我们回到在Perl 文件中定义的条目。   ":syntax include" 命令很聪明,它会忽略包含文件中的 ":syntax clear"。并且类似于 "contains=All"的参数只会包括存在于被包含文件的条目,而不会包括包含文件内的条目。   "<sfine>:p:h/" 部分使用当前文件的名字 (<sfile>),把它展开成全路径(:p),然后取头部分(:h)。结果就是文件的目录名。这将使相同目录下的 pod.vim 文件被包括。==============================================================================*44.10*	同步编译器处理起这些来很简单。它们在文件头开始解析以至文件尾。Vim 并没有这么简单。它必须从编辑进行的中间开始。那么怎么确定它的位置?   秘密在于 ":syntax sync" 命令。它告诉 Vim 怎样找出当前位置。比如,下面的命令告诉 Vim 向后扫描 C 样式注释的开头和结尾,并对注释高亮显示: >	:syntax sync ccomment你可以使用其它的参数。"minlines" 参数告诉 Vim 向后扫描的最小行数;"maxline" 则指定最大行数。   比如,下面的命令告诉 Vim 向后扫描至少 10 行直到屏幕的顶端: >	:syntax sync ccomment minlines=10 maxlines=500如果它不能确定在这个空间范围内的位置,它会向前向后查看直至它知道要怎样做。但它最多就查看 500 行。(大的 "maxline" 值会降低速度;而小的值会使同步失败。)   为使同步更快,告诉 Vim 哪些语法条目可以被忽略。对那些只有当确实要显示时才用到的匹配和区域,可以指定 "display" 参数。   省缺情况下,注释会以注释语法组指定的方式显示颜色。如果你想用其它的颜色显示,你可以指定一个不同的语法组: >	:syntax sync ccomment xAltComment如果你的语言没有 C 样式的注释,你可以用其它的同步方式。最简单的方法是告诉 Vim跳过若干行并从那里开始定位。下面的命令指定 Vim 向后跳过 150 行,并从那里开始分析: >	:syntax sync minlines=150一个大的 "minlines" 会使 Vim 变得很慢,尤其是向后卷屏的时候。   最后,你可以用这个命令来指定要查找的语法组: >>	:syntax sync match {sync-group-name}		\ grouphere {group-name} {pattern}这会告诉 Vim 当它看到 {pattern}, 名为 {group-name} 的语法组会在其后开始。比如,shell 脚本的 if 语句以 "if" 开头,以 "fi" 结尾。	if [ --f file.txt ] ; then ~		echo "File exists" ~	fi ~你可以用下面的命令为这个语法定义一个 "grouphere" 指示: >	:syntax sync match shIfSync grouphere shIf "\<if\>""grouphere" 参数告诉 Vim 模式结束一个组。比如,if/fi 组的结束如下所示: >	:syntax sync match shIfSync groupthere NONE "\<fi\>"在这个例子中,NONE 告诉 Vim 你不在任何一个特殊的区域内。特别地,你不在一个 if代码块内。你还可以定义有或者没有 "grouphere" 参数的匹配和区域。这些组在同步时会被忽略。比如,下面的命令忽略 {} 内的所有部分: >	:syntax sync match xSpecial /{.*}/有关同步的更多信息,请见参考手册: |:syn-sync|。==============================================================================*44.11*	安装语法文件当你新的语法文件要投入使用时,把它放到在 'runtiimepath' 下的一个 "syntax"目录。对 Unix 来讲,它可以是 "~/.vim/syntax"。  语法文件的名字必须要和文件类型相同并以 ".vim" 做后缀。这样,对 x 语言来讲,这个文件的完整路径是:	~/.vim/syntax/x.vim ~你要确保文件类型可被识别。参考 |43.2|。如果你的语言文件工作的很好,你也许想要其他的 Vim 用户来使用。首先阅读下一节以确保你的文件能很好的适用于别人。然后将它 email 给 Vim 维护者:<maintainer@vim.org>。并要解释文件类型是怎样识别的。如果幸运的话,你的文件会包括在 Vim 的下一版本中!向 已 有 文 件 添 加 条 目我们前边是假定你要写一个全新的语法文件。如果一个已有的语法文件可以工作但是缺少某些条目,你可以将这些条目添加到另一个独立的文件。这样会避免改变发布的语言文件。   在你的文件中写入语法命令(也许要用到已有语法的组名)。比如,给 C 语法文件添加新的变量类型:>	:syntax keyword cType off_t uint将文件命名为和原来的语法文件一样的名字。在本例中,是 "c.vim"。把它放到'runtimepath' 里的靠后的目录里。对 Unix 而言,该目录可以是:	~/.vim/after/syntax/c.vim ~==============================================================================*44.12*	可移植语法文件格式如果所有的 Vim 用户都能交换语法文件岂不更好?为此,语法文件必须符合一些规则。首先要有一个说明语法文件目的,维护人,以及更新时间的文件头。但不要包含太多的历史更改信息。比如: >	" Vim syntax file	" Language:	C	" Maintainer:	Bram Moolenaar <Bram@vim.org>	" Last Change:	2001 Jun 18	" Remark:	Included by the C++ syntax.用和其它语法文件相同的格式。使用一个已有的语法文件作为样例会节约很多时间。为你的语法文件选择一个好的,描述性强的名字。使用小写字符和数字。不要使用太长的名字,因为它将在很多地方用到: 语法文件名 "name.vim", 'filetype', 以及组名的开头(例如: nameType, nameStatement, nameStrings)。以一个 "b:current_syntax" 检查开头。如果它被定义,表明其它语法文件 (在'runtimepath' 前部的) 已被载入。为和 Vim 5.8 兼容: >	if version < 600	  syntax clear	elseif exists("b:current_syntax")	  finish	endif在最后将 "b:current_syntax" 设定为语法的名字。不要忘了被包含的文件也这样做,当你包含两个文件时,也许要复位 "b:current_syntax"。如果你想让你的语法文件适用于 Vim 5.x,添加一个对 v:version 检查。参考yacc.vim。不要包括任何的用户首选项。不要设定 'tabstop','expandtab' 等。这些属于文件类型脚本。不要包括映射或者缩写。如果确实需要识别关键字,只设定 'iskeyword'。避免使用特定的颜色。尽可能地链接到标准的高亮组。不要忘了一些人使用不同的背景,或者只能使用八种颜色。为和 Vim 5.8 兼容: >	if version >= 508 || !exists("did_c_syn_inits")	  if version < 508	    let did_c_syn_inits = 1	    command -nargs=+ HiLink hi link <args>	  else	    command -nargs=+ HiLink hi def link <args>	  endif	  HiLink nameString	String	  HiLink nameNumber	Number	  ... etc ...	  delcommand HiLink	endif对那些在同步时用不到的条目添加 "display" 参数,以提高向后滚屏和 CTRL-L 的速度。==============================================================================下一章: |usr_45.txt| 选择你的语言版权: 参见 |manual-copyright|  vim:tw=78:ts=8:ft=help:norl:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -