Nvim :help
页面,生成 于 源代码 使用 tree-sitter-vimdoc 解析器。
:syntax clear在最终的语法文件中,这并不是必需的,但在进行实验时非常有用。
:syntax您可以使用此命令检查哪些项已实际定义。当您使用新的语法文件进行实验时,这非常有用。它还显示了每个项使用的颜色,这有助于找出哪些是什么。要列出特定语法组中的项,请使用
:syntax list {group-name}这也可以用来列出集群(在 44.8 中解释)。只需在名称中包含 @ 即可。
:syntax case match :syntax case ignore"match" 参数意味着 Vim 将匹配语法元素的大小写。因此,"int" 不同于 "Int" 和 "INT"。如果使用 "ignore" 参数,则以下等效:"Procedure"、"PROCEDURE" 和 "procedure"。":syntax case" 命令可以出现在语法文件中的任何位置,并影响其后的语法定义。在大多数情况下,您的语法文件中只有一个 ":syntax case" 命令;但是,如果您使用包含区分大小写和不区分大小写元素的非正常语言,则可以在整个文件中分散 ":syntax case" 命令。
:syntax keyword {group} {keyword} ...
{group}
是语法组的名称。使用 ":highlight" 命令,您可以为 {group}
分配颜色。{keyword}
参数是实际的关键字。以下是一些示例:syntax keyword xType int long char :syntax keyword xStatement if then else endif此示例使用组名 "xType" 和 "xStatement"。按照惯例,每个组名都以要定义的语言的文件类型为前缀。此示例定义了 x 语言(eXample language,没有有趣的名称)的语法。在用于 "csh" 脚本的语法文件中,将使用名称 "cshType"。因此,前缀等于 'filetype' 的值。这些命令导致单词 "int"、"long" 和 "char" 以一种方式高亮显示,而单词 "if"、"then"、"else" 和 "endif" 则以另一种方式高亮显示。现在您需要将 x 组名连接到标准 Vim 名称。您可以使用以下命令来完成此操作
:highlight link xType Type :highlight link xStatement Statement这告诉 Vim 将 "xType" 高亮显示为 "Type",并将 "xStatement" 高亮显示为 "Statement"。有关标准名称,请参阅 group-name。
:setlocal iskeyword+=- :syntax keyword xStatement when-not":setlocal" 命令用于仅更改当前缓冲区的 'iskeyword'。但它确实改变了像 "w" 和 "*" 这样的命令的行为。如果不需要这样做,请不要定义关键字,而是使用匹配项(将在下一节中解释)。
:syntax keyword xStatement n[ext]这不会匹配 "nextone",关键字总是只匹配整个单词。
:syntax match xIdentifier /\<\l\+\>/
:syntax match xComment /#.*/由于您可以使用任何搜索模式,因此您可以使用匹配项突出显示非常复杂的事物。有关搜索模式的帮助,请参阅 pattern。
:syntax region xString start=/"/ end=/"/"start" 和 "end" 指令定义用于查找区域开始和结束的模式。但是,字符串看起来像这样怎么办?
:syntax region xString start=/"/ skip=/\\"/ end=/"/双反斜杠匹配单个反斜杠,因为反斜杠在搜索模式中是一个特殊字符。
:syntax keyword xTodo TODO contained :syntax match xComment /%.*/ contains=xTodo在第一行中,"contained" 参数告诉 Vim 该关键字只能存在于另一个语法项中。下一行有 "contains=xTodo"。这表明 xTodo 语法元素在其中。结果是,整个注释行将与 "xComment" 匹配并变为蓝色。其中的单词 TODO 由 xTodo 匹配并以黄色高亮显示(xTodo 的高亮显示已为此设置)。
:syntax region xBlock start=/{/ end=/}/ contains=xBlock假设您有以下文本
:syntax region xComment start=/%/ end=/$/ contained :syntax region xPreProc start=/#/ end=/$/ contains=xComment您将注释定义为从 % 到行尾的任何内容。预处理器指令是从 # 到行尾的任何内容。因为您可以在预处理器行上添加注释,所以预处理器定义包含一个 "contains=xComment" 参数。现在看看使用以下文本会发生什么
:syntax region xComment start=/%/ end=/$/ contained :syntax region xPreProc start=/#/ end=/$/ contains=xComment keepend
:syntax region xList start=/\[/ end=/\]/ contains=ALL所有语法项都将包含在此项中。它也包含它自己,但不在同一位置(这会导致无限循环)。您可以指定某些组不包含。因此包含所有组,但列出的那些除外
:syntax region xList start=/\[/ end=/\]/ contains=ALLBUT,xString使用 "TOP" 项,您可以包含所有没有 "contained" 参数的项。"CONTAINED" 用于仅包含具有 "contained" 参数的项。有关详细信息,请参阅 :syn-contains。
:syntax match xIf /if/ nextgroup=xIfCondition skipwhite :syntax match xIfCondition /([^)]*)/ contained nextgroup=xThen skipwhite :syntax match xThen /then/ contained"nextgroup" 参数指定哪个项目可以接下来出现。这不是必需的。如果未找到指定的任何项目,则不会发生任何事情。例如,在此文本中
:syntax region xInside start=/(/ end=/)/假设你想用不同的方式突出显示括号。你可以使用很多复杂的区域语句来做到这一点,或者可以使用 "matchgroup" 参数。这告诉 Vim 使用不同的突出显示组 (在本例中为 xParen 组) 来突出显示区域的开始和结束
:syntax region xInside matchgroup=xParen start=/(/ end=/)/"matchgroup" 参数适用于出现在它之后的开始或结束匹配。在前面的示例中,开始和结束都使用 xParen 突出显示。要使用 xParenEnd 突出显示结束
:syntax region xInside matchgroup=xParen start=/(/ \ matchgroup=xParenEnd end=/)/使用 "matchgroup" 的一个副作用是,包含的项目不会在区域的开始或结束处匹配。 "transparent" 的示例使用了这一点。
:syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/ \ 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 组与 "while" 或 "for" 之后的 ( 匹配。如果发生这种情况,它将跨越整个文本直到匹配的 ),并且区域将在其之后继续。现在,cCondNest 仅在与开始模式匹配后匹配,因此在第一个 ( 之后匹配。
:syntax region xCond start=/if\s*(/ms=e+1 end=/)/me=s-1开始模式的偏移量为 "ms=e+1"。 "ms" 代表匹配开始。这为匹配的开始定义了一个偏移量。通常情况下,匹配从模式匹配的地方开始。 "e+1" 表示匹配现在从模式匹配的结束处开始,然后向前一个字符。结束模式的偏移量为 "me=s-1"。 "me" 代表匹配结束。 "s-1" 表示模式匹配的开始,然后向后一个字符。结果是,在这段文本中
:syntax region xIfThen start=/if/ end=/then/ oneline这定义了一个从 "if" 开始,到 "then" 结束的区域。但是,如果 "if" 之后没有 "then",则区域不匹配。
:syntax region xPreProc start=/^#/ end=/$/ contains=xLineContinue :syntax match xLineContinue "\\$" contained在本例中,虽然 xPreProc 通常匹配单行,但它包含的组 (即 xLineContinue) 允许它延续多行。例如,它将匹配这两行
:syntax region xPreProc start=/^#/ end=/$/ \ contains=xLineContinue,xPreProcEnd :syntax match xPreProcEnd excludenl /end$/ contained :syntax match xLineContinue "\\$" contained"excludenl" 必须放在模式之前。由于 "xLineContinue" 没有 "excludenl",因此与它匹配将像以前一样将 xPreProc 扩展到下一行。
: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你也可以从此列表中删除语法组
:syntax cluster xState remove=xNumber
:runtime! syntax/c.vim":runtime!" 命令在 'runtimepath' 中搜索所有 "syntax/c.vim" 文件。这使得 C++ 语法的 C 部分像 C 文件一样被定义。如果你已经替换了 c.vim 语法文件,或者使用额外的文件添加了项目,这些项目也将被加载。加载 C 语法项后,可以定义特定的 C++ 项目。例如,添加 C 中未使用过的关键字
:syntax keyword cppStatement new delete this friend using这与任何其他语法文件的工作方式相同。
:syntax include @Pod <sfile>:p:h/pod.vim :syntax region perlPOD start=/^=head/ end=/^=cut/ contains=@Pod在 Perl 文件中找到 "=head" 时,perlPOD 区域开始。在此区域中,包含 @Pod 集群。在 pod.vim 语法文件中定义的所有顶级项目将在此处匹配。当找到 "=cut" 时,区域结束,我们回到 Perl 文件中定义的项目。":syntax include" 命令足够聪明,可以忽略包含文件中的 ":syntax clear" 命令。而 "contains=ALL" 这样的参数只会包含在包含文件中定义的项目,而不会包含在包含它的文件中。"<sfile>:p:h/" 部分使用当前文件的名称 (
<sfile>
),将其扩展为完整路径 (:p),然后取头部 (:h)。这会导致包含同一目录中的 pod.vim 文件。:syntax sync ccomment你可以使用一些参数来调整这个过程。 "minlines" 参数告诉 Vim 向后查看的最小行数,"maxlines" 参数告诉编辑器扫描的最大行数。例如,以下命令告诉 Vim 在屏幕顶部之前至少查看 10 行
:syntax sync ccomment minlines=10 maxlines=500如果它在该空间中无法确定自己的位置,它就会开始向后查看,直到它弄清楚该怎么做。但它最多向后查看 500 行。(较大的 "maxlines" 会降低处理速度。较小的 "maxlines" 可能会导致同步失败。)为了使同步速度更快,请告诉 Vim 哪些语法项可以跳过。每个仅在实际显示文本时才需要使用的匹配和区域都可以使用 "display" 参数。默认情况下,要查找的注释将被着色为 Comment 语法组的一部分。如果你想用其他方式着色,你可以指定不同的语法组
: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}
的语法组就在给定模式之后开始。 {sync-group-name}
用于为这个同步规范命名。例如,sh 脚本语言以 "if" 开头,以 "fi" 结尾:syntax sync match shIfSync grouphere shIf "\<if\>""groupthere" 参数告诉 Vim 模式结束了一个组。例如,if/fi 组的结束如下所示
:syntax sync match shIfSync groupthere NONE "\<fi\>"在这个例子中,NONE 告诉 Vim 你不在任何特殊的语法区域。特别是,你不在 if 块中。
:syntax sync match xSpecial /{.*}/有关同步的更多信息,请参见参考手册::syn-sync.
:syntax keyword cType off_t uint使用与原始语法文件相同的名称编写文件。在本例中为 "c.vim"。将它放在 'runtimepath' 末尾附近的一个目录中。这样可以确保它在原始语法文件之后加载。对于 Unix 系统,这将是
" Vim syntax file " Language: C " Maintainer: Bram Moolenaar <[email protected]> " Last Change: 2001 Jun 18 " Remark: Included by the C++ syntax.使用与其他语法文件相同的布局。使用现有的语法文件作为示例可以节省大量时间。
if exists("b:current_syntax") finish endif在最后将 "b:current_syntax" 设置为语法的名称。不要忘记包含的文件也会执行此操作,如果您包含了两个文件,则可能需要重置 "b:current_syntax"。
hi def link nameString String hi def link nameNumber Number hi def link nameCommand Statement ... etc ...将 "display" 参数添加到在同步时不使用的项,以加快向后滚动和
CTRL-L
的速度。