语法

Nvim :help 页面,生成 使用 tree-sitter-vimdoc 解析器。


语法高亮使 Vim 能够以不同的字体或颜色显示文本的部分。这些部分可以是特定的关键字或与模式匹配的文本。Vim 不会解析整个文件(为了保持速度),因此高亮有一些限制。词法高亮可能是一个更好的名称,但由于每个人都称之为语法高亮,所以我们坚持使用它。
Vim 支持所有终端的语法高亮。但由于大多数普通终端的高亮可能性非常有限,因此它在 GUI 版本 gvim 中效果最好。
在用户手册中:usr_06.txt 介绍了语法高亮。 usr_44.txt 介绍了编写语法文件。

1. 快速入门 :syn-qstart

:syn-enable :syntax-enable :syn-on :syntax-on 语法高亮默认启用。如果您需要在禁用后重新启用它(见下文),请使用
:syntax enable
或者
:syntax on
此命令实际上执行的命令是
:source $VIMRUNTIME/syntax/syntax.vim
如果未设置 VIM 环境变量,Vim 将尝试以其他方式查找路径(参见 $VIMRUNTIME)。通常这工作得很好。如果不行,请尝试将 VIM 环境变量设置为 Vim 文件所在目录。例如,如果您的语法文件位于“/usr/vim/vim82/syntax”目录中,请将 $VIMRUNTIME 设置为“/usr/vim/vim82”。您必须在 shell 中执行此操作,在启动 Vim 之前。此命令还会在 GUI 运行或即将启动时加载 menu.vim 脚本。
:hi-normal :highlight-normal 如果您在 GUI 中运行,可以使用以下命令获得黑色背景上的白色文本
:highlight Normal guibg=Black guifg=White
对于彩色终端,请参阅 :hi-normal-cterm.
注意: MS-Windows 上的语法文件包含以 <CR><NL> 结尾的行。Unix 文件以 <NL> 结尾。这意味着您应该为您的系统使用正确类型的文件。虽然在 MS-Windows 上,如果 'fileformats' 选项不为空,则会自动选择正确的格式。
注意: 当使用反转视频(“gvim -fg white -bg black”)时,'background' 的默认值将在 GUI 窗口打开后才会设置,这在读取 gvimrc 之后。这将导致使用错误的默认高亮。要设置 'background' 的默认值,然后再打开高亮,请在 gvimrc 中包含“:gui”命令。
:gui                " open window and set default for 'background'
:syntax on        " start highlighting, use 'background' to set colors
注意:gvimrc 中使用“:gui”意味着“gvim -f”不会在前台启动!然后使用“:gui -f”。
g:syntax_on
您可以使用此命令切换语法开/关
:if exists("g:syntax_on") | syntax off | else | syntax enable | endif
要将此放到映射中,您可以使用
:map <F7> :if exists("g:syntax_on") <Bar>
     \   syntax off <Bar>
     \ else <Bar>
     \   syntax enable <Bar>
     \ endif <CR>
[使用 <> 符号,按字面意思输入]
详细信息:“:syntax”命令通过加载文件来实现。要确切地了解它是如何工作的,请查看文件
命令文件
:syntax enable $VIMRUNTIME/syntax/syntax.vim :syntax on $VIMRUNTIME/syntax/syntax.vim :syntax manual $VIMRUNTIME/syntax/manual.vim :syntax off $VIMRUNTIME/syntax/nosyntax.vim 另见 syntax-loading.
注意: 如果显示长行很慢,并且关闭语法高亮会使它变快,请考虑将 'synmaxcol' 选项设置为较低的值。

2. 语法文件 :syn-files

一种语言的语法和高亮命令通常存储在语法文件中。命名约定为:“{name}.vim”。其中 {name} 是语言的名称,或缩写(为了将名称限制在 8.3 个字符,这是在 DOS 文件系统中使用文件时的一项要求)。例如:c.vim perl.vim java.vim html.vim cpp.vim sh.vim csh.vim
语法文件可以包含任何 Ex 命令,就像 vimrc 文件一样。但想法是只包含特定语言的命令。当一种语言是另一种语言的超集时,它可能包含另一个语言,例如,cpp.vim 文件可以包含 c.vim 文件
:so $VIMRUNTIME/syntax/c.vim
.vim 文件通常通过自动命令加载。例如
:au Syntax c            runtime! syntax/c.vim
:au Syntax cpp   runtime! syntax/cpp.vim
这些命令通常在文件 $VIMRUNTIME/syntax/synload.vim 中。

创建您自己的语法文件 mysyntaxfile

当您创建自己的语法文件,并且您希望 Vim 使用“:syntax enable”自动使用这些文件时,请执行以下操作
1. 创建您的用户运行时目录。您通常会使用 'runtimepath' 选项的第一个项。Unix 示例
mkdir ~/.config/nvim
2. 在其中创建一个名为“syntax”的目录。对于 Unix
mkdir ~/.config/nvim/syntax
3. 编写 Vim 语法文件。或者从互联网上下载一个。然后将其写入您的 syntax 目录。例如,对于“mine”语法
:w ~/.config/nvim/syntax/mine.vim
现在您可以手动开始使用您的语法文件了
:set syntax=mine
您无需退出 Vim 即可使用此功能。
如果您还想让 Vim 检测文件类型,请参见 new-filetype.
如果您正在设置一个具有多个用户的系统,并且您不希望每个用户都添加相同的语法文件,则可以使用 'runtimepath' 中的另一个目录。

添加到现有语法文件 mysyntaxfile-add

如果您对现有的语法文件比较满意,但想要添加一些项目或更改高亮,请按照以下步骤操作
1. 从 'runtimepath' 创建您的用户目录,见上文。
2. 在其中创建一个名为“after/syntax”的目录。对于 Unix
mkdir -p ~/.config/nvim/after/syntax
3. 编写一个 Vim 脚本,其中包含您要使用的命令。例如,要更改 C 语法的颜色
highlight cComment ctermfg=Green guifg=Green
4. 将该文件写入“after/syntax”目录。使用语法的名称,并添加“.vim”。对于我们的 C 语法
:w ~/.config/nvim/after/syntax/c.vim
就是这样。下次您编辑 C 文件时,注释颜色将有所不同。您甚至不需要重新启动 Vim。
如果您有多个文件,您可以使用文件类型作为目录名称。此目录中的所有“*.vim”文件都将被使用,例如:~/.config/nvim/after/syntax/c/one.vim ~/.config/nvim/after/syntax/c/two.vim

替换现有语法文件 mysyntaxfile-replace

如果您不喜欢分发的语法文件,或者您下载了新版本,请按照 mysyntaxfile 中的相同步骤操作。只需确保您将语法文件写入 'runtimepath' 中较早的目录中。Vim 只会加载找到的第一个语法文件,假设它设置了 b:current_syntax。
语法组名称用于匹配相同类型的语法项目。然后将这些项目链接到指定颜色的高亮组。语法组名称本身不指定任何颜色或属性。
高亮或语法组的名称必须由 ASCII 字母、数字、下划线、点、连字符或 @ 组成。作为正则表达式:[a-zA-Z0-9_.@-]*。组名的最大长度约为 200 字节。 E1249
为了让每个用户都可以选择自己喜欢的颜色集,必须为许多语言共有的高亮组使用首选名称。以下是建议的组名(如果语法高亮工作正常,您就可以看到实际的颜色,除了“Ignore”)
Comment 任何注释
Constant 任何常量 String 字符串常量:“this is a string” Character 字符常量:'c', '\n' Number 数值常量:234, 0xff Boolean 布尔常量:TRUE, false Float 浮点数常量:2.3e10
Identifier 任何变量名 Function 函数名(也包括:类的 method)
Statement 任何语句 Conditional if, then, else, endif, switch 等 Repeat for, do, while 等 Label case, default 等 Operator "sizeof", "+", "*", 等 Keyword 任何其他关键字 Exception try, catch, throw
PreProc 通用预处理器 Include 预处理器 #include Define 预处理器 #define Macro 与 Define 相同 PreCondit 预处理器 #if, #else, #endif 等
Type int, long, char 等 StorageClass static, register, volatile 等 Structure struct, union, enum 等 Typedef 一个 typedef
Special 任何特殊符号 SpecialChar 常量中的特殊字符 Tag 您可以在此使用 CTRL-] Delimiter 需要注意的字符 SpecialComment 注释中的特殊内容 Debug 调试语句
突出显示的带下划线的文本,HTML 链接
Ignore 留空,隐藏 hl-Ignore
Error 任何错误的结构
Todo 任何需要额外注意的事项;主要是 TODO FIXME 和 XXX 关键字
Added diff 中添加的行 Changed diff 中更改的行 Removed diff 中删除的行
用 * 标记的名称是首选组;其他是次要组。对于首选组,“syntax.vim”文件包含默认高亮。次要组链接到首选组,因此它们具有相同的高亮。您可以通过在加载“syntax.vim”文件后使用“:highlight”命令来覆盖这些默认值。
请注意,高亮组名称不区分大小写。“String”和“string”可用于同一个组。
以下名称是保留的,不能用作组名:NONE ALL ALLBUT contains contained
hl-Ignore
当使用 Ignore 组时,您也可以考虑使用 conceal 机制。请参见 conceal.

3. 语法加载过程 syntax-loading

这解释了在发出“:syntax enable”命令时发生的事情的详细信息。当 Vim 初始化自身时,它会找出运行时文件的位置。这在此处用作变量 $VIMRUNTIME.
“:syntax enable”和“:syntax on”执行以下操作
来源 $VIMRUNTIME/syntax/syntax.vim | +- 清除所有旧语法,方法是来源 $VIMRUNTIME/syntax/nosyntax.vim | +- 在 'runtimepath' 中来源第一个 syntax/synload.vim | | | +- 设置语法 autocmds 以在 'syntax' 选项设置时加载适当的语法文件。 synload-1 | | | +- 从 mysyntaxfile 变量来源用户的可选文件。 | 这是为了与 Vim 5.x 的向后兼容性。 synload-2 | +- 执行 ":filetype on",它执行 ":runtime! filetype.vim"。它会加载找到的任何 filetype.vim 文件。它应该始终来源 | $VIMRUNTIME/filetype.vim,它执行以下操作。 | | | +- 基于后缀安装 autocmds 以设置 'filetype' 选项 | | 这是已知文件类型之间文件名和文件类型连接的地方。 synload-3 | | | +- 从 myfiletypefile | | 变量来源用户的可选文件。这是为了与 Vim 5.x 的向后兼容性。 | | synload-4 | | | +- 安装一个 autocommand,当没有检测到文件类型时,它会来源 scripts.vim。 synload-5 | | | +- 来源 $VIMRUNTIME/menu.vim,以设置语法菜单。 menu.vim | +- 安装 FileType autocommand 以在检测到文件类型时设置 'syntax' 选项。 synload-6 | +- 执行语法 autocommands 以开始对每个已加载缓冲区进行语法高亮显示。
加载文件时,Vim 会按以下步骤查找相关的语法文件
加载文件会触发 BufReadPost autocommands。 | +- 如果与 synload-3 (已知文件类型) 或 synload-4 (用户的文件类型) 中的某个 autocommands 匹配,则 'filetype' | 选项设置为文件类型。 | +- 触发 synload-5 处的 autocommand。如果文件类型尚未 | 找到,则在 'runtimepath' 中搜索 scripts.vim。这 | 应该始终加载 $VIMRUNTIME/scripts.vim,它执行以下操作。 | | | +- 从 myscriptsfile | | 变量来源用户的可选文件。这是为了与 Vim 5.x 的向后兼容性。 | | | +- 如果文件类型仍然未知,请再次使用类似 "getline(1) =~ pattern" 的检查检查文件的内容, | 确定文件类型是否可以识别,并设置 'filetype'。 | +- 当确定文件类型并设置 'filetype' 时,这 | 会触发上面的 FileType autocommand synload-6。它设置 | 'syntax' 为确定的文件类型。 | +- 当在上面设置了 'syntax' 选项时,这会触发来自 synload-1 (和 synload-2) 的 autocommand。这会找到在 | 'runtimepath' 中的主语法文件,使用以下命令: | runtime! syntax/<name>.vim | +- 触发任何其他用户安装的 FileType 或 Syntax autocommands。这可用于更改特定语法的突出显示。

4. 转换为 HTML convert-to-HTML 2html.vim

旧的 to html 转换器已被 Lua 版本替换,文档已移至 :TOhtml

5. 语法文件备注 :syn-file-remarks

b:current_syntax-variable
Vim 将已加载语法的名称存储在 "b:current_syntax" 变量中。如果要加载其他设置,可以根据激活的语法使用它。例如
:au BufReadPost * if b:current_syntax == "csh"
:au BufReadPost *   do-some-things
:au BufReadPost * endif

ABEL abel.vim ft-abel-syntax

ABEL 高亮显示提供了一些用户定义的选项。要启用它们,请为相应变量分配任何值。例如
:let abel_obsolete_ok=1
要禁用它们,请使用 ":unlet"。例如
:unlet abel_obsolete_ok
变量 高亮显示
abel_obsolete_ok 过时的关键字是语句,而不是错误 abel_cpp_comments_illegal 不要将 '//' 解释为内联注释引导符

ADA

ant 语法文件默认情况下提供对 javascript 和 python 的语法高亮显示。其他脚本语言的语法高亮显示可以通过 AntSyntaxScript() 函数安装,该函数将标签名称作为第一个参数,将脚本语法文件名作为第二个参数。例如
:call AntSyntaxScript('perl', 'perl.vim')
将为以下 ant 代码安装语法 perl 高亮显示
<script language = 'perl'><![CDATA[
    # everything inside is highlighted as perl
]]></script>
参见 mysyntaxfile-add,了解如何永久安装脚本语言。
apache 语法文件提供对 Apache HTTP 服务器版本 2.2.3 的语法高亮显示。
与 "*.i" 匹配的文件可能是 Progress 或 Assembly。如果自动检测对您不起作用,或者您根本不编辑 Progress,请在启动 vimrc 中使用以下命令
:let filetype_i = "asm"
将 "asm" 替换为您使用的汇编类型。
有许多类型的汇编语言都使用相同的扩展名。因此,您必须自己选择类型,或在汇编文件中添加一行供 Vim 识别。目前包含以下语法文件:asm GNU 汇编(默认)asm68k Motorola 680x0 汇编 asmh8300 日立 H-8300 版本的 GNU 汇编 ia64 英特尔安腾 64 fasm 平面汇编 (https://flatassembler.net) masm 微软汇编(可能适用于任何 80x86)nasm Netwide 汇编 tasm Turbo 汇编(带有 80x86 到奔腾的指令集以及 MMX)pic PIC 汇编(目前适用于 PIC16F84)
最灵活的方法是在汇编文件中添加一行,其中包含
asmsyntax=nasm
将 "nasm" 替换为实际汇编语法的名称。此行必须是文件中的前五行之一。此文本前或后不得存在非空白文本。请注意,指定 asmsyntax=foo 等同于在 modeline 中设置 ft=foo,并且在两种设置发生冲突的情况下,modeline 中的设置将优先(特别是,如果 modeline 中有 ft=asm,无论指定为 asmsyntax 的内容如何,您都将获得 GNU 语法高亮显示)。
始终可以通过设置 b:asmsyntax 变量来覆盖特定缓冲区的语法类型
:let b:asmsyntax = "nasm"
如果未自动或手动设置 b:asmsyntax,则使用全局变量 asmsyntax 的值。这可以看作是默认汇编语言
:let asmsyntax = "nasm"
最后,如果未定义任何内容,则使用 "asm" 语法。
Netwide 汇编器 (nasm.vim) 可选高亮显示
要启用功能
:let   {variable}=1|set syntax=nasm
要禁用功能
:unlet {variable}  |set syntax=nasm
变量 高亮显示
nasm_loose_syntax 非官方解析器允许的语法不是错误 (解析器相关;不建议) nasm_ctx_outside_macro 宏外部的上下文不是错误 nasm_no_warn 潜在有风险的语法不是 ToDo
配置
以下变量控制某些语法高亮显示功能。您可以在 .vimrc 中添加它们。
要为 ".astro" 文件启用 TypeScript 和 TSX(默认情况下为 "disable")
let g:astro_typescript = "enable"
要为 ".astro" 文件启用 Stylus(默认情况下为 "disable")
let g:astro_stylus = "enable"
注意:您需要安装外部插件才能在 astro 文件中支持 stylus。
*.asp*.asa 文件可能是 Perl 或 Visual Basic 脚本。由于很难检测到这一点,您可以设置两个全局变量来告诉 Vim 您正在使用什么。对于 Perl 脚本,请使用
:let g:filetype_asa = "aspperl"
:let g:filetype_asp = "aspperl"
对于 Visual Basic,请使用
:let g:filetype_asa = "aspvbs"
:let g:filetype_asp = "aspvbs"

ASYMPTOTE asy.vim ft-asy-syntax

默认情况下,仅突出显示基本 Asymptote 关键字。要突出显示扩展几何关键字
:let g:asy_syn_plain = 1
以及突出显示与 3D 构造相关的关键字
:let g:asy_syn_three = 1
默认情况下,会突出显示 Asymptote 定义的颜色 (例如:lightblue)。要突出显示 TeX 定义的颜色 (例如:BlueViolet),请使用
:let g:asy_syn_texcolors = 1
或 Xorg 颜色 (例如:AliceBlue)
:let g:asy_syn_x11colors = 1

BAAN baan.vim baan-syntax

baan.vim 为从 BaanIV 版本到 SSA ERP LN 的 BaanC 提供语法支持,包括 3 GL 和 4 GL 编程。支持大量标准定义/常量。
在指定一个人的 init.vim 时,某些编码标准违规情况将会被提醒。
let baan_code_stds=1
baan-folding
可以通过以下提到的变量在各个级别启用语法折叠(在您的 init.vim 中设置这些变量)。源代码块和 SQL 上更复杂的折叠可能会占用大量 CPU 资源。
要允许任何折叠并在函数级别启用折叠,请使用
let baan_fold=1
可以像 if、while、for 等一样在源代码块级别启用折叠。开始/结束关键字之前的缩进必须匹配(空格不视为等于制表符)。
let baan_fold_block=1
可以为嵌入式 SQL 块 (例如 SELECT、SELECTDO、SELECTEMPTY 等) 启用折叠。开始/结束关键字之前的缩进必须匹配(空格不视为等于制表符)。
let baan_fold_sql=1
注意:块折叠会导致许多小折叠。建议在 init.vim:set 'foldminlines''foldnestmax' 选项,或在 .../after/syntax/baan.vim 中使用 :setlocal(参见 after-directory)。例如
set foldminlines=5
set foldnestmax=6

BASIC basic.vim vb.vim ft-basic-syntax ft-vb-syntax

Visual Basic 和 "普通" BASIC 都使用扩展名 ".bas"。为了检测应该使用哪一个,Vim 会检查文件的前五行中是否存在字符串 "VB_Name"。如果未找到,则文件类型将为 "basic",否则为 "vb"。扩展名为 ".frm" 的文件将始终被视为 Visual Basic。
如果自动检测对您不起作用,或者您只编辑例如 FreeBASIC 文件,请在启动 vimrc 中使用以下命令
:let filetype_bas = "freebasic"
C c.vim ft-c-syntax
C 高亮显示中的某些内容是可选的。要启用它们,请为相应变量分配任何值(包括零)。例如
:let c_comment_strings = 1
:let c_no_bracket_error = 0
要禁用它们,请使用 :unlet。例如
:unlet c_comment_strings
将值设置为零不起作用!
另一种方法是切换到 C++ 高亮显示
:set filetype=cpp
变量 高亮显示
c_gnu GNU gcc 特定项 c_comment_strings 注释内的字符串和数字 c_space_errors 尾随空格和 <Tab> 之前的空格 c_no_trail_space_error ... 但没有尾随空格 c_no_tab_space_error ... 但 <Tab> 之前没有空格 c_no_bracket_error 不要将 {} 突出显示为 [] 内的错误 c_no_curly_error 不要将 {} 突出显示为 [] 和 () 内的错误;... 除了第一列的 { 和 } 默认情况下会突出显示它们,否则你无法发现丢失的 “)”。 c_curly_error 通过查找所有配对来突出显示丢失的 };这会强制从文件开头进行同步,可能会很慢 c_no_ansi 不要进行标准 ANSI 类型和常量 c_ansi_typedefs ... 但要进行标准 ANSI 类型 c_ansi_constants ... 但要进行标准 ANSI 常量 c_no_utf 不要突出显示字符串中的 \u 和 \U c_syntax_for_h 对于 *.h 文件,使用 C 语法而不是 C++,使用 objc 语法而不是 objcpp c_no_if0 不要将 “#if 0” 块突出显示为注释 c_no_cformat 不要突出显示字符串中的 %-格式 c_no_c99 不要突出显示 C99 标准项 c_no_c11 不要突出显示 C11 标准项 c_no_bsd 不要突出显示 BSD 特定的类型 c_functions 突出显示函数调用和定义 c_function_pointers 突出显示函数指针定义
'foldmethod' 设置为 “syntax” 时,/* */ 注释和 { } 块将成为一个折叠。如果你不想让注释成为折叠,请使用
:let c_no_comment_fold = 1
“#if 0” 块也会被折叠,除非
:let c_no_if0_fold = 1
如果你在向后滚动时注意到突出显示错误,这些错误在使用 CTRL-L 重新绘制时会得到修复,请尝试将内部变量 “c_minlines” 设置为更大的数字
:let c_minlines = 100
这将使语法同步从第一行显示行之前的 100 行开始。默认值为 50(当设置 c_no_if0 时为 15)。使用更大数字的缺点是重新绘制可能会变慢。
当使用 “#if 0” / “#endif” 注释突出显示时,请注意,这仅在 “#if 0” 距离窗口顶部 “c_minlines” 之内时才有效。如果你有很长的 “#if 0” 结构,它将不会被正确突出显示。
要在注释中匹配额外项,请使用 cCommentGroup 集群。例如
:au Syntax c call MyCadd()
:function MyCadd()
:  syn keyword cMyItem contained Ni
:  syn cluster cCommentGroup add=cMyItem
:  hi link cMyItem Title
:endfun
ANSI 常量将使用 “cConstant” 组突出显示。这包括 “NULL”、“SIG_IGN” 和其他内容。但不是 “TRUE”,例如,因为这不在 ANSI 标准中。如果你觉得这令人困惑,请删除 cConstant 突出显示
:hi link cConstant NONE
如果你看到 ‘{‘ 和 ‘}’ 在它们可以接受的地方被突出显示为错误,请重置 cErrInParen 和 cErrInBracket 的突出显示。
如果你想在 C 文件中使用折叠,你可以在 'runtimepath' 的 “after” 目录中的文件里添加这些行。对于 Unix,这将是 ~/.config/nvim/after/syntax/c.vim。
syn sync fromstart
set foldmethod=syntax

CH ch.vim ft-ch-syntax

C/C++ 解释器。Ch 的语法高亮与 C 类似,并基于 C 语法文件。有关 C 可用的所有设置,请参见 c.vim
通过设置一个变量,你可以告诉 Vim 对 *.h 文件使用 Ch 语法,而不是 C 或 C++
:let ch_syntax_for_h = 1

CHILL chill.vim ft-chill-syntax

Chill 语法高亮与 C 类似。有关可用的所有设置,请参见 c.vim。此外还有
chill_space_errors 与 c_space_errors 相似 chill_comment_string 与 c_comment_strings 相似 chill_minlines 与 c_minlines 相似
ChangeLog 支持突出显示行首的空格。如果你不喜欢这样,请将以下行添加到你的 vimrc 中
let g:changelog_spacing_errors = 0
下次你编辑 changelog 文件时,这就会生效。你也可以使用 “b:changelog_spacing_errors” 来为每个缓冲区(在加载语法文件之前)设置它。
你可以更改使用的突出显示,例如,将空格标记为错误
:hi link ChangelogError Error
或者避免突出显示
:hi link ChangelogError NONE
这会立即生效。
默认情况下,会提供对 “clojure.core” 中的公共变量进行语法高亮显示,但可以通过将其他符号添加到 g:clojure_syntax_keywords 变量来突出显示这些符号。该值应该是一个 Dictionary,其中包含语法组名称,每个语法组名称包含一个 List 的标识符。
let g:clojure_syntax_keywords = {
    \   'clojureMacro': ["defproject", "defcustom"],
    \   'clojureFunc': ["string/join", "string/replace"]
    \ }
请参考 Clojure 语法脚本以获取有效的语法组名称。
还有 b:clojure_syntax_keywords,它是一个缓冲区局部变量,插件作者可以使用它来动态突出显示符号。
通过设置 b:clojure_syntax_without_core_keywords 变量,默认情况下将不会突出显示来自 “clojure.core” 的变量。这对于设置了 (:refer-clojure :only []) 的命名空间很有用。
g:clojure_fold 设置为 1 将启用 Clojure 代码的折叠。任何跨越多行的列表、向量或映射都可以使用标准 Vim fold-commands 进行折叠。
将此变量设置为 1 以启用对 Clojure 的 “丢弃读取器宏” 的基本突出显示。
#_(defn foo [x]
    (println x))
请注意,此选项不会正确突出显示堆叠的丢弃宏(例如 #_#_)。
COBOL 高亮显示对传统代码的需求不同于对新鲜开发的需求。这是由于正在进行的操作(维护与开发)和其他因素的差异。要启用传统代码高亮显示,请将以下行添加到你的 vimrc 中
:let cobol_legacy_code = 1
要再次禁用它,请使用
:unlet cobol_legacy_code

COLD FUSION coldfusion.vim ft-coldfusion-syntax

ColdFusion 有自己的 HTML 注释版本。要打开 ColdFusion 注释高亮显示,请将以下行添加到你的启动文件中
:let html_wrong_comments = 1
ColdFusion 语法文件基于 HTML 语法文件。
大多数内容与 ft-c-syntax 相同。
变量 高亮显示
cpp_no_cpp11 不要突出显示 C++11 标准项 cpp_no_cpp14 不要突出显示 C++14 标准项 cpp_no_cpp17 不要突出显示 C++17 标准项 cpp_no_cpp20 不要突出显示 C++20 标准项
这涵盖了名为 “csh” 的 shell。请注意,在某些系统上实际上使用的是 tcsh。
检测文件是 csh 还是 tcsh 非常困难。某些系统将 /bin/csh 符号链接到 /bin/tcsh,使得几乎不可能区分 csh 和 tcsh。如果 VIM 猜错了,你可以设置 “filetype_csh” 变量。要使用 csh:g:filetype_csh
:let g:filetype_csh = "csh"
要使用 tcsh
:let g:filetype_csh = "tcsh"
任何具有 tcsh 扩展名或标准 tcsh 文件名(.tcshrc、tcsh.tcshrc、tcsh.login)的脚本都将具有文件类型 tcsh。所有其他 tcsh/csh 脚本都将被归类为 tcsh,除非存在 “filetype_csh” 变量。如果存在 “filetype_csh” 变量,文件类型将设置为变量的值。
如果你更改 CSV 文件的分隔符,其语法高亮显示将不再与更改后的文件内容匹配。你需要取消设置以下变量
:unlet b:csv_delimiter
然后保存并重新加载文件
:w
:e
现在语法引擎应该能够确定新更改的 CSV 分隔符。
Cynlib 文件是 C++ 文件,它们使用 Cynlib 类库来启用使用 C++ 进行硬件建模和仿真。通常,Cynlib 文件具有 .cc 或 .cpp 扩展名,这使得它们很难与普通的 C++ 文件区分开来。因此,要在 .cc 文件中启用 Cynlib 高亮显示,请将以下行添加到你的 vimrc 文件中
:let cynlib_cyntax_for_cc=1
类似地,对于 cpp 文件(此扩展名通常只在 Windows 中使用)
:let cynlib_cyntax_for_cpp=1
要再次禁用这些,请使用
:unlet cynlib_cyntax_for_cc
:unlet cynlib_cyntax_for_cpp
与 "*.w" 匹配的文件可能是 Progress 或 cweb。如果自动检测对你无效,或者你根本不编辑 Progress,请在你的启动 vimrc 中使用
:let filetype_w = "cweb"

DART dart.vim ft-dart-syntax

Dart 是一种面向对象、类型化、类定义、垃圾回收的语言,用于开发移动、桌面、Web 和后端应用程序。Dart 使用一种类似于 C 的语法,源自 C、Java 和 JavaScript,并包含从 Smalltalk、Python、Ruby 和其他语言中采用的功能。
有关该语言及其开发环境的更多信息,请访问官方 Dart 语言网站:https://dart.ac.cn
dart.vim 语法检测并突出显示 Dart 语句、保留字、类型声明、存储类、条件语句、循环、插值值和注释。不支持 Flutter 或任何其他 Dart 框架的习语。
更改、修复?通过以下方式提交问题或拉取请求:
此语法文件的首要目标是根据 freedesktop.org 标准突出显示 .desktop 和 .directory 文件:https://specifications.freedesktop.org/desktop-entry-spec/latest/ 要突出显示不以 X- 开头的非标准扩展名,请设置
let g:desktop_enable_nonstd = 1
请注意,这可能会导致错误的突出显示。要突出显示 KDE 保留的功能,请设置
let g:desktop_enable_kde = 1
如果未提供 g:desktop_enable_kde,则它将遵循 g:desktop_enable_nonstd
差异高亮通常会找到翻译后的标题。如果文件中存在非常长的行,这可能会很慢。要禁用翻译
:let diff_translations = 0
另请参阅 diff-slow.
dircolors 工具的高亮定义只有一个选项。它用于与 Slackware GNU/Linux 发行版中命令的版本兼容。它添加了一些关键字,这些关键字通常会被大多数版本忽略。但在 Slackware 系统上,该工具会接受这些关键字并使用它们进行处理。要启用 Slackware 关键字,请在您的启动文件中添加以下行
let dircolors_is_slackware = 1

DOCBOOK docbk.vim ft-docbk-syntax docbook

DOCBOOK XML docbkxml.vim ft-docbkxml-syntax

DOCBOOK SGML docbksgml.vim ft-docbksgml-syntax

DocBook 文件有两种类型:SGML 和 XML。要指定您使用的是哪种类型,应设置“b:docbk_type”变量。如果 Vim 可以识别类型,它会自动为您执行此操作。当 Vim 无法猜测类型时,默认类型为 XML。您可以手动设置类型
:let docbk_type = "sgml"
:let docbk_type = "xml"
您需要在加载语法文件之前执行此操作,这很复杂。更简单的是将文件类型设置为“docbkxml”或“docbksgml”
:set filetype=docbksgml
:set filetype=docbkxml
您可以指定 DocBook 版本
:let docbk_ver = 3
如果未设置,则使用 4。
使用变量 dosbatch_cmdextversion 选择应支持的 Windows 命令解释器扩展集。对于 Windows NT 版本(Windows 2000 之前),这应该具有值 1。对于 Windows 2000 及更高版本,它应该是 2。使用以下行选择您想要的版本
:let dosbatch_cmdextversion = 1
如果未定义此变量,则默认为值 2 以支持 Windows 2000 及更高版本。
原始 MS-DOS 支持使用双冒号 (::) 作为输入注释行的替代方式。此习惯用法可用于当前的 Windows 命令解释器,但在 ( ... ) 命令块内使用时会导致问题。您可以在 Stack Overflow 上找到有关此问题的讨论 -
要允许在使用 Windows 命令解释器的命令块中使用 :: 作为注释,请将 dosbatch_colons_comment 变量设置为任何内容
:let dosbatch_colons_comment = 1
如果设置了此变量,则 :: 注释将被视为命令块中的最后一行,并将被高亮显示为错误。
有一个选项可以涵盖是否应该将 *.btm 文件检测为类型“dosbatch”(MS-DOS 批处理文件)或类型“btm”(4DOS 批处理文件)。后者是默认使用的。您可以使用以下行选择前者
:let g:dosbatch_syntax_for_btm = 1
如果此变量未定义或为零,则选择 btm 语法。
Doxygen 使用特殊的文档格式(类似于 Javadoc)生成代码文档。此语法脚本将 doxygen 高亮添加到 c、cpp、idl 和 php 文件中,也应该适用于 java。
有几种方法可以打开 doxygen 格式。它可以显式执行,也可以通过在文件的语法后附加“.doxygen”在模式行中执行。例如
:set syntax=c.doxygen
// vim:syntax=c.doxygen
也可以通过设置全局或缓冲区局部变量 load_doxygen_syntax 对 C、C++、C#、IDL 和 PHP 文件自动执行此操作。这可以通过在您的 vimrc 中添加以下内容来实现。
:let g:load_doxygen_syntax=1
有一些变量会影响语法高亮,它们与非标准高亮选项有关。
变量 默认值 效果
g:doxygen_enhanced_color g:doxygen_enhanced_colour 0 对 doxygen 注释使用非标准高亮。
doxygen_my_rendering 0 禁用 HTML 粗体、斜体和 html_my_rendering 下划线的渲染。
doxygen_javadoc_autobrief 1 设置为 0 以禁用 javadoc autobrief 颜色高亮。
doxygen_end_punctuation '[.]' 设置为简要结束标点的正则表达式匹配
还有一些值得一提的高亮组,因为它们在配置中很有用。
高亮 效果
doxygenErrorComment 当代码、逐字或点部分中缺少标点符号时,结束注释的颜色 doxygenLinkError 当 \link 部分缺少 \endlink 时,结束注释的颜色。
默认情况下,DTD 语法高亮区分大小写。要禁用区分大小写的高亮,请在您的启动文件中添加以下行
:let dtd_ignore_case=1
DTD 语法文件会将未知标签高亮显示为错误。如果这很烦人,可以通过设置以下内容来关闭它
:let dtd_no_tag_errors=1
在获取 dtd.vim 语法文件之前。参数实体名称在定义中使用“Type”高亮组进行高亮显示,使用“Comment”进行标点符号和“%”进行高亮显示。参数实体实例使用“Constant”高亮组进行高亮显示,使用“Type”高亮组进行 % 和 ; 定界符进行高亮显示。这可以通过设置以下内容来关闭
:let dtd_no_param_entities=1
DTD 语法文件也包含在 xml.vim 中,以高亮显示包含的 dtd。
虽然 Eiffel 不区分大小写,但它的样式指南区分大小写,语法高亮文件鼓励使用它们。这还允许以不同的方式突出显示类名。如果要禁用区分大小写的高亮,请在您的启动文件中添加以下行
:let eiffel_ignore_case=1
类名和注释中的 TODO 标记仍然区分大小写。
相反,对于更严格的检查,请添加以下行之一
:let eiffel_strict=1
:let eiffel_pedantic=1
设置 eiffel_strict 只会捕获对五个预定义词“Current”、“Void”、“Result”、“Precursor”和“NONE”的大小写不当,以警告不要意外将其用作特性名或类名。
设置 eiffel_pedantic 将相当严格地执行对 Eiffel 样式指南的遵守(例如,任意混合的大小写字母以及过时的关键字大写方式)。
如果您想使用“Current”、“Void”、“Result”和“Precursor”的小写版本,您可以使用
:let eiffel_lower_case_predef=1
而不是完全关闭区分大小写的高亮。
对 ISE 提出的新创建语法的支持可以通过以下方式启用,该语法已由某些编译器进行实验性处理
:let eiffel_ise=1
最后,一些供应商支持十六进制常量。要处理它们,请添加
:let eiffel_hex_constants=1
到您的启动文件。
Euphoria 有两个语法高亮文件。一个用于 Euphoria 版本 3.1.1,它是默认语法高亮文件,另一个用于 Euphoria 版本 4.0.5 或更高版本。
Euphoria 版本 3.1.1 (https://www.rapideuphoria.com/ 链接似乎已失效) 对于开发 DOS 平台的应用程序仍然是必需的,Euphoria 版本 4 (https://www.openeuphoria.org/) 不支持该平台。
以下文件扩展名被自动检测为 Euphoria 文件类型
*.e, *.eu, *.ew, *.ex, *.exu, *.exw
*.E, *.EU, *.EW, *.EX, *.EXU, *.EXW
要选择 Euphoria 的语法高亮文件,以及自动检测 *.e*.E 文件扩展名作为 Euphoria 文件类型,请在您的启动文件中添加以下行
:let g:filetype_euphoria = "euphoria3"
:let g:filetype_euphoria = "euphoria4"
Elixir 和 Euphoria 共享 *.ex 文件扩展名。如果文件类型专门设置为 Euphoria,使用 g:filetype_euphoria 变量,或者根据文件中的关键字确定文件为 Euphoria,则文件类型将设置为 Euphoria。否则,文件类型将默认为 Elixir。
Erlang 是一种由爱立信开发的功能性编程语言。以下扩展名的文件被识别为 Erlang 文件:erl、hrl、yaws。
默认情况下会突出显示 BIF(内置函数)。要禁用此功能,请在您的 vimrc 中放置以下行
:let g:erlang_highlight_bifs = 0
要启用一些特殊原子的高亮显示,请在您的 vimrc 中放置以下内容
:let g:erlang_highlight_special_atoms = 1

ELIXIR elixir.vim ft-elixir-syntax

Elixir 是一种动态的功能性语言,用于构建可扩展且可维护的应用程序。
以下文件扩展名被自动检测为 Elixir 文件类型
*.ex, *.exs, *.eex, *.leex, *.lock
Elixir 和 Euphoria 共享 *.ex 文件扩展名。如果文件类型专门设置为 Euphoria,使用 g:filetype_euphoria 变量,或者根据文件中的关键字确定文件为 Euphoria,则文件类型将设置为 Euphoria。否则,文件类型将默认为 Elixir。
FlexWiki 是一个基于 ASP.NET 的 wiki 软件包,可在 https://www.flexwiki.com 获得。注意:此网站目前无法使用,维基百科中提到开发工作已于 2009 年停止。
FlexWiki 语法的最常见元素可使用语法高亮显示。关联的 ftplugin 脚本设置了一些缓冲区局部选项,以使编辑 FlexWiki 页面更加方便。FlexWiki 认为换行符是新段落的开始,因此 ftplugin 设置了 'tw'=0(无限行长)、'wrap'(换行长行而不是使用水平滚动)、'linebreak'(在 'breakat' 中的字符处换行,而不是在屏幕上的最后一个字符处换行)等等。它还包括一些默认情况下处于禁用状态的键映射。
如果您想启用使“j”和“k”以及光标键向上和向下移动显示行的键映射,请在您的 vimrc 中添加以下内容
:let flexwiki_maps = 1

FORM form.vim ft-form-syntax

FORM 文件中语法元素的着色方案使用默认模式 Conditional、Number、Statement、Comment、PreProc、Type 和 String,遵循 J.A.M. Vermaseren、CAN、荷兰、1991 年的“Symbolic Manipulation with FORM”中的语言规范。
如果您想将自己的更改包含到默认颜色中,则必须重新定义以下语法组
formConditional
formNumber
formStatement
formHeaderStatement
formComment
formPreProc
formDirective
formType
formString
请注意,form.vim 语法文件默认情况下在同一个语法组中实现 FORM 预处理器命令和指令。
FORM 预定义的增强颜色模式可用于区分 FORM 程序主体中的标题语句和语句。要激活此模式,请在您的 vimrc 文件中定义以下变量
:let form_enhanced_color=1
增强模式还利用了深色 gvim 显示的其他颜色功能。在此,语句的颜色为浅黄色而不是黄色,条件为浅蓝色,以便更好地区分。
Visual Basic 和 FORM 都使用扩展名“.frm”。为了检测应该使用哪个,Vim 检查文件前五行中是否存在字符串“VB_Name”。如果找到,文件类型将为“vb”,否则为“form”。
如果自动检测对您不起作用,或者您只编辑 FORM 文件,例如,请在您的启动 vimrc 中使用以下内容
:let filetype_frm = "form"

FORTH forth.vim ft-forth-syntax

与“*.f”匹配的文件可能是 Fortran 或 Forth,与“*.fs”匹配的文件可能是 F# 或 Forth。如果自动检测对您不起作用,或者您根本不编辑 F# 或 Fortran,请在您的启动 vimrc 中使用以下内容
:let filetype_f  = "forth"
:let filetype_fs = "forth"

FORTRAN fortran.vim ft-fortran-syntax

默认高亮和方言
Vim 按照 Fortran 2023(最新标准)进行语法高亮。由于 Fortran 2023 几乎是以前版本(Fortran 2018、2008、2003、95、90、77 和 66)的超集,所以此选择应该适合大多数用户的大部分时间。一些在最近的 Fortran 标准中被删除或宣布为过时的遗留结构将被高亮显示为错误和待办事项。
语法脚本不再支持 Fortran 方言。fortran_dialect 变量现在被静默忽略。由于计算机现在快得多,因此不再需要 fortran_more_precise 变量,并且会被静默忽略。
Fortran 源代码形式
Fortran 代码可以采用固定格式或自由格式。请注意,如果形式设置不正确,则语法高亮将不正确。
创建新的 Fortran 文件时,语法脚本将假设固定格式。如果您始终使用自由格式,则
:let fortran_free_source=1
如果您始终使用固定格式,则
:let fortran_fixed_source=1
如果源代码的形式以非标准方式取决于文件扩展名,那么最方便的方法是在 ftplugin 文件中设置 fortran_free_source。有关 ftplugin 文件的更多信息,请参阅 ftplugin。请注意,这仅在您的 .vimrc 文件中 "filetype plugin indent on" 命令在 "syntax on" 命令之前时才有效。
当您编辑现有的 Fortran 文件时,语法脚本将假设自由格式,如果 fortran_free_source 变量已设置,并且假设固定格式,如果 fortran_fixed_source 变量已设置。假设这两个变量都没有设置。在这种情况下,语法脚本会尝试通过检查文件扩展名来确定使用了哪种源代码形式,使用 ifort、gfortran、Cray、NAG 和 PathScale 编译器常用的约定(.f、.for、.f77 用于固定格式,.f90、.f95、.f03、.f08 用于自由格式)。.fpp 和 .ftn 文件扩展名没有使用默认值,因为不同的编译器对它们处理方式不同。如果这些都不起作用,则脚本将检查文件前 500 行的前五列。如果未检测到自由格式的迹象,则假定该文件为固定格式。该算法应该在绝大多数情况下有效。在某些情况下,例如以 500 行或更多行全行注释开头的文件,脚本可能会错误地判断代码为固定格式。如果发生这种情况,只需在第一行中前五行的前二十五行中添加一个非注释语句,保存 (:w),然后重新加载 (:e!) 文件。
供应商扩展
固定格式 Fortran 要求最大行长为 72 个字符,但脚本允许最大行长为 80 个字符,就像过去三十年创建的所有编译器一样。如果您设置 fortran_extended_line_length 变量,则允许更长的行长,为 132 个字符,例如
:let fortran_extended_line_length=1
如果您希望对 CUDA Fortran 扩展进行额外高亮显示,则应设置 fortran_CUDA 变量,例如
:let fortran_CUDA=1
若要激活对一些常见的非标准供应商提供的内在函数的识别,您应该设置 fortran_vendor_intrinsics 变量,例如
:let fortran_vendor_intrinsics=1
Fortran 文件中的制表符
制表符不受 Fortran 标准的认可。制表符不适合固定格式的 Fortran 源代码,因为固定格式 Fortran 源代码需要固定列边界。因此,制表符将被标记为错误。但是,一些程序员喜欢使用制表符。如果您的 Fortran 文件包含制表符,则应在您的 vimrc 中设置 fortran_have_tabs 变量,例如
:let fortran_have_tabs=1
不幸的是,使用制表符意味着语法文件将无法检测到错误的边距。
Fortran 文件的语法折叠
如果您在您的 .vimrc 中设置了 fortran_fold 变量,例如
:let fortran_fold=1
指示语法脚本为程序单元定义折叠区域,即以 program 语句开头的主程序、子程序、函数子程序、模块、子模块、注释行块和块数据单元。Block、interface、associate、critical、type definition 和 change team 结构也将被折叠。如果您还设置了 fortran_fold_conditionals 变量,例如
:let fortran_fold_conditionals=1
然后还将为 do 循环、if 块、select case、select type 和 select rank 结构定义折叠区域。请注意,为大型文件定义折叠区域可能很慢。
syntax/fortran.vim 脚本包含嵌入式注释,这些注释告诉您如何注释和/或取消注释某些行以 (a) 激活对一些非标准供应商提供的内在函数的识别,以及 (b) 防止在 2008 标准中被删除或宣布为过时的功能被高亮显示为待办事项。
局限性
括号检查不会捕获过少的闭括号。Hollerith 字符串不被识别。一些关键字可能被错误地高亮显示,因为 Fortran90 没有保留字。
有关 Fortran 的更多信息,请参阅 ft-fortran-indentft-fortran-plugin
FreeBASIC 文件将针对四种可用方言中的每一种进行不同的高亮显示,“fb”、“qb”、“fblite”和“deprecated”。有关如何选择正确方言,请参阅 ft-freebasic-plugin
高亮显示可以通过以下变量进一步配置。
变量 高亮显示
freebasic_no_comment_fold 禁用多行注释折叠 freebasic_operators 非字母运算符 freebasic_space_errors 尾随空格和 <Tab> 前面的空格 freebasic_type_suffixes QuickBASIC 风格类型后缀

FVWM 配置文件 fvwm.vim ft-fvwm-syntax

为了使 Vim 识别与模式 fvwmrcfvwm2rc 不匹配的 Fvwm 配置文件,您必须在您的 myfiletypes.vim 文件中添加适合您系统的其他模式。对于这些模式,您必须将 "b:fvwm_version" 变量设置为 Fvwm 的主版本号,并将 'filetype' 选项设置为 fvwm。
例如,要使 Vim 将 /etc/X11/fvwm2/ 中的所有文件识别为 Fvwm2 配置文件,请添加以下内容
:au! BufNewFile,BufRead /etc/X11/fvwm2/*  let b:fvwm_version = 2 |
                                       \ set filetype=fvwm

GSP gsp.vim ft-gsp-syntax

GSP 页面的默认颜色样式由 html.vim 定义,java 代码(在 java 标签内或在反引号之间内联)的颜色由 java.vim 定义。以下在 html.vim 中定义的 HTML 组被重新定义以合并和突出显示内联 java 代码
htmlString htmlValue htmlEndTag htmlTag htmlTagN
高亮显示在您看到内联 java 代码的大多数地方应该看起来不错,但在某些特殊情况下可能不会。要添加另一个 HTML 组,您将在其中看到内联 java 代码,但它没有正确高亮显示,只需从 html.vim 中复制您想要的行,并将 gspJava 添加到 contains 子句中。
内联 java 的反引号根据 htmlError 组进行高亮显示,以便更容易看到它们。
groff 语法文件是 nroff.vim 的包装器,有关用法和配置示例,请参阅该标题下的说明。此包装器的目的是通过从 modeline 或在个人文件类型定义文件中(请参阅 filetype.txt)设置文件类型来设置 groff 语法扩展。
Haskell 语法文件支持纯 Haskell 代码以及有文采的 Haskell 代码,后者采用 Bird 风格和 TeX 风格。Haskell 语法高亮也将高亮显示 C 预处理器指令。
如果您想高亮显示分隔符字符(如果您有浅色背景,这很有用),请添加到您的 vimrc
:let hs_highlight_delimiters = 1
将 True 和 False 视为关键字而不是普通标识符,请添加
:let hs_highlight_boolean = 1
也要将基本类型的名称视为关键字
:let hs_highlight_types = 1
并将更多相对常见的类型的名称视为关键字
:let hs_highlight_more_types = 1
如果您想高亮显示调试函数的名称,请在您的 vimrc 中添加
:let hs_highlight_debug = 1
Haskell 语法高亮也高亮显示 C 预处理器指令,并将以 # 开头但不符合有效指令的线标记为错误。这会干扰 Haskell 的运算符语法,因为它们可能以 # 开头。如果您想将这些高亮显示为运算符而不是错误,请在您的 vimrc 中添加
:let hs_allow_hash_operator = 1
有文采的 Haskell 代码的语法高亮将尝试自动猜测您的有文采的 Haskell 代码是否包含 TeX 标记,并相应地高亮显示 TeX 结构或不进行高亮显示。您可以通过在您的 vimrc 中添加以下内容来全局覆盖此设置
:let lhs_markup = none
完全不进行高亮显示,或者
:let lhs_markup = tex
强制高亮显示始终尝试高亮显示 TeX 标记。为了获得更大的灵活性,您还可以使用此变量的缓冲区局部版本,因此,例如
:let b:lhs_markup = tex
将强制对特定缓冲区进行 TeX 高亮显示。它必须在打开缓冲区的语法高亮或加载文件之前设置。
HTML 文件中标签的颜色方案如下。
开始标签的 <> 与结束标签的 </> 的颜色不同。这是故意的!对于开始标签,使用 'Function' 颜色,而对于结束标签,使用 'Identifier' 颜色(请参阅 syntax.vim 以检查它们在您这里是如何定义的)。
已知的标签名称的颜色与 C 中的语句相同。未知的标签名称的颜色与 <> 或 </> 的颜色相同,这使得很容易发现错误。
请注意,参数(或属性)名称也是如此。已知的属性名称的颜色与未知的属性名称的颜色不同。
一些 HTML 标签用于更改文本的呈现方式。html.vim 语法着色文件识别以下标签,并更改普通文本的显示方式:<B> <I> <U> <EM> <STRONG><EM> 用作 <I> 的别名,而 <STRONG> 用作 <B> 的别名),<H1> - <H6><HEAD><TITLE><A>,但仅在用作链接时(即,它必须包含 href,如 <A href="somefile.html">)。
如果您想更改此类文本的呈现方式,您必须重新定义以下语法组
htmlBold
htmlBoldUnderline
htmlBoldUnderlineItalic
htmlUnderline
htmlUnderlineItalic
htmlItalic
htmlTitle 用于标题
htmlH1 - htmlH6 用于标题
要使此重新定义生效,您必须重新定义所有这些,除了最后两个(htmlTitle 和 htmlH[1-6],它们是可选的),并在您的 vimrc 中定义以下变量(这是因为文件在初始化期间读取的顺序):
:let html_my_rendering=1
如果您想查看示例,请在 https://www.fleiner.com/vim/download.html 上下载 mysyntax.vim。
您也可以通过在您的 vimrc 文件中添加以下行来禁用此渲染
:let html_no_rendering=1
默认情况下,Vim 会在第一行显示之前同步到前 250 行。这可以通过以下方式配置
:let html_minlines = 500
HTML 注释比较特殊(有关详细信息,请参阅 HTML 参考文档),语法着色方案会突出显示所有错误。 但是,如果您更喜欢使用错误的样式(以 <!-- 开头,以 --> 结尾),您可以定义
:let html_wrong_comments=1
嵌入在 HTML 文档中的 JavaScript 和 Visual Basic 被突出显示为“特殊”,语句、注释、字符串等以标准编程语言中的颜色着色。 请注意,目前只支持 JavaScript 和 Visual Basic,尚未添加其他脚本语言。
嵌入式和内联级联样式表 (CSS) 也突出显示。
有很多 html 预处理器语言。 html.vim 的编写使得包含它变得微不足道。 为此,请将以下两行添加到该语言的语法着色文件中(此示例来自 asp.vim 文件)
runtime! syntax/html.vim
syn cluster htmlPreproc add=asp
现在,您只需要确保将包含预处理器语言的所有区域添加到 htmlPreproc 集群中。
html-折叠
HTML 语法文件提供语法 折叠(请参阅 :syn-fold)在开始和结束标签之间。 这可以通过以下方式打开
:let g:html_syntax_folding = 1
:set foldmethod=syntax
注意:语法折叠可能会显着减慢语法突出显示,尤其是对于大型文件。
HTML/OS(由 AESTIVA 提供) htmlos.vim ft-htmlos-syntax
HTML/OS 的着色方案的工作原理如下
默认情况下,函数和变量名称的颜色相同,因为 VIM 不会为函数和标识符指定不同的颜色。 要更改此设置(如果您希望函数名称以不同的颜色显示,则建议这样做),您需要将以下行添加到您的 vimrc 中
:hi Function cterm=bold ctermfg=LightGray
当然,如果您愿意,ctermfg 可以是不同的颜色。
HTML/OS 遇到的另一个问题是,没有特殊的文件类型来表示它是一个包含 HTML/OS 代码的文件。 您可以通过打开文件并通过执行以下操作来打开 HTML/OS 语法来更改此设置
:set syntax=htmlos
最后,应该注意,开始 HTML/OS 代码块的开头和结尾字符可以是 << 或 [[ 和 >> 或 ]],分别。
Intel Itanium 64 汇编语言的突出显示。 请参阅 asm.vim 了解如何识别此文件类型。
要让 *.inc 文件被识别为 IA64,请将此添加到您的 vimrc 文件中
:let g:filetype_inc = "ia64"

INFORM inform.vim ft-inform-syntax

Inform 突出显示包括 Inform 库提供的符号,因为大多数程序都大量使用它。 如果您不希望突出显示库符号,请将此添加到您的 Vim 启动中
:let inform_highlight_simple=1
默认情况下,假定 Inform 程序以 Z-machine 为目标,并适当地突出显示 Z-machine 汇编语言符号。 如果您打算让您的程序以 Glulx/Glk 环境为目标,则需要将此添加到您的启动序列中
:let inform_highlight_glulx=1
这将突出显示 Glulx 操作码,并将 glk() 添加到突出显示的系统函数集中。
Inform 编译器会在遇到某些过时的关键字时将其标记为错误。 这些关键字通常由 Vim 突出显示为错误。 要防止此类错误突出显示,您必须将此添加到您的启动序列中
:let inform_suppress_obsolete=1
默认情况下,突出显示的语言功能符合编译器版本 6.30 和库版本 6.11。 如果您使用的是较旧的 Inform 开发环境,您可能需要将此添加到您的启动序列中
:let inform_highlight_old=1

IDL idl.vim idl-syntax

IDL(接口定义语言)文件用于定义 RPC 调用。 在 Microsoft 环境中,它也用于定义 COM 接口和调用。
IDL 的结构很简单,足以允许完全基于语法的方案,而不是使用一些启发式方法。 结果很大,而且有点重复,但似乎有效。
这里有一些 Microsoft 对 idl 文件的扩展。 其中一些通过定义 idl_no_ms_extensions 禁用。
更复杂的扩展通过定义 idl_no_extensions 禁用。
变量效果
idl_no_ms_extensions 禁用一些 Microsoft 特定的扩展 idl_no_extensions 禁用复杂扩展 idlsyntax_showerror 显示 IDL 错误(可能很烦人,但非常有用) idlsyntax_showerror_soft 默认情况下对错误使用更柔和的颜色
java.vim 语法突出显示文件提供了多种选项。
在 Java 1.0.2 中,永远不可能在括号内有花括号,因此这被标记为错误。 自 Java 1.1 以来,这成为可能(使用匿名类); 因此,不再被标记为错误。 如果您更喜欢旧方法,请将以下行添加到您的 Vim 启动文件中
:let g:java_mark_braces_in_parens_as_errors = 1
java.lang 中声明的所有(导出)公共类型始终自动导入并可用作简单名称。 要突出显示它们,请使用
:let g:java_highlight_java_lang_ids = 1
如果您在 https://www.fleiner.com/vim/download.html 下载 javaid.vim 脚本,您还可以突出显示大多数标准 Java 包的类型。 如果您更喜欢只突出显示某个特定包的类型,例如 java.io,请使用以下代码
:let g:java_highlight_java_io = 1
检查 javaid.vim 文件以获取所有受支持包的列表。
缩进函数声明的标题可以突出显示(以及 lambda 表达式和方法引用表达式的部分),但这取决于您编写 Java 代码的方式。 识别两种格式
1) 如果您编写的函数声明始终缩进一个制表符、一个空格... 或八个空格字符,您可能想要设置其中一个
:let g:java_highlight_functions = "indent"
:let g:java_highlight_functions = "indent1"
:let g:java_highlight_functions = "indent2"
:let g:java_highlight_functions = "indent3"
:let g:java_highlight_functions = "indent4"
:let g:java_highlight_functions = "indent5"
:let g:java_highlight_functions = "indent6"
:let g:java_highlight_functions = "indent7"
:let g:java_highlight_functions = "indent8"
请注意,就 'shiftwidth' 而言,这是最左侧的缩进步骤。
2) 但是,如果您遵循 Java 关于如何命名函数和类型的指南(关于大小写),并且有任何缩进,您可能想要设置
:let g:java_highlight_functions = "style"
此外,您可以将任何 "g:java_highlight_functions" 值与以下值组合
:let g:java_highlight_signature = 1
使具有参数列表括号的函数的名称与其类型参数、返回类型和形式参数明显区分; 并且使 lambda 表达式的参数列表括号与其箭头与其形式参数或标识符明显区分。
如果两种设置都不适合您,但您仍然希望突出显示函数声明的标题,请修改当前语法定义或创建新的语法定义。
高阶函数类型可能很难用肉眼解析,因此统一降低一些组件的色调可能会有价值。 假设此类类型名称符合 Java 命名指南,您可以通过以下方式进行安排
:let g:java_highlight_generics = 1
在 Java 1.1 中,函数 System.out.println()System.err.println() 只能用于调试。 考虑在您的启动文件中添加以下定义
:let g:java_highlight_debug = 1
使这些语句的大部分被着色为 *Debug 调试语句,并使其中的一些项目进一步分组和链接:*Special 作为 DebugSpecial、*String 作为 DebugString、*Boolean 作为 DebugBoolean、*Type 作为 DebugType,它们分别用于字符串中出现的特殊字符、字符串本身、布尔文字和特殊实例引用(superthisnull)。
Javadoc 是一个程序,它从 Java 程序文件中提取特殊注释并创建 HTML 页面。 标准配置将类似于 HTML 文件突出显示此 HTML 代码(请参阅 html.vim)。 您甚至可以在此代码中添加 JavaScript 和 CSS(见下文)。 HTML 渲染和 Markdown 渲染的不同之处在于:1. 第一句(所有字符直到第一个句点 .,后面跟着一个空格字符或行终止符,或者直到第一个块标签,例如 @param@return)被着色为 SpecialComment 特殊注释。 2. 文本被着色为 *Comment 注释。 3. HTML 注释被着色为 *Special 特殊符号。 4. 标准 Javadoc 标签(@code@see 等)被着色为 *Special 特殊符号,其中一些参数被着色为 *Function 函数名称。 要关闭 HTML 和 Markdown 的此功能,请将以下行添加到您的启动文件中
:let g:java_ignore_javadoc = 1
或者,只抑制 HTML 注释或 Markdown 注释
:let g:java_ignore_html = 1
:let g:java_ignore_markdown = 1
有关 Markdown 注释的更多支持,请参阅 ft-java-plugin
如果您使用上面描述的特殊 Javadoc 注释突出显示,您还可以为 JavaScript、Visual Basic 脚本和嵌入式 CSS(样式表)打开特殊突出显示。 这只有在这些语言中的任何一个实际出现在 Javadoc 注释中时才有意义。 要使用的变量是
:let g:java_javascript = 1
:let g:java_css = 1
:let g:java_vb = 1
请注意,这三个变量在 HTML 语法文件中维护。
数字和字符串可以在非 Javadoc 注释中通过以下方式识别
:let g:java_comment_strings = 1
'foldmethod' 设置为 "syntax" 时,代码块和多行注释将被折叠。 多行注释的第一行通常不写任何文本,这使得 Javadoc 注释的折叠内容在默认的 'foldtext' 值下信息量较少; 您可以选择对以这种方式编写的任何注释显示第二行的内容,并对以其他方式编写的注释显示第一行的内容,使用
:let g:java_foldtext_show_first_or_second_line = 1
尾随空格字符或制表符之前的空格字符序列可以标记为错误
:let g:java_space_errors = 1
但可以通过同时定义以下任一选项来抑制任何一种错误
:let g:java_no_trail_space_error = 1
:let g:java_no_tab_space_error = 1
为了用不同的颜色突出显示嵌套括号,请为 javaParenjavaParen1javaParen2 定义颜色。 例如,
:hi link javaParen Comment
:hi javaParen ctermfg=blue guifg=#0000ff
某些修饰符彼此不兼容,例如 abstractfinal
:syn list javaConceptKind
并且可以作为一组与其他修饰符不同的颜色进行突出显示
:hi link javaConceptKind NonText
如果您在向后滚动时注意到突出显示错误,而这些错误在使用 CTRL-L 重新绘制时已修复,请尝试将 "g:java_minlines" 变量设置为更大的数字
:let g:java_minlines = 50
这将使语法同步在第一行显示行之前开始 50 行。 默认值为 10。 使用更大的数字的缺点是重新绘制可能会变慢。
Java 平台的重大更改以 JDK 增强提案 (JEP) 的形式逐步引入,这些提案可以在一个版本中实现并作为其预览功能提供。 这些功能可能需要多个 JEP 和几个发布周期才能集成到平台中或从这项工作中撤回。 为了迎合早期采用者,Vim 中有一个可选的语法相关预览功能支持。 您可以通过指定一个预览功能编号列表来请求它,如下所示
:let g:java_syntax_previews = [455, 476]
受支持的 JEP 编号应来自此表:430:字符串模板 [JDK 21] 455:模式、instanceof 和 switch 中的原始类型 476:模块导入声明
请注意,一旦特定预览功能集成到 Java 平台中,其条目将从该表中删除,相关的可选性将被停止。
json 语法文件默认情况下提供具有隐藏支持的语法突出显示。 要禁用隐藏
let g:vim_json_conceal = 0
要禁用错误的语法突出显示
let g:vim_json_warnings = 0

JQ jq.vim jq_quote_highlight ft-jq-syntax

要禁用数字具有自己的颜色,请将以下内容添加到您的 vimrc 中
hi link jqNumber Normal
如果您希望引号的突出显示与字符串不同
let g:jq_quote_highlight = 1

LACE lace.vim ft-lace-syntax

Lace(Eiffel 中类组装语言)不区分大小写,但样式指南并非如此。如果您更喜欢不区分大小写的突出显示,只需在启动文件中定义 vim 变量 'lace_case_insensitive'
:let lace_case_insensitive=1

LF (LFRC) lf.vim ft-lf-syntax g:lf_shell_syntax

b:lf_shell_syntax
对于 lf 文件管理器配置文件 (lfrc),可以通过设置不同的 'include' 命令搜索模式来全局和逐缓冲区更改 shell 命令语法突出显示:let g:lf_shell_syntax = "syntax/dosbatch.vim" let b:lf_shell_syntax = "syntax/zsh.vim"
这些变量默认情况下未设置。
默认的 'include' 命令搜索模式为 'syntax/sh.vim'。
Lex 使用蛮力同步,因为 "^%%$" 部分分隔符没有提供有关后续部分的线索。因此,的值
:syn sync minlines=300
如果用户遇到同步困难(例如,在大型 lex 文件中可能发生),则可以由用户更改。
要将弃用的函数突出显示为错误,请在您的 vimrc 中添加
:let g:lifelines_deprecated = 1
lisp 语法突出显示提供两种选项
g:lisp_instring : If it exists, then "(...)" strings are highlighted
                  as if the contents of the string were lisp.
                  Useful for AutoLisp.
g:lisp_rainbow  : If it exists and is nonzero, then differing levels
                  of parenthesization will receive different
                  highlighting.
g:lisp_rainbow 选项为圆括号和反引号括号提供 10 级别的单独颜色。由于颜色级别的数量,与非彩虹突出显示不同,彩虹模式使用 ctermfg 和 guifg 指定其突出显示,从而绕过使用标准突出显示组的常用颜色方案控制。使用的实际突出显示取决于深色/亮色设置(参见 'bg')。
lite 语法突出显示有两种选项。
如果您喜欢字符串内部的 SQL 语法突出显示,请使用此方法
:let lite_sql_query = 1
对于同步,minlines 默认值为 100。如果您更喜欢其他值,可以将 "lite_minlines" 设置为您想要的 value。示例
:let lite_minlines = 200

LPC lpc.vim ft-lpc-syntax

LPC 代表一种简单、内存高效的语言:Lars Pensjö C。LPC 的文件名通常为 *.c。识别这些文件为 LPC 会打扰只编写 C 程序的用户。如果您想在 Vim 中使用 LPC 语法,您应该在您的 vimrc 文件中设置一个变量
:let lpc_syntax_for_c = 1
如果它对某些特定的 C 或 LPC 文件不起作用,请使用模式行。对于 LPC 文件
// vim:set ft=lpc:
对于被识别为 LPC 的 C 文件
// vim:set ft=c:
如果您不想设置变量,请在每个 LPC 文件中使用模式行。
LPC 有几种实现,我们打算支持最常用的实现。这里默认的 LPC 语法适用于 MudOS 系列,对于 MudOS v22 及之前版本,您应该关闭明智的修饰符,这也会断言 v22 之后的新的 efun 为无效,当您使用最新版本的 MudOS 时不要设置此变量
:let lpc_pre_v22 = 1
对于 LpMud 3.2 系列的 LPC
:let lpc_compat_32 = 1
对于 LPC4 系列的 LPC
:let lpc_use_lpc4_syntax = 1
对于 uLPC 系列的 LPC:uLPC 已开发为 Pike,因此您应该使用 Pike 语法,并且您的源文件名应该是 *.pike
Lua 语法文件可用于版本 4.0、5.0、5.1 和 5.2(5.2 是默认版本)。您可以使用全局变量 lua_version 和 lua_subversion 选择其中一个版本。例如,要激活 Lua 5.1 语法突出显示,请像这样设置变量
:let lua_version = 5
:let lua_subversion = 1

MAIL mail.vim ft-mail.vim

Vim 突出显示电子邮件的所有标准元素(标题、签名、引用文本和 URL/电子邮件地址)。为了保持与标准惯例的一致性,签名从包含仅 "--" 的行开始,后面可选择空格,以换行符结束。
Vim 将以 ']'、'}'、'|'、'>' 或单词后跟 '>' 开头的行视为引用文本。但是,Vim 仅在文本以 '>' 引用(可选择后跟一个空格)时才突出显示引用文本中的标题和签名。
默认情况下,mail.vim 将语法同步到第一条显示行之前的 100 行。如果您使用的是速度较慢的机器,并且通常处理带有简短标题的电子邮件,您可以将其更改为较小的值
:let mail_minlines = 30

MAKE make.vim ft-make-syntax

在 makefile 中,命令通常被突出显示,以便您轻松发现错误。但是,这可能对您来说颜色过多。您可以使用以下方法关闭此功能
:let make_no_commands = 1
默认情况下,注释也被突出显示。您可以使用以下方法关闭此功能
:let make_no_comments = 1
Microsoft Makefile 以不同的方式处理变量扩展和注释(反斜杠不用于转义)。如果您看到任何错误的突出显示,可能是因为这种情况,您可以尝试以下操作
:let make_microsoft = 1

MAPLE maple.vim ft-maple-syntax

Maple V 由 Waterloo Maple Inc. 开发,支持符号代数。该语言支持许多函数包,用户可以选择性地加载这些包。用户可以选择突出显示 Maple V 版本 4 中提供的标准函数包集。用户可以在他们的 vimrc 文件中放置
:let mvpkg_all= 1
以突出显示所有包函数,或者用户可以选择任何子集,从下表中选择一个变量/包并将该变量设置为 1,同样在他们的 vimrc 文件中(在源 $VIMRUNTIME/syntax/syntax.vim 之前)。
Maple V 包函数选择器表
mv_DEtools         mv_genfunc        mv_networks        mv_process
mv_Galois         mv_geometry        mv_numapprox        mv_simplex
mv_GaussInt         mv_grobner        mv_numtheory        mv_stats
mv_LREtools         mv_group        mv_orthopoly        mv_student
mv_combinat         mv_inttrans        mv_padic        mv_sumtools
mv_combstruct mv_liesymm        mv_plots        mv_tensor
mv_difforms         mv_linalg        mv_plottools        mv_totorder
mv_finance         mv_logic        mv_powseries

MARKDOWN ft-markdown-syntax g:markdown_minlines

g:markdown_fenced_languages g:markdown_syntax_conceal
如果您有很长的区域,可能会出现错误的突出显示。以降低显示速度为代价,您可以让引擎向后查看更远以在区域的开头进行同步,例如 500 行(默认值为 50)
:let g:markdown_minlines = 500
如果您想在您的 markdown 文档中启用围栏代码块语法突出显示,您可以像这样启用
:let g:markdown_fenced_languages = ['html', 'python', 'bash=sh']
要禁用 markdown 语法隐藏,请将以下内容添加到您的 vimrc
:let g:markdown_syntax_conceal = 0

MATHEMATICA mma.vim ft-mma-syntax ft-mathematica-syntax

空的 *.m 文件将自动被认为是 Matlab 文件,除非您的 vimrc 中有以下内容
let filetype_m = "mma"

MEDIAWIKI ft-mediawiki-syntax

默认情况下,语法突出显示包括基本的 HTML 标签,如样式和标题 html.vim。对于严格的 Mediawiki 语法突出显示
let g:html_no_rendering = 1
如果需要 HTML 突出显示,可以通过以下方法进行基于终端的文本格式化(如粗体和斜体)
let g:html_style_rendering = 1

MODULA2 modula2.vim ft-modula2-syntax

Vim 将识别带有方言标签的注释,以自动选择给定的方言。
方言标签注释的语法为
taggedComment :=
  '(*!' dialectTag '*)'
  ;
dialectTag :=
  m2pim | m2iso | m2r10
  ;
reserved words
  m2pim = 'm2pim', m2iso = 'm2iso', m2r10 = 'm2r10'
如果方言标签注释出现在源文件的前 200 行中,则 Vim 会识别它。只识别第一个这样的注释,任何额外的方言标签注释都会被忽略。
示例
DEFINITION MODULE FooLib; (*!m2pim*)
...
变量 g:modula2_default_dialect 设置默认的 Modula-2 方言,当无法从 Modula-2 文件的内容中确定方言时:如果已定义并设置为 'm2pim',则默认方言为 PIM。
示例
let g:modula2_default_dialect = 'm2pim'
每个方言的突出显示可以通过以下变量进一步配置。
变量 高亮显示
modula2_iso_allow_lowline 允许标识符中出现下划线 modula2_iso_disallow_octals 不允许八进制整数文字 modula2_iso_disallow_synonyms 不允许 "@", "&" 和 "~" 同义词
modula2_pim_allow_lowline 允许标识符中出现下划线 modula2_pim_disallow_octals 不允许八进制整数文字 modula2_pim_disallow_synonyms 不允许 "&" 和 "~" 同义词
modula2_r10_allow_lowline 允许标识符中出现下划线
如果您在表达式内部使用 C 样式注释,并且发现它弄乱了您的突出显示,您可能需要使用扩展的(缓慢的!)C 样式注释匹配
:let moo_extended_cstyle_comments = 1
要禁用字符串内代词替换模式的突出显示
:let moo_no_pronoun_sub = 1
要禁用字符串内正则表达式运算符 '%|' 以及匹配 '%(' 和 '%)' 的突出显示
:let moo_no_regexp = 1
未匹配的双引号可以被识别并突出显示为错误
:let moo_unmatched_quotes = 1
要突出显示内置属性(.name、.location、.programmer 等)
:let moo_builtin_properties = 1
未知的内置函数可以被识别并突出显示为错误。如果您使用此选项,请将您自己的扩展添加到 mooKnownBuiltinFunction 组中。要启用此选项
:let moo_unknown_builtin_functions = 1
将 sprintf() 添加到已知内置函数列表中的示例
:syn keyword mooKnownBuiltinFunction sprintf contained

MSQL msql.vim ft-msql-syntax

msql 语法突出显示有两种选项。
如果您喜欢字符串内部的 SQL 语法突出显示,请使用此方法
:let msql_sql_query = 1
对于同步,minlines 默认值为 100。如果您更喜欢其他值,可以将 "msql_minlines" 设置为您想要的 value。示例
:let msql_minlines = 200

NEOMUTT neomutt.vim ft-neomuttrc-syntax ft-neomuttlog-syntax

要禁用默认的 NeoMutt 日志颜色
:let g:neolog_disable_default_colors = 1

N1QL n1ql.vim ft-n1ql-syntax

N1QL 是一种类似 SQL 的声明性语言,用于在 Couchbase Server 数据库中操作 JSON 文档。
Vim 语法高亮 N1QL 语句、关键字、运算符、类型、注释和特殊值。Vim 忽略 SQL 或其众多方言中特有的语法元素,例如 COLUMN 或 CHAR,这些元素在 N1QL 中不存在。
NCF 语法高亮有一个选项。
如果您希望将 ncf.vim 未识别的语句高亮显示为错误,请使用此选项。
:let ncf_highlight_unknowns = 1
如果您不希望高亮显示这些错误,请将其保留为未设置状态。
nroff 语法文件开箱即用地适用于 AT&T n/troff。您需要在使用语法文件中的 GNU groff 扩展功能之前激活它们。
例如,Linux 和 BSD 发行版使用 groff 作为默认的文本处理包。为了激活 groff 的扩展语法高亮功能,请安排将文件识别为 groff(参见 ft-groff-syntax)或在您的启动文件中添加以下选项。
:let nroff_is_groff = 1
Groff 与您可能仍在 Solaris 中找到的旧版 AT&T n/troff 不同。Groff 宏和请求名称可以超过 2 个字符,并且语言原语的扩展。例如,在 AT&T troff 中,您可以使用请求 \(yr 访问年份作为两位数。在 groff 中,您可以使用相同的请求(为了兼容性而被识别),或者可以使用 groff 的原生语法 \[yr]。此外,您可以直接使用四位数的年份:\[year]。宏请求可以超过 2 个字符,例如,GNU mm 接受请求 ".VERBON" 和 ".VERBOFF" 用于创建逐字环境。
为了获得 g/troff 可以提供的格式最优的输出,您应该遵循关于间距和标点的几个简单规则。
1. 不要在行尾留空空格。
2. 在句末句号、感叹号等之后只留一个空格。
3. 出于下面陈述的原因,最好在所有句号之后加上回车。
这些不寻常技巧背后的原因是 g/n/troff 有一个换行算法,如果您不遵循上面给出的规则,很容易被打乱。
与 TeX 不同,troff 逐行填充文本,而不是逐段填充文本,而且它没有胶水或拉伸的概念,所有输入的水平和垂直空间将原样输出。
因此,您应该注意不要在句子之间使用比您最终文档中想要的更多的空格。出于这个原因,常见的做法是在所有标点符号之后立即插入回车。如果您想在最终处理后的输出中获得 "均匀" 的文本,您需要在输入文本中保持规则的间距。为了将尾随空格和标点符号之后的两个或多个空格标记为错误,请使用以下命令。
:let nroff_space_errors = 1
另一种检测额外间距和其他错误的技术是定义一个醒目的语法组 "nroffDefinition" 和 "nroffDefSpecial" 的高亮定义,这些错误会干扰文件的正确排版。例如
hi def nroffDefinition cterm=italic gui=reverse
hi def nroffDefSpecial cterm=italic,bold gui=reverse,bold
如果您希望像使用节标记一样轻松地在源文件中的预处理器条目之间导航,您可以在您的 vimrc 文件中激活以下选项。
let b:preprocs_as_sections = 1
此外,语法文件为 ms 包中的扩展段落宏 (.XP) 添加了一个额外的段落标记。
最后,还有一个 groff.vim 语法文件,可以用于在文件基础上或默认情况下全局启用 groff 语法高亮。
OCaml 语法文件处理具有以下前缀的文件:.ml、.mli、.mll 和 .mly。通过设置以下变量
:let ocaml_revised = 1
您可以从标准的 OCaml 语法切换到 camlp4 预处理器支持的修订语法。设置变量
:let ocaml_noend_error = 1
防止将 "end" 高亮显示为错误,这在源代码包含 Vim 无法再同步的非常长的结构时很有用。
默认情况下,markdown 文件将被检测为文件类型 "markdown"。或者,您可能希望将它们检测为文件类型 "pandoc"。为此,请设置 g:filetype_md 变量
:let g:filetype_md = 'pandoc'
pandoc 语法插件使用 conceal 进行漂亮的高亮。默认值为 1
:let g:pandoc#syntax#conceal#use = 1
要指定不应隐藏的元素,请设置以下变量
:let g:pandoc#syntax#conceal#blacklist = []
以下是可以在此处使用的规则列表
titleblock
image
block
subscript
superscript
strikeout
atx
codeblock_start
codeblock_delim
footnote
definition
list
newline
dashes
ellipses
quotes
inlinecode
inlinemath
您可以自定义隐藏的工作方式。例如,如果您更喜欢使用 * 符号来标记脚注
:let g:pandoc#syntax#conceal#cchar_overrides = {"footnote" : "*"}
要隐藏链接中的 URL,请使用
:let g:pandoc#syntax#conceal#urls = 1
防止突出显示特定代码块类型,以便它们保持正常。代码块类型包括 "definition"(定义块内的代码块)和 "delimited"(分隔的代码块)。默认值 = []
:let g:pandoc#syntax#codeblocks#ignore = ['definition']
为指定语言的定界代码块使用嵌入式高亮。默认值 = 1
:let g:pandoc#syntax#codeblocks#embeds#use = 1
指定要突出显示嵌入内容的语言及其语法文件。这是一个语言名称列表。当 pandoc 和 vim 使用的语言不匹配时,您可以使用 "PANDOC=VIM" 语法。例如
:let g:pandoc#syntax#codeblocks#embeds#langs = ["ruby", "bash=sh"]
在强调中使用斜体和粗体。默认值 = 1
:let g:pandoc#syntax#style#emphases = 1
"0" 将 "block" 添加到 g:pandoc#syntax#conceal#blacklist,因为否则您将无法分辨样式应用的位置。
添加下划线、下标、上标和删除线文本样式。默认值 = 1
:let g:pandoc#syntax#style#underline_special = 1
检测和突出显示定义列表。禁用此功能可以提高性能。默认值 = 1(即默认情况下启用)
:let g:pandoc#syntax#style#use_definition_lists = 1
pandoc 语法脚本还附带以下命令
:PandocHighlight LANG
为代码块中的语言 LANG 启用嵌入式高亮。使用 g:pandoc#syntax#codeblocks#embeds#langs 中项的语法。
:PandocUnhighlight LANG
禁用代码块中语言 LANG 的嵌入式高亮。
PApp 语法文件处理 .papp 文件,以及在较小程度上处理 .pxml 和 .pxsl 文件,这些文件都是使用 xml 作为顶层文件格式的 perl/xml/html/other 的混合。默认情况下,所有 phtml 或 pxml 部分内的内容都被视为带有嵌入式预处理器命令的字符串。如果在启动文件中设置变量
:let papp_include_html=1
它将尝试对 phtml 部分内的 html 代码进行语法高亮,但这比较慢,而且颜色过多,无法进行明智的编辑。;)
papp.vim 语法文件的最新版本通常可以在 http://papp.plan9.de 找到。
与 "*.p" 匹配的文件可能是 Progress 或 Pascal,与 "*.pp" 匹配的文件可能是 Puppet 或 Pascal。如果自动检测不适合您,或者您只编辑 Pascal 文件,请在您的启动 vimrc 中使用以下命令。
:let filetype_p  = "pascal"
:let filetype_pp = "pascal"
Pascal 语法文件已扩展,以考虑 Turbo Pascal、Free Pascal Compiler 和 GNU Pascal Compiler 提供的一些扩展。Delphi 关键字也受支持。默认情况下,启用 Turbo Pascal 7.0 功能。如果您希望坚持使用标准的 Pascal 关键字,请在您的启动文件中添加以下行
:let pascal_traditional=1
要打开 Delphi 特定的结构(例如单行注释、关键字等)
:let pascal_delphi=1
选项 pascal_symbol_operator 控制是否使用运算符颜色显示符号运算符(例如 +、*、.. 等)。要对符号运算符进行着色,请在您的启动文件中添加以下行
:let pascal_symbol_operator=1
默认情况下,一些函数被高亮显示。要关闭它
:let pascal_no_functions=1
此外,还有一些特定于编译器的变量。除了 pascal_delphi 之外,还有 pascal_gpc 和 pascal_fpc。默认扩展名尝试匹配 Turbo Pascal。
:let pascal_gpc=1
:let pascal_fpc=1
要确保字符串在单行上定义,您可以定义 pascal_one_line_string 变量。
:let pascal_one_line_string=1
如果您不喜欢 <Tab> 字符,您可以设置 pascal_no_tabs 变量。制表符将被高亮显示为错误。
:let pascal_no_tabs=1

PERL perl.vim ft-perl-syntax

perl 语法高亮有许多可能的选项。
内联 POD 高亮现在默认情况下已开启。如果您不希望在 Perl 文件中嵌入的 POD 高亮带来的额外复杂性,可以将 'perl_include_pod' 选项设置为 0
:let perl_include_pod = 0
为了降低解析的复杂性(并提高性能),您可以关闭变量名称和内容解析中的两个元素。要以与名称的其余部分不同的方式处理变量和函数名称中的包引用(例如 '$PkgName::' 在 '$PkgName::VarName' 中)
:let perl_no_scope_in_variables = 1
(在 Vim 6.x 中,情况正好相反:"perl_want_scope_in_variables" 启用了它。)
如果您不想解析像 @{${"foo"}} 这样的复杂内容
:let perl_no_extended_vars = 1
(在 Vim 6.x 中,情况正好相反:"perl_extended_vars" 启用了它。)
着色字符串可以更改。默认情况下,字符串和 qq 朋友将像第一行一样高亮显示。如果您设置变量 perl_string_as_statement,它将像第二行一样高亮显示。
"hello world!"; qq|hello world|; ^^^^^^^^^^^^^^NN^^^^^^^^^^^^^^^N (unlet perl_string_as_statement) S^^^^^^^^^^^^SNNSSS^^^^^^^^^^^SN (let perl_string_as_statement)
(^ = perlString,S = perlStatement,N = 根本没有)
同步有 3 个选项。前两个关闭了一些同步触发,只有在同步无法正常工作的情况下才需要。如果在滚动时,突然整个屏幕的颜色完全改变,那么您应该尝试关闭其中一个。如果您能找出导致错误的行,请让开发人员知道。
一个触发 "^\s*sub\s*",另一个触发 "^[$@%]" 等等。
:let perl_no_sync_on_sub
:let perl_no_sync_on_global_var
在下面,您可以设置 VIM 在语法高亮中尝试寻找起点时的最大距离。
:let perl_sync_dist = 100
如果您想使用 perl 进行折叠,请设置 perl_fold
:let perl_fold = 1
如果您还想折叠 if 语句等中的代码块,请设置以下选项
:let perl_fold_blocks = 1
如果设置了 'perl_fold',则默认情况下子例程会折叠。如果您不希望这样做,可以设置 'perl_nofold_subs'
:let perl_nofold_subs = 1
默认情况下,匿名子例程不会折叠;您可以通过 'perl_fold_anonymous_subs' 启用它们的折叠
:let perl_fold_anonymous_subs = 1
如果设置了 'perl_fold',则默认情况下包也会折叠。要禁用此行为,请设置 'perl_nofold_packages'
:let perl_nofold_packages = 1
PHP3 和 PHP4 php.vim php3.vim ft-php-syntax ft-php3-syntax
[注意: 以前这称为 "php3",但由于它现在也支持 php4,因此已重命名为 "php"]
php 语法高亮有以下选项。
如果您喜欢字符串内的 SQL 语法高亮
let php_sql_query = 1
用于高亮显示 Baselib 方法
let php_baselib = 1
在字符串内启用 HTML 语法高亮
let php_htmlInStrings = 1
使用旧的颜色风格
let php_oldStyle = 1
启用突出显示 ASP 风格的简短标签
let php_asp_tags = 1
禁用简短标签
let php_noShortTags = 1
用于突出显示父错误 ] 或 )
let php_parent_error_close = 1
用于跳过 php 结束标签,如果存在一个未关闭的 ( 或 [
let php_parent_error_open = 1
启用类和函数的折叠
let php_folding = 1
选择同步方法
let php_sync_method = x
x = -1 表示通过搜索同步(默认),x > 0 表示至少同步 x 行向后,x = 0 表示从开头同步。
TeX 是一种排版语言,plaintex 是 TeX 的 "plain" 变体的文件类型。如果您不想让您的 *.tex 文件被识别为 plain TeX,请参阅 ft-tex-plugin
此语法文件具有以下选项
let g:plaintex_delimiters = 1
如果您想突出显示方括号 "[]" 和花括号 "{}"。
PPWizard 是 HTML 和 OS/2 INF 文件的预处理器
此语法文件具有以下选项
ppwiz_highlight_defs : 确定 PPWizard 定义的突出显示模式。可能的取值是
ppwiz_highlight_defs = 1 : PPWizard #define 语句保留其内容的颜色(例如 PPWizard 宏和变量)。
ppwiz_highlight_defs = 2 : 预处理器 #define 和 #evaluate 语句以单一颜色显示,行延续符号除外。
ppwiz_highlight_defs 的默认设置为 1。
ppwiz_with_html : 如果值为 1(默认),则突出显示文字 HTML 代码;如果为 0,则将 HTML 代码视为普通文本。
phtml 语法高亮有两个选项。
如果您喜欢字符串内部的 SQL 语法突出显示,请使用此方法
:let phtml_sql_query = 1
对于同步,minlines 默认值为 100。如果您喜欢其他值,可以将 "phtml_minlines" 设置为您想要的数值。示例
:let phtml_minlines = 200

POSTSCRIPT postscr.vim ft-postscr-syntax

在突出显示 PostScript 时,有几个选项。
首先是选择要突出显示的 PostScript 语言版本。目前定义了三个语言版本,或级别。级别 1 是原始版本和基本版本,包括在发布级别 2 之前的所有扩展。级别 2 是最常见的版本,包括其自己的扩展,在发布级别 3 之前。级别 3 当前是最高支持的级别。您可以通过定义 postscr_level 变量来选择要突出显示的 PostScript 语言级别,如下所示
:let postscr_level=2
如果未定义此变量,则默认为 2(级别 2),因为这是当前最流行的版本。
注意: 并非所有 PS 解释器都支持特定语言级别的所有语言功能。特别是 PS 文件开头的 %!PS-Adobe-3.0 并不意味着 PostScript 属于级别 3 PostScript!
如果您使用的是 Display PostScript,可以通过定义 postscr_display 变量来包含 Display PS 语言功能的突出显示,如下所示
:let postscr_display=1
如果您使用的是 Ghostscript,可以通过定义变量 postscr_ghostscript 来包含 Ghostscript 特定语言功能的突出显示,如下所示
:let postscr_ghostscript=1
PostScript 是一门大型语言,具有许多预定义元素。虽然突出显示所有这些元素很有用,但在较慢的机器上这会导致 Vim 速度变慢。为了提高机器性能,默认情况下不会突出显示字体名称和字符编码。除非您明确使用这两个功能,否则这样做应该没问题。如果您想突出显示它们,应该设置以下一个或两个变量
:let postscr_fonts=1
:let postscr_encodings=1
对 and、or 和 not 的突出显示有一个样式选项。在 PostScript 中,这些运算符的功能取决于其操作数的类型 - 如果操作数是布尔值,则它们是逻辑运算符,如果操作数是整数,则它们是二进制运算符。由于二进制运算符和逻辑运算符可以以不同的方式突出显示,因此必须以某种方式突出显示它们。默认情况下,它们被视为逻辑运算符。可以通过定义变量 postscr_andornot_binary 来将它们突出显示为二进制运算符,如下所示
:let postscr_andornot_binary=1
此语法文件适用于 printcap 和 termcap 数据库。
为了让 Vim 识别与模式 printcaptermcap 不匹配的 printcap/termcap 文件,您必须在您的 myfiletypefile 文件中添加适合您的系统的其他模式。对于这些模式,您必须将变量 "b:ptcap_type" 设置为 "print" 或 "term",然后将 'filetype' 选项设置为 ptcap。
例如,要让 Vim 将 /etc/termcaps/ 中的所有文件识别为 termcap 文件,请添加以下内容
:au BufNewFile,BufRead /etc/termcaps/* let b:ptcap_type = "term" |
                                    \ set filetype=ptcap
如果您在向后滚动时注意到突出显示错误,而这些错误在使用 CTRL-L 重新绘制时得到修复,请尝试将 "ptcap_minlines" 内部变量设置为更大的值
:let ptcap_minlines = 50
(默认值为 20 行。)
与 "*.w" 匹配的文件可能是 Progress 或 cweb。如果自动检测对您不起作用,或者您根本不编辑 cweb,请在您的启动 vimrc 中使用以下命令
:let filetype_w = "progress"
对于 "*.i" 也会发生同样的情况,它可能是汇编,而 "*.p" 可能是 Pascal。如果您不使用汇编和 Pascal,请使用以下命令
:let filetype_i = "progress"
:let filetype_p = "progress"

PYTHON python.vim ft-python-syntax

有六个选项可以控制 Python 语法高亮。
对于突出显示的数字
:let python_no_number_highlight = 1
对于突出显示的内置函数
:let python_no_builtin_highlight = 1
对于突出显示的标准异常
:let python_no_exception_highlight = 1
对于突出显示的 doctests 和内部代码
:let python_no_doctest_highlight = 1
:let python_no_doctest_code_highlight = 1
第一个选项意味着第二个选项。
对于突出显示的尾部空白和空格和制表符的混合
:let python_space_error_highlight = 1
如果您想要所有可能的 Python 突出显示
:let python_highlight_all = 1
这与设置 python_space_error_highlight 并取消设置所有其他选项的效果相同。
如果您使用的是 Python 2 或跨代码(Python 2 和 3 兼容),您可以强制使用旧的语法文件,该文件支持 Python 2 以及 Python 3.5。
:let python_use_python2_syntax = 1
此选项将排除所有现代的 Python 3.6 或更高版本的功能。
注意: 只有这些选项的存在很重要,它们的数值无关紧要。您可以在上面的 1 中替换任何值。
Quake 语法定义应该适用于大多数基于 Quake 引擎的 FPS(第一人称射击)游戏。但是,命令名称在三款游戏(Quake、Quake 2 和 Quake 3 Arena)之间略有不同,因此语法定义会检查三个全局变量的存在,以允许用户指定哪些命令在他们的文件中是合法的。这三个变量可以设置为实现以下效果
设置为仅突出显示 Quake 中可用的命令
:let quake_is_quake1 = 1
设置为仅突出显示 Quake 2 中可用的命令
:let quake_is_quake2 = 1
设置为仅突出显示 Quake 3 Arena 中可用的命令
:let quake_is_quake3 = 1
这三个变量的任何组合都是合法的,但可能会突出显示比游戏实际提供的更多的命令。
用于语法高亮的 R 代码解析从 40 行之前开始,但您可以在您的 vimrc 中设置不同的值。示例
let r_syntax_minlines = 60
您也可以关闭 ROxygen 的语法高亮
let r_syntax_hl_roxygen = 0
启用以圆括号、方括号和花括号分隔的代码的折叠
let r_syntax_folding = 1
并将所有以开括号结尾的关键字突出显示为函数
let r_syntax_fun_pattern = 1
R MARKDOWN rmd.vim ft-rmd-syntax
要禁用 YAML 标题的语法高亮,请在您的 vimrc 中添加以下内容
let rmd_syn_hl_yaml = 0
要禁用引文键的语法高亮
let rmd_syn_hl_citations = 0
要高亮显示 knitr 块标题中的 R 代码
let rmd_syn_hl_chunk = 1
默认情况下,R 代码块将根据 R 语言规则进行高亮显示。此外,每当保存缓冲区时,Vim 都会扫描缓冲区并高亮显示新块中存在的其他语言。LaTeX 代码在保存缓冲区时也会自动识别和高亮显示。此行为可以通过变量 rmd_dynamic_fenced_languagesrmd_include_latex 来控制,它们的值可以是
let rmd_dynamic_fenced_languages = 0 " No autodetection of languages
let rmd_dynamic_fenced_languages = 1 " Autodetection of languages
let rmd_include_latex = 0 " Don't highlight LaTeX code
let rmd_include_latex = 1 " Autodetect LaTeX code
let rmd_include_latex = 2 " Always include LaTeX highlighting
如果 rmd_dynamic_fenced_languages 的值为 0,您仍然可以设置应正确高亮显示其代码块的语言列表,如示例所示
let rmd_fenced_languages = ['r', 'python']
R RESTRUCTURED TEXT rrst.vim ft-rrst-syntax
要高亮显示 knitr 块标题中的 R 代码,请在您的 vimrc 中添加以下内容
let rrst_syn_hl_chunk = 1

RASI rasi.vim ft-rasi-syntax

Rasi 代表 Rofi Advanced Style Information。它由程序 rofi 用于设置搜索窗口渲染的样式。该语言主要受 CSS 样式表的启发。具有以下扩展名的文件被识别为 rasi 文件:.rasi。
readline 库主要用于 BASH shell,它在已有的命令和选项的基础上添加了相当多的命令和选项。要高亮显示这些项目,您可以在您的 vimrc 中添加以下内容,或者在加载使用 readline 语法的文件之前在命令行中输入以下内容
let readline_has_bash = 1
这将为 BASH(版本 2.05a 及更高版本,以及部分早期版本)添加的命令添加高亮显示。
Rego 是一种由 Styra 开发的查询语言。它主要用作 kubernetes 的策略语言,但可以应用于几乎任何东西。具有以下扩展名的文件被识别为 rego 文件:.rego。

RESTRUCTURED TEXT rst.vim ft-rst-syntax

文档中的代码块启用了语法高亮显示,适用于一些文件类型。请参阅 $VIMRUNTIME/syntax/rst.vim 以了解默认语法列表。
要设置用户定义的代码块语法高亮显示列表
let rst_syntax_code_list = ['vim', 'lisp', ...]
要将多个代码块类型分配给单个语法,请将 rst_syntax_code_list 定义为映射
let rst_syntax_code_list = {
        \ 'cpp': ['cpp', 'c++'],
        \ 'bash': ['bash', 'sh'],
        ...
\ }
要使用颜色高亮显示强调文本
let rst_use_emphasis_colors = 1
要启用节的折叠
let rst_fold_enabled = 1
请注意,折叠可能会导致某些平台上的性能问题。
如果您在向后滚动时注意到突出显示错误,而这些错误在使用 CTRL-L 重新绘制时得到修复,请尝试将 "rexx_minlines" 内部变量设置为更大的值
:let rexx_minlines = 50
这将使语法同步在第一行显示行之前开始 50 行。 默认值为 10。 使用更大的数字的缺点是重新绘制可能会变慢。
Vim 试图猜测 ".r" 文件的类型。如果无法检测到(从注释行),默认值为 "r"。要将默认值更改为 rexx,请将以下行添加到您的 vimrc:g:filetype_r
:let g:filetype_r = "r"

RUBY ruby.vim ft-ruby-syntax

Ruby: 运算符高亮显示 ruby_operators Ruby: 空格错误 ruby_space_errors Ruby: 折叠 ruby_fold ruby_foldable_groups Ruby: 减少昂贵的操作 ruby_no_expensive ruby_minlines Ruby: 拼写检查字符串 ruby_spellcheck_strings
ruby_operators
Ruby: 运算符高亮显示
可以通过定义 "ruby_operators" 来高亮显示运算符。
:let ruby_operators = 1
ruby_space_errors
Ruby: 空格错误
可以通过定义 "ruby_space_errors" 来高亮显示空格错误。
:let ruby_space_errors = 1
这将高亮显示尾随空格和以空格字符开头的制表符作为错误。可以通过定义 "ruby_no_trail_space_error" 和 "ruby_no_tab_space_error" 来细化,分别忽略尾随空格和空格后的制表符。
可以通过定义 "ruby_fold" 来启用折叠。
:let ruby_fold = 1
这将把当前缓冲区或窗口的 'foldmethod' 值局部设置为 "syntax",这将在编辑 Ruby 文件类型时启用基于语法的折叠。
默认折叠相当详细,例如,小的语法单元(如 "if"、"do"、"%w[]")可能会创建相应的折叠级别。
您可以设置 "ruby_foldable_groups" 来限制哪些组是可折叠的。
:let ruby_foldable_groups = 'if case %'
该值是一个用空格分隔的关键字列表。
关键字含义
-------- -------------------------------------
ALL 大多数块语法(默认) NONE 如果 "if" 或 "unless" 块 def "def" 块 class "class" 块 module "module" 块 do "do" 块 begin "begin" 块 case "case" 块 for "for"、"while"、"until" 循环 { 花括号块或哈希字面量 [ 数组字面量 % 带 "%" 符号的字面量,例如:%w(STRING)、%!STRING! / 正则表达式字符串 字符串和 shell 命令输出(用 '、" 括起来) : 符号 # 多行注释 << 这里文档 __END__ "__END__" 指令后的源代码
ruby_no_expensive
Ruby: 减少昂贵的操作
默认情况下,"end" 关键字的颜色会根据其关闭的块的开头语句进行着色。虽然有用,但此功能可能会很昂贵;如果您遇到缓慢的重绘(或您使用的是颜色支持较差的终端),您可能希望通过定义 "ruby_no_expensive" 变量来关闭它。
:let ruby_no_expensive = 1
在这种情况下,所有控制关键字将使用相同的颜色。
如果您确实希望启用此功能,但注意到在向后滚动时高亮显示错误,这些错误在使用 CTRL-L 重新绘制时已修复,请尝试将 "ruby_minlines" 变量设置为大于 50 的值。
:let ruby_minlines = 100
理想情况下,此值应是一个足够大的行数,以包含您最大的类或模块。
ruby_spellcheck_strings
Ruby: 拼写检查字符串
如果您定义 "ruby_spellcheck_strings",Ruby 语法将执行对字符串的拼写检查。
:let ruby_spellcheck_strings = 1
默认情况下,只有 R7RS 关键字会被高亮显示并正确缩进。
scheme.vim 还支持 CHICKEN Scheme->C 编译器的扩展。如果您需要它们,请定义 b:is_chicken 或 g:is_chicken。
SDL 高亮显示可能遗漏了一些关键字,但 SDL 有太多关键字,几乎不可能处理。
新的标准 SDL-2000 规定所有标识符区分大小写(以前并非如此),并且所有关键字都可以使用全部小写或全部大写。要让高亮显示反映这一点,您可以设置以下变量。
:let sdl_2000=1
这也设置了许多新关键字。如果您想禁用旧关键字(这可能是个好主意),请使用
:let SDL_no_96=1
缩进可能也不完整,但我现在对自己的项目来说很满意。
要使制表符与普通空格区分开来(通过在制表符上使用 Todo 高亮显示实现),请通过在 vimrc 文件中添加以下内容来定义 "g:sed_highlight_tabs"。
:let g:sed_highlight_tabs = 1
(此特殊高亮显示仅适用于搜索模式、替换文本、地址或由追加/更改/插入命令包含的文本内的制表符。)如果您启用此选项,最好将制表符宽度设置为一个字符;通过这样做,您可以轻松地计算字符串中的制表符数量。
GNU sed 允许在同一行的文本后添加注释。BSD sed 仅允许在 "#" 是行首字符的位置添加注释。要强制执行 BSD 风格的注释,即标记行尾注释作为错误,请使用
:let g:sed_dialect = "bsd"
请注意,GNU sed 和 BSD sed 之间存在其他差异,这些差异目前不受此设置的影响。
错误
转换命令 (y) 的处理方式与替换命令完全相同。这意味着就该语法文件而言,转换接受与替换相同的标志,这是错误的。(转换不接受任何标志。)我容忍这个错误,因为相关的命令需要非常复杂的处理(95 个模式,每个模式对应一个可能的模式分隔符)。
SGML 文件中标签的着色方案如下所示。
开始标签的 <> 与结束标签的 </> 的颜色不同。这是故意的!对于开始标签,将使用 'Function' 颜色,而对于结束标签,将使用 'Type' 颜色(参见 syntax.vim 以检查这些颜色在您的环境中是如何定义的)。
已知的标签名称将与 C 中的语句使用相同的颜色。未知的标签名称不会被着色,这使得很容易发现错误。
请注意,参数(或属性)名称也是如此。已知的属性名称的颜色与未知的属性名称的颜色不同。
一些 SGML 标签用于更改文本的呈现方式。以下标签被 sgml.vim 语法着色文件识别,并更改普通文本的显示方式:<varname> <emphasis> <command> <function> <literal> <replaceable> <ulink><link>
如果您想更改此类文本的呈现方式,您必须重新定义以下语法组
sgmlBold
sgmlBoldItalic
sgmlUnderline
sgmlItalic
sgmlLink 用于链接
要使此重新定义生效,您必须重新定义所有这些变量,并在您的 vimrc 中定义以下变量(这是由于文件在初始化期间读取的顺序造成的)。
let sgml_my_rendering=1
您也可以通过在您的 vimrc 文件中添加以下行来禁用此渲染
let sgml_no_rendering=1
(改编自 Claudio Fleiner <[email protected]> 的 html.vim 帮助文本)
这涵盖了对旧的 Unix (Bourne) sh 和新的 shell(如 bash、dash、posix 和 Korn shell)的语法高亮显示。
Vim 尝试通过指定各种文件名是特定类型的来确定正在使用的 shell 类型,例如:
ksh : .kshrc* *.ksh
bash: .bashrc* bashrc bash.bashrc .bash_profile* *.bash
有关模式的完整列表,请参见 $VIMRUNTIME/filetype.vim。如果以上任何一种情况都不适用,则会检查文件的首行(例如,查找 /bin/sh /bin/ksh /bin/bash)。如果首行指定了 shell 类型,则使用该 shell 类型。但是,某些文件(例如 .profile)已知是 shell 文件,但类型不明显。此外,在许多系统上,sh 符号链接到 "bash"(Linux、Windows+cygwin)或 "ksh"(Posix)。
可以通过在您的 vimrc 中实例化以下变量之一来指定全局默认值。
ksh
let g:is_kornshell = 1
posix:(使用此选项与将 g:is_kornshell 设置为 1 几乎相同)
let g:is_posix     = 1
bash
let g:is_bash           = 1
sh:(默认)Bourne shell
let g:is_sh           = 1
(dash 用户应使用 posix)
如果没有 "#! ..." 行,并且用户尚未使用如上所示的默认 sh.vim 语法设置,则 syntax/sh.vim 将假定 Bourne shell 语法。请不要在错误报告中引用 RFC 或市场渗透统计数据 - 只需选择系统使用的 sh 的默认版本并在您的 <.vimrc> 中安装相关的 "let..."。
syntax/sh.vim 文件提供了几种基于语法的折叠级别。
let g:sh_fold_enabled= 0     (default, no syntax folding)
let g:sh_fold_enabled= 1     (enable function folding)
let g:sh_fold_enabled= 2     (enable heredoc folding)
let g:sh_fold_enabled= 4     (enable if/do/for folding)
然后各种语法项(即 HereDocuments 和函数体)变得可以语法折叠(参见 :syn-fold)。您也可以将它们加在一起以获得多种类型的折叠。
let g:sh_fold_enabled= 3     (enables function and heredoc folding)
如果您注意到在向后滚动时高亮显示错误,这些错误在使用 CTRL-L 重新绘制时已修复,请尝试将 "sh_minlines" 内部变量设置为更大的数字。例如
let sh_minlines = 500
这将使语法同步从第一条显示行之前 500 行开始。默认值为 200。使用较大数字的缺点是重新绘制可能会变慢。
如果您没有太多内容需要同步,显示可能会非常慢。为了减少这种情况,可以设置 "sh_maxlines" 内部变量。例如
let sh_maxlines = 100
默认情况下使用两倍的 sh_minlines。将其设置为较小的数字可以加快显示速度。缺点是可能会出现高亮显示错误。
syntax/sh.vim 试图将某些问题标记为错误;通常是诸如不匹配的 "]"、"done"、"fi" 等。如果您发现错误处理对您来说有问题,您可以通过在 .vimrc 中添加以下行来抑制此类错误高亮显示。
let g:sh_no_error= 1
sh-embed sh-awk Sh: 嵌入语言~
您可能希望将语言嵌入到 sh 中。我将举例说明如何使用 awk 作为示例来完成此操作,该示例由 Lorance Stinson 提供。将以下文件放入 $HOME/.config/nvim/after/syntax/sh/awkembed.vim 中。
" AWK Embedding:
" ==============
" Shamelessly ripped from aspperl.vim by Aaron Hope.
if exists("b:current_syntax")
  unlet b:current_syntax
endif
syn include @AWKScript syntax/awk.vim
syn region AWKScriptCode matchgroup=AWKCommand start=+[=\\]\@<!'+ skip=+\\'+ end=+'+ contains=@AWKScript contained
syn region AWKScriptEmbedded matchgroup=AWKCommand start=+\<awk\>+ skip=+\\$+ end=+[=\\]\@<!'+me=e-1 contains=@shIdList,@shExprList2 nextgroup=AWKScriptCode
syn cluster shCommandSubList add=AWKScriptEmbedded
hi def link AWKCommand Type
然后,这段代码将允许单引号中的 awk 代码
awk '...awk code here...'
使用 awk 高亮显示语法进行高亮显示。显然,这可以扩展到其他语言。

SPEEDUP spup.vim ft-spup-syntax

(AspenTech 工厂模拟器)
Speedup 语法文件有一些选项
strict_subsections: 如果定义了此变量,则只有部分和子部分的关键字才会被高亮显示为语句,而不会高亮显示其他关键字(例如 OPERATION 部分中的 WITHIN)。
highlight_types: 定义此变量会导致诸如温度或压力的流类型被高亮显示为 Type,而不是简单的 Identifier。包含通常在 DECLARE 部分中找到的类型;如果您定义了自己的类型,则必须将它们包含在语法文件中。
oneline_comments: 此值介于 1 到 3 之间,并确定 # 风格注释的高亮显示。
oneline_comments = 1: 允许在偶数个 # 后面的普通 Speedup 代码。
oneline_comments = 2: 将以第二个 # 开头的代码显示为错误。这是默认设置。
oneline_comments = 3: 如果一行包含多个 #,则将整行显示为错误。
特别是由于变量 PRESETting,OPERATION 部分往往会变得非常大,同步可能至关重要。如果您的计算机足够快,您可以在语法文件末尾增加 minlines 和/或 maxlines。
虽然 SQL 存在 ANSI 标准,但大多数数据库引擎都会添加自己的自定义扩展。Vim 目前支持 Oracle 和 Informix 的 SQL 方言。默认情况下,Vim 假设 "*.sql" 文件是 Oracle SQL。
Vim 目前通过语法脚本为各种不同的供应商提供 SQL 支持。您可以将 Vim 的默认值从 Oracle 更改为任何当前支持的 SQL 类型。您也可以轻松地更改缓冲区的基础上使用的 SQL 方言。
有关更详细的说明,请参阅 ft_sql.txt
Squirrel 是一种高级命令式、面向对象的编程语言,旨在成为一种轻量级脚本语言,适合视频游戏等应用程序的大小、内存带宽和实时需求。以下扩展名的文件被识别为 squirrel 文件:.nut。
这涵盖了名为“tcsh”的 shell。它是 csh 的超集。有关如何检测文件类型的说明,请参见 csh.vim
除非设置了“backslash_quote”shell 变量,否则 Tcsh 不允许字符串中的 \"。如果您希望 VIM 假设不存在反斜杠引号结构,请将此行添加到您的 vimrc 中
:let tcsh_backslash_quote = 0
如果您在向后滚动时注意到突出显示错误,这些错误在使用 CTRL-L 重新绘制时会修复,请尝试将“tcsh_minlines”内部变量设置为更大的数字
:let tcsh_minlines = 1000
这将使语法同步从第一个显示行之前的 1000 行开始。如果您将“tcsh_minlines”设置为“fromstart”,则同步将从文件开头完成。tcsh_minlines 的默认值为 100。使用更大数字的缺点是重新绘制可能会变得缓慢。
Tex 内容~ Tex:想要语法折叠?tex-folding Tex:不要拼写检查g:tex_nospell Tex:不想在注释中拼写检查?tex-nospell Tex:想要在逐字区域拼写检查?tex-verb Tex:连续注释或数学区域tex-runon Tex:语法突出显示速度慢?tex-slow Tex:想要突出显示更多命令?tex-morecommands Tex:过多的错误突出显示?tex-error Tex:需要新的数学组?tex-math Tex:开始新的样式?tex-style Tex:利用隐藏模式tex-conceal Tex:选择性隐藏模式g:tex_conceal Tex:控制 iskeywordg:tex_isk Tex:精细的下标和上标控制tex-supersub Tex:匹配检查控制tex-matchcheck
tex-folding g:tex_fold_enabled
Tex:想要语法折叠?
从 <syntax/tex.vim> 的版本 28 开始,支持基于语法的部分、章节、节、小节等的折叠。将
let g:tex_fold_enabled=1
放在您的 vimrc 中,并使用 :set fdm=syntax。我建议通过 LaTeX 文件末尾的模式行执行后者
% vim: fdm=syntax
如果您的系统变得太慢,您可能希望查看
https://vimhelp.org/vim_faq.txt.html#faq-29.7
g:tex_nospell
Tex:不需要拼写检查~
如果您不想在 LaTeX 文档中的任何位置进行拼写检查,请将
let g:tex_nospell=1
放在您的 vimrc 中。如果您只想抑制注释内的拼写检查,请参见 g:tex_comment_nospell
tex-nospell g:tex_comment_nospell
Tex:不想在注释中拼写检查?
有些人喜欢在注释中包含源代码等内容,因此他们希望在 LaTeX 文件的注释中禁用拼写检查。为此,请将以下内容放在您的 vimrc 中
let g:tex_comment_nospell= 1
如果您想在 LaTeX 文档中的任何地方都抑制拼写检查,请参见 g:tex_nospell
tex-verb g:tex_verbspell Tex:想要在逐字区域拼写检查?~
通常,逐字区域用于源代码等内容;很少有人希望对源代码进行拼写检查。但是,对于那些希望对逐字区域进行拼写检查的人来说,请将以下内容放在您的 vimrc 中
let g:tex_verbspell= 1
tex-runon tex-stopzone
Tex:连续注释或数学区域
<syntax/tex.vim> 突出显示支持 TeX、LaTeX 和一些 AmsTeX。突出显示支持三个主要区域/区域:普通、texZone 和 texMathZone。虽然已经做出了相当大的努力来使这些区域正常终止,但由 $..$ 和 $$..$$ 分隔的区域无法同步,因为开始模式和结束模式之间没有区别。因此,提供了一个特殊的“TeX 注释”
%stopzone
它将强制终止 texZone 或 texMathZone 的突出显示。
tex-slow tex-sync
Tex:语法突出显示速度慢?
如果您有一台速度慢的计算机,您可能希望减少以下值
:syn sync maxlines=200
:syn sync minlines=50
(尤其是后者)。如果您的计算机速度很快,您可能希望增加它们。这主要影响同步(即屏幕顶部文本应该属于哪个组,如果有的话?)。
语法驱动折叠是导致突出显示速度慢的另一个原因;有关解决此问题的办法,请参见 tex-folding
最后,如果语法突出显示仍然太慢,您可以在您的 vimrc 中设置
:let g:tex_fast= ""
以这种方式使用,g:tex_fast 变量会导致语法突出显示脚本避免定义任何区域和相关的同步。结果将是更快的语法突出显示;代价是:您将不再拥有那么多的突出显示或任何基于语法的折叠,并且您将错过基于语法的错误检查。
您可能决定可以接受一些语法;您可以选择使用以下表格来仅启用一些语法突出显示
b : allow bold and italic syntax
c : allow texComment syntax
m : allow texMatcher syntax (ie. {...} and [...])
M : allow texMath syntax
p : allow parts, chapter, section, etc syntax
r : allow texRefZone syntax (nocite, bibliography, label, pageref, eqref)
s : allow superscript/subscript regions
S : allow texStyle syntax
v : allow verbatim syntax
V : allow texNewEnv and texNewCmd syntax
例如,让 g:tex_fast= "M" 将允许与数学相关的突出显示,但会抑制所有其他基于区域的语法突出显示。(另请参见:g:tex_concealtex-supersub
tex-morecommands tex-package
Tex:想要突出显示更多命令?
LaTeX 是一种可编程语言,因此有数千个包含专门 LaTeX 命令、语法和字体的包。如果您使用这样的包,您通常希望分发的 syntax/tex.vim 支持它。然而,显然这是不切实际的。因此,请考虑使用 mysyntaxfile-add 中的技术来扩展或修改 syntax/tex.vim 提供的突出显示。
我在我的网站上包含了一些对各种流行包的支持
https://www.drchip.org/astronaut/vim/index.html#LATEXPKGS
那里的语法文件将进入您的 .../after/syntax/tex/ 目录。
tex-error g:tex_no_error
Tex:过多的错误突出显示?
<tex.vim> 支持各种类型的词法错误检查。因此,虽然错误检查通常非常有用,但它可能会指示实际上不存在的错误。如果这对您来说是一个问题,您可以在您的 vimrc 中放入以下语句
let g:tex_no_error=1
并且 <syntax/tex.vim> 的所有错误检查都将被抑制。
tex-math
Tex:需要新的数学组?
如果您想在 LaTeX 中包含一个新的数学组,以下代码展示了您可能如何做到这一点
call TexNewMathZone(sfx,mathzone,starform)
您需要为新的数学组提供一个唯一的后缀(目前,A-L 和 V-Z 被 <syntax/tex.vim> 本身占用)。例如,考虑 <syntax/tex.vim> 如何设置 eqnarray
call TexNewMathZone("D","eqnarray",1)
您需要将“mathzone”更改为您的新数学组的名称,然后更改为 .vim/after/syntax/tex.vim 中对它的调用。如果“starform”变量为真,则意味着您的新数学组具有加星号的形式(即 eqnarray*)。
tex-style b:tex_stylish
Tex:开始新的样式?
可以在 *.tex 文件中使用“\makeatletter”,从而使命令中使用“@”可用。但是,由于 *.tex 文件没有以下后缀之一:sty cls clo dtx ltx,语法突出显示将标记此类使用“@”为错误。为了解决这个问题
:let b:tex_stylish = 1
:set ft=tex
将“let g:tex_stylish=1”放入您的 vimrc 中将使 <syntax/tex.vim> 始终接受此类使用“@”。
tex-cchar tex-cole tex-conceal Tex:利用隐藏模式~
如果您将 'conceallevel' 设置为 2 并且您的编码是 utf-8,那么许多字符序列可以转换为适当的 utf-8 字符,包括各种带重音的字符、数学区域中的希腊字符以及数学区域中的上标和下标。并非所有字符都可以转换为上标或下标;约束是由于 utf-8 支持什么。实际上,只有少数字符支持下标。
一种使用它的方法是使用垂直分割窗口(参见 CTRL-W_v);一个使用 'conceallevel' 为 0,另一个使用 2;两者都使用 'scrollbind'
g:tex_conceal
Tex:选择性隐藏模式~
您可以在您的 vimrc 中设置 g:tex_conceal 来选择性地使用隐藏模式。默认情况下,g:tex_conceal 设置为“admgs”,以启用对以下字符集的隐藏
a = accents/ligatures
b = bold and italic
d = delimiters
m = math symbols
g = Greek
s = superscripts/subscripts
通过省略其中一个或多个,将不会进行相关的隐藏字符替换。
g:tex_isk g:tex_stylish Tex:控制 iskeyword~
通常,LaTeX 关键字仅支持 0-9、a-z、A-z 和 192-255。Latex 关键字不支持下划线 - 除非在 *.sty 文件中。语法突出显示脚本使用以下逻辑来处理此问题
* 如果 g:tex_stylish 存在且为 1,则该文件将被视为“sty”文件,因此“_”将被允许作为关键字的一部分(无论 g:tex_isk 如何)* 否则,如果文件的后缀是 sty、cls、clo、dtx 或 ltx,则该文件将被视为“sty”文件,因此“_”将被允许作为关键字的一部分(无论 g:tex_isk 如何)
* 如果存在 g:tex_isk,则它将用于本地 'iskeyword' * 否则,本地 'iskeyword' 将设置为 48-57,a-z,A-Z,192-255
tex-supersub g:tex_superscripts g:tex_subscripts Tex:精细下标和上标控制~
有关如何启用隐藏字符替换,请参阅 tex-conceal
有关选择性隐藏重音、粗体/斜体、数学、希腊字母和上标/下标,请参阅 g:tex_conceal
您可以对想要进行基于语法隐藏的上标和下标进行精细控制(请参阅 :syn-cchar)。由于并非所有字体都支持所有字符,您可以覆盖隐藏替换列表;默认情况下,这些列表由
let g:tex_superscripts= "[0-9a-zA-W.,:;+-<>/()=]"
let g:tex_subscripts= "[0-9aehijklmnoprstuvx,+-/().]"
例如,我使用 Luxi Mono Bold;它不支持“hklmnpst”的下标字符,因此我输入
let g:tex_subscripts= "[0-9aeijoruvx,+-/().]"
在 ~/.config/nvim/ftplugin/tex/tex.vim 中,以避免出现难以理解的 utf-8 字符。
tex-matchcheck g:tex_matchcheck Tex:匹配检查控制~
有时您实际上想要不匹配的括号、方括号或花括号;例如,\text{(1,10]} 是一个从 1 开始但不包括 1 到包括 10 的范围。当然,这个愿望与提供分隔符不匹配检测的愿望相冲突。为了满足这些相互冲突的目标,syntax/tex.vim 提供了
g:tex_matchcheck = '[({[]'
它与默认设置一起显示。因此,如果您不希望检查 [] 和 () 的不匹配,请尝试使用
let g:tex_matchcheck= '[{}]'
如果您不希望在粗体和斜体区域内进行匹配,
let g:tex_excludematcher= 1
将阻止 texMatcher 组包含在这些区域中。
tf 语法高亮有一个选项。
对于同步,minlines 默认值为 100。如果您更喜欢其他值,可以将“tf_minlines”设置为您想要的值。示例
:let tf_minlines = your choice
控制 TypeScript 语法高亮有一个选项。
g:typescript_host_keyword
当此变量设置为 1 时,将突出显示特定于主机的 API,例如 addEventListener。要禁用,请在您的 .vimrc 中将其设置为零
let g:typescript_host_keyword = 0
默认值为 1。
g:typst_embedded_languages
Typst 文件可以通过设置 g:typst_embedded_languages 变量来嵌入其他语言的语法高亮。此变量是一个语言名称列表,其语法定义将包含在 Typst 文件中。示例
let g:typst_embedded_languages = ['python', 'r']

VIM vim.vim ft-vim-syntax

g:vimsyn_minlines g:vimsyn_maxlines 在更准确的语法高亮和屏幕更新速度之间存在权衡。为了提高准确性,您可能希望增加 g:vimsyn_minlines 变量。g:vimsyn_maxlines 变量可用于提高屏幕更新速率(有关更多信息,请参阅 :syn-sync)。
g:vimsyn_minlines : used to set synchronization minlines
g:vimsyn_maxlines : used to set synchronization maxlines
(g:vim_minlines 和 g:vim_maxlines 是这两个选项的弃用变体)
g:vimsyn_embed
g:vimsyn_embed 选项允许用户选择他们希望具有的嵌入式脚本高亮类型(如果有)。
g:vimsyn_embed == 0      : disable (don't embed any scripts)
g:vimsyn_embed == 'lpPr' : support embedded Lua, Perl, Python and Ruby
此选项默认情况下处于禁用状态。 g:vimsyn_folding
'foldmethod' 设置为“syntax”时,现在支持一些折叠
g:vimsyn_folding == 0 or doesn't exist: no syntax-based folding
g:vimsyn_folding =~ 'a' : augroups
g:vimsyn_folding =~ 'f' : fold functions
g:vimsyn_folding =~ 'h' : fold heredocs
g:vimsyn_folding =~ 'l' : fold Lua      script
g:vimsyn_folding =~ 'p' : fold Perl     script
g:vimsyn_folding =~ 'P' : fold Python   script
g:vimsyn_folding =~ 'r' : fold Ruby     script
默认情况下,g:vimsyn_folding 未设置。连接指示的字符以支持对多个语法结构的折叠(例如,g:vimsyn_folding = "fh" 将启用对函数和 heredoc 的折叠)。
g:vimsyn_comment_strings
默认情况下,字符串在注释中突出显示。可以通过将 g:vimsyn_comment_strings 设置为 false 来禁用此功能。
g:vimsyn_noerror
并非 syntax/vim.vim 执行的所有错误高亮都是正确的;Vim 脚本是一种难以正确高亮的语言。一种抑制错误高亮的方法是在您的 vimrc 中添加以下行
let g:vimsyn_noerror = 1
工作流描述语言是一种使用人类可读和可写语法来指定数据处理工作流的方式。这在生物信息学中被广泛使用。有关规范的更多信息,请访问这里: https://github.com/openwdl/wdl
XF86Config 文件的语法在 XFree86 v3.x 和 v4.x 中有所不同。这两个变体都受支持。使用自动检测,但远非完美。您可能需要手动指定版本。在您的 vimrc 中根据您的 XFree86 版本将变量 xf86conf_xfree86_version 设置为 3 或 4。示例
:let xf86conf_xfree86_version=3
当使用混合版本时,设置 b:xf86conf_xfree86_version 变量。
请注意,选项名称中的空格和下划线不受支持。如果您希望选项名称高亮显示,请使用“SyncOnGreen”而不是“__s yn con gr_e_e_n”。
默认情况下会突出显示 Xml 命名空间。可以通过设置全局变量来抑制此功能
:let g:xml_namespace_transparent=1
xml-折叠
xml 语法文件提供语法 折叠(请参阅 :syn-fold)在开始标记和结束标记之间。可以通过以下方式打开它
:let g:xml_syntax_folding = 1
:set foldmethod=syntax
注意:语法折叠可能会显着减慢语法突出显示,尤其是对于大型文件。
X 像素图 (XPM) xpm.vim ft-xpm-syntax
xpm.vim 基于 XPM 文件的内容动态创建其语法项。因此,如果您对例如颜色规范字符串进行了更改,您必须再次对其进行源代码管理,例如使用“:set syn=xpm”。
要使用其中一种颜色复制像素,请使用“yl”剪切一个“像素”,然后将其插入到其他地方,使用“P”。
您想用鼠标绘图吗?试试以下方法
:function! GetPixel()
:   let c = getline(".")[col(".") - 1]
:   echo c
:   exe "noremap <LeftMouse> <LeftMouse>r" .. c
:   exe "noremap <LeftDrag>        <LeftMouse>r" .. c
:endfunction
:noremap <RightMouse> <LeftMouse>:call GetPixel()<CR>
:set guicursor=n:hor20           " to see the color beneath the cursor
这将把右键变为吸管,将左键变为钢笔。它将适用于每个像素只有一个字符的 XPM 文件,并且您不能在像素字符串之外点击,但请随意改进它。
使用具有二次方单元格大小的字体看起来会好得多,例如对于 X
:set guifont=-*-clean-medium-r-*-*-8-*-*-*-*-80-*

YAML yaml.vim ft-yaml-syntax

g:yaml_schema b:yaml_schema YAML 模式是一组标签和用于解析非特定标签的机制的组合。对于用户来说,这意味着 YAML 解析器可能会根据纯标量内容将纯标量(实际上可能只是字符串,而不是其他任何东西)视为其他类型的值:空值、布尔值、浮点数、整数。g:yaml_schema 选项决定根据哪个模式对值进行特殊高亮显示。支持的模式是
模式描述
failsafe 没有额外的突出显示。json 支持 JSON 风格的数字、布尔值和空值。core 支持更多数字、布尔值和空值样式。pyyaml 除了核心模式外,还支持突出显示时间戳,但在识别为数字的内容以及核心模式中不存在的许多附加布尔值方面存在一些差异。
默认模式为 core
请注意,模式实际上并不限于纯标量,但这只是 YAML 规范中定义的模式之间的唯一区别,也是语法文件中定义的唯一区别。
zsh 的语法脚本允许基于语法的折叠
:let g:zsh_fold_enable = 1

6. 定义语法 :syn-define E410

Vim 理解三种类型的语法项
1. 关键字 它只能包含关键字字符,根据 :syn-iskeyword'iskeyword' 选项指定的字符。它不能包含其他语法项。它只会与完整的单词匹配(匹配项前后没有关键字字符)。关键字“if”将在“if(a=b)”中匹配,但在“ifdef x”中不匹配,因为“(”不是关键字字符,而“d”是。
2. 匹配 这是与单个正则表达式模式的匹配。
3. 区域 这从“start”正则表达式模式的匹配开始,到“end”正则表达式模式的匹配结束。两者之间可以出现任何其他文本。可以使用“skip”正则表达式模式来避免匹配“end”模式。
可以将多个语法 ITEM 放入一个语法 GROUP 中。对于语法组,您可以提供突出显示属性。例如,您可以使用一个项来定义 /* .. */ 注释,另一个项来定义“// ..”注释,并将它们都放在“Comment”组中。然后,您可以指定“Comment”将以粗体字显示并具有蓝色。您可以为一个语法项创建一个高亮组,也可以将所有项放入一个组中。这取决于您想要如何指定突出显示属性。将每个项目放在自己的组中会导致为许多组指定突出显示。
请注意,语法组和高亮组类似。对于高亮组,您将提供高亮属性。这些属性将用于具有相同名称的语法组。
如果在同一位置匹配多个项,则最后定义的项获胜。因此,您可以通过使用匹配相同文本的项来覆盖先前定义的语法项。但关键字总是先于匹配或区域。匹配大小写的关键字总是先于忽略大小写的关键字。

优先级 :syn-priority

当可能匹配多个语法项时,将使用以下规则
1. 当多个 Match 或 Region 项在同一位置开始时,最后定义的项具有优先级。 2. 关键字优先于 Match 和 Region 项。 3. 在较早位置开始的项优先于在较晚位置开始的项。

定义大小写 :syn-case E390

:sy[ntax] case [match | ignore] 这定义了在使用 "match" 时,以下 ":syntax" 命令是否会与匹配的 case 匹配,或者在使用 "ignore" 时,是否会忽略 case。请注意,此命令之前的任何项目都不会受到影响,直到下一个 ":syntax case" 命令之前的项目都会受到影响。
:sy[ntax] case 显示 "syntax case match" 或 "syntax case ignore"。

定义 FOLDLEVEL :syn-foldlevel

:sy[ntax] foldlevel start :sy[ntax] foldlevel minimum 这定义了在使用 foldmethod=syntax 时如何计算行的 foldlevel(参见 fold-syntax:syn-fold)。
start: 使用包含行开头的项目的级别。minimum: 使用行上项目的最低局部最小级别。
默认值为 "start"。使用 "minimum" 以水平搜索行,查找行上包含的最低级别,该级别后面是更高级别。当语法项目可能在行内水平关闭和打开时,这会产生更自然的折叠。
:sy[ntax] foldlevel 显示当前的 foldlevel 方法,即 "syntax foldlevel start" 或 "syntax foldlevel minimum"。

拼写检查 :syn-spell

:sy[ntax] spell toplevel :sy[ntax] spell notoplevel :sy[ntax] spell default 这定义了对不在语法项目中的文本进行拼写检查的位置。
toplevel: 对文本进行拼写检查。notoplevel: 对文本不进行拼写检查。default: 当存在 @Spell 集群时,不进行拼写检查。
对于语法项目中的文本,请使用 @Spell 和 @NoSpell 集群 spell-syntax。当不存在 @Spell 和 @NoSpell 集群时,将对 "default" 和 "toplevel" 进行拼写检查。
若要激活拼写检查,必须设置 'spell' 选项。
:sy[ntax] spell 显示当前的语法拼写检查方法,即 "syntax spell toplevel"、"syntax spell notoplevel" 或 "syntax spell default"。

语法 ISKEYWORD 设置 :syn-iskeyword

:sy[ntax] iskeyword [clear | {option}] 这定义了关键字字符。它类似于 'iskeyword' 选项,但只适用于语法高亮。
clear: 禁用特定语法的 iskeyword 设置,并使用缓冲区本地的 'iskeyword' 设置。{option} 将特定语法的 'iskeyword' 选项设置为新值。
示例
:syntax iskeyword @,48-57,192-255,$,_
这会将特定语法的 iskeyword 选项设置为包含所有字母字符,以及数字字符、所有带重音的字符,还包括 "_" 和 "$"。
如果未提供参数,则会输出当前值。
设置此选项会影响 /\k 在语法模式中匹配的内容,还会确定在何处检查 :syn-keyword 以获得新的匹配项。
建议在编写语法文件时,使用此命令为特定语法语言设置正确的值,而不是更改 'iskeyword' 选项。

定义关键字 :syn-keyword

:sy[ntax] keyword {group-name} [{options}] {keyword} .. [{options}]
这定义了一系列关键字。
{group-name} 是一个语法组名,例如 "Comment"。[{options}] 参见下面的 :syn-arguments{keyword} .. 是属于此组的关键字列表。
示例
:syntax keyword   Type   int long char
{options} 可以放在行中的任何位置。它们将应用于给定的所有关键字,也包括关键字后面的选项。以下示例完全相同
:syntax keyword   Type   contained int long char
:syntax keyword   Type   int long contained char
:syntax keyword   Type   int long char contained
E789 E890 当你有一个带有可选尾部的关键字时,例如 Vim 中的 Ex 命令,你可以将可选字符放在 [] 中,以一次定义所有变体
:syntax keyword   vimCommand         ab[breviate] n[ext]
不要忘记,只有当所有字符都包含在 'iskeyword' 选项中时,才能识别关键字。如果有一个字符不在其中,则永远无法识别关键字。也可以使用多字节字符。这些字符不必出现在 'iskeyword' 中。有关定义特定语法的 iskeyword 设置,请参见 :syn-iskeyword
关键字始终比匹配项或区域优先级高,如果多个项目匹配,则使用关键字。关键字不会嵌套,关键字不能包含任何其他内容。
请注意,当你的关键字与选项相同(即使是此处不允许的选项)时,你不能使用它。请改用匹配项。
关键字的最大长度为 80 个字符。
可以在包含内容不同时多次定义同一个关键字。例如,你可以定义一次未包含的关键字并使用一个高亮组,再定义一次已包含的关键字并使用不同的高亮组。例如
:syn keyword vimCommand tag
:syn keyword vimSetting contained tag
在任何语法项目之外找到 "tag" 时,将使用 "vimCommand" 高亮组。在包含 "vimSetting" 的语法项目中找到 "tag" 时,将使用 "vimSetting" 组。

定义匹配项 :syn-match

:sy[ntax] match {group-name} [{options}] [excludenl] [keepend] {pattern} [{options}]
这定义了一个匹配项。
{group-name} 一个语法组名,例如 "Comment"。[{options}] 参见下面的 :syn-arguments。[excludenl] 不要使带有行尾 "$" 的模式扩展包含的匹配项或区域。必须在模式之前给出。 :syn-excludenl keepend 不要允许包含的匹配项超过带有结束模式的匹配项。参见 :syn-keepend{pattern} 定义匹配项的搜索模式。参见下面的 :syn-pattern。请注意,该模式可能匹配多个行,这使得匹配项取决于 Vim 在何处开始搜索该模式。你需要确保同步处理了这一点。
示例(匹配字符常量)
:syntax match Character /'.'/hs=s+1,he=e-1

定义区域 :syn-region :syn-start :syn-skip :syn-end

E398 E399 :sy[ntax] region {group-name} [{options}] [matchgroup={group-name}] [keepend] [extend] [excludenl] start={start-pattern} .. [skip={skip-pattern}] end={end-pattern} .. [{options}]
这定义了一个区域。它可能跨越多行。
{group-name} 一个语法组名,例如 "Comment"。[{options}] 参见下面的 :syn-arguments。[matchgroup={group-name}] 仅对以下的开始或结束模式匹配使用该语法组。不适用于匹配的开始和结束模式之间的文本。使用 NONE 重置为不使用不同的组进行开始或结束匹配。参见 :syn-matchgroup。keepend 不要允许包含的匹配项超过带有结束模式的匹配项。参见 :syn-keepend。extend 覆盖使用 "keepend" 的项目中包含的项目的 "keepend"。参见 :syn-extend。excludenl 不要使带有行尾 "$" 的模式扩展包含的匹配项或项目。仅对结束模式有用。必须在它适用的模式之前给出。 :syn-excludenl start={start-pattern} 定义区域开始的搜索模式。参见下面的 :syn-pattern。skip={skip-pattern} 定义区域内不应查找结束模式的文本的搜索模式。参见下面的 :syn-pattern。end={end-pattern} 定义区域结束的搜索模式。参见下面的 :syn-pattern
示例
:syntax region String   start=+"+  skip=+\\"+  end=+"+
开始/跳过/结束模式和选项可以按任何顺序给出。可以有零个或一个跳过模式。必须有一个或多个开始模式和结束模式。这意味着你可以省略跳过模式,但必须至少提供一个开始模式和一个结束模式。允许在等号前后有空格(尽管大部分情况下没有空格看起来更好)。
当给出多个开始模式时,与其中一个模式匹配就足够了。这意味着开始模式之间是 OR 关系。最后匹配的模式将被使用。结束模式也是如此。
对结束模式的搜索从开始模式的正后方开始。不使用偏移量进行此操作。这意味着结束模式的匹配项永远不会与开始模式重叠。
跳过模式和结束模式可以跨越换行符进行匹配,但由于模式的搜索可以从任何行开始,因此它往往无法达到预期效果。跳过模式不会避免在下一行匹配结束模式。使用单行模式以避免出现问题。
注意: 启动区域的决定仅基于匹配的开始模式。没有检查匹配的结束模式。这不会起作用
:syn region First  start="("  end=":"
:syn region Second start="("  end=";"
第二个始终在第一个之前匹配(最后定义的模式优先级更高)。然后,第二个区域一直持续到下一个 ";",无论它之前是否有 ":"。使用匹配项可以起作用
:syn match First  "(\_.\{-}:"
:syn match Second "(\_.\{-};"
此模式使用 "\_." 匹配任何字符或换行符,并使用 "\{-}"(重复尽可能少的次数)重复该匹配项。
:syn-keepend
默认情况下,包含的匹配项可以遮蔽对结束模式的匹配项。这对于嵌套很有用。例如,一个以 "{" 开始并以 "}" 结束的区域可以包含另一个区域。遇到的 "}" 将结束包含的区域,但不会结束外部区域:{ 开始外部 "{}" 区域 { 开始包含 "{}" 区域 } 结束包含 "{}" 区域 } 结束外部 "{}" 区域如果你不想要这种效果,"keepend" 参数会使与外部区域的结束模式的匹配项也结束任何包含的项目。这使得无法嵌套相同的区域,但允许包含的项目突出显示结束模式的一部分,而不会导致跳过与结束模式的匹配项。示例
:syn match  vimComment +"[^"]\+$+
:syn region vimCommand start="set" end="$" contains=vimComment keepend
"keepend" 会使 vimCommand 始终在行尾结束,即使包含的 vimComment 包含与 <EOL> 的匹配项。
当不使用 "keepend" 时,会在每个包含的匹配项之后重新尝试与结束模式的匹配项。当包含 "keepend" 时,将使用遇到的第一个与结束模式的匹配项,截断任何包含的匹配项。 :syn-extend
"keepend" 行为可以通过使用 "extend" 参数来更改。当使用 "extend" 的项目包含在使用 "keepend" 的项目中时,将忽略 "keepend",并将扩展包含的区域。这可用于让某些包含的项目扩展区域,而其他项目则不扩展。示例
:syn region htmlRef start=+<a>+ end=+</a>+ keepend contains=htmlItem,htmlScript
:syn match htmlItem +<[^>]*>+ contained
:syn region htmlScript start=+<script+ end=+</script[^>]*>+ contained extend
这里,htmlItem 项目不会使 htmlRef 项目继续,它仅用于突出显示 <> 项目。htmlScript 项目确实扩展了 htmlRef 项目。
另一个示例
:syn region xmlFold start="<a>" end="</a>" fold transparent keepend extend
这定义了一个使用 "keepend" 的区域,因此它的结束不会因包含的项目而更改,例如当 "</a>" 匹配以突出显示不同的内容时。但是当 xmlFold 区域嵌套(它包含自身)时,"extend" 会生效,因此嵌套区域的 "</a>" 仅结束该区域,而不会结束它所包含的区域。
:syn-excludenl
当匹配模式或区域结束模式包含“$”以匹配行尾时,它将使包含它的区域项在下一行继续。例如,使用“\\$”(行尾的反斜杠)进行匹配可以使一个通常在行尾停止的区域继续。这是默认行为。如果不希望如此,可以通过两种方法避免:1. 在包含项中使用“keepend”。这将阻止所有包含的匹配扩展匹配或区域。当所有包含的项目不得扩展包含的项目时可以使用它。2. 在包含的项中使用“excludenl”。这将阻止该匹配扩展包含的匹配或区域。如果只需要阻止某些包含的项目扩展包含的项目时,可以使用它。“excludenl”必须放在它所应用的模式之前。
:syn-matchgroup
“matchgroup”可用于突出显示与区域主体不同的开始和/或结束模式。示例
:syntax region String matchgroup=Quote start=+"+  skip=+\\"+        end=+"+
这将使用“Quote”组突出显示引号,使用“String”组突出显示引号之间的文本。“matchgroup”用于所有后续的开始和结束模式,直到下一个“matchgroup”。使用“matchgroup=NONE”恢复不使用匹配组。
在使用“matchgroup”突出显示的开始或结束模式中,不会使用区域的包含项。这可以用于避免包含的项目在开始或结束模式匹配中匹配。当使用“transparent”时,这不会应用于使用“matchgroup”突出显示的开始或结束模式匹配。
以下示例使用不同的颜色突出显示三个级别的括号
:sy region par1 matchgroup=par1 start=/(/ end=/)/ contains=par2
:sy region par2 matchgroup=par2 start=/(/ end=/)/ contains=par3 contained
:sy region par3 matchgroup=par3 start=/(/ end=/)/ contains=par1 contained
:hi par1 ctermfg=red guifg=red
:hi par2 ctermfg=blue guifg=blue
:hi par3 ctermfg=darkgreen guifg=darkgreen
E849
语法组的最大数量为 19999。

7. :syntax arguments :syn-arguments

定义语法项目的 :syntax 命令接受多个参数。以下是常见参数的说明。参数可以以任意顺序给出,并且可以与模式混合使用。
并非所有命令都接受所有参数。下表显示了哪些参数不能用于所有命令: E395
contains oneline fold display extend concealends~ :syntax keyword - - - - - - :syntax match yes - yes yes yes - :syntax region yes yes yes yes yes yes
这些参数可以用于所有三个命令:conceal cchar contained containedin nextgroup transparent skipwhite skipnl skipempty
给出“conceal”参数时,该项目将被标记为可隐藏。是否真正隐藏取决于 'conceallevel' 选项的值。 'concealcursor' 选项用于确定当前行中的可隐藏项目是否以未隐藏的方式显示以允许编辑该行。
另一种隐藏文本的方法是使用 matchadd(),但其内部工作方式略有不同 syntax-vs-match
concealends :syn-concealends
给出“concealends”参数时,区域的开始和结束匹配(而不是区域内容)将被标记为可隐藏。是否真正隐藏取决于 'conceallevel' 选项的设置。区域的末尾只有在通过“matchgroup”具有自己的突出显示时才能以这种方式单独隐藏。 synconcealed() 函数可用于检索有关隐藏项目的详细信息。
cchar :syn-cchar
E844
“cchar”参数定义了隐藏项目时显示的字符(只有给出 conceal 参数时设置“cchar”才有意义)。如果未设置“cchar”,则使用 'listchars' 选项中定义的默认隐藏字符。该字符不能是制表符等控制字符。示例
:syntax match Entity "&amp;" conceal cchar=&
有关突出显示,请参阅 hl-Conceal
contained :syn-contained
给出“contained”参数时,该项目不会在顶级被识别,而只会当它在另一个匹配的“contains”字段中被提及时被识别。示例
:syntax keyword Todo    TODO    contained
:syntax match   Comment "//.*"  contains=Todo
display :syn-display
如果给出“display”参数,则当检测到的突出显示不会被显示时,该项目将被跳过。这将通过在仅查找要显示的文本的语法状态时跳过该项目来加快突出显示速度。
通常,您可以对满足以下条件的匹配和区域项目使用“display”
该项目不会跨越行尾。C 语言示例:用于“/*”注释的区域不能包含“display”,因为它会延续到下一行。
该项目不包含跨越行尾或使其延续到下一行的项目。
该项目不会更改它所包含的任何项目的尺寸。C 语言示例:预处理器匹配中使用“\\$”的匹配不能使用“display”,因为它可能会使该预处理器匹配变短。
该项目不允许其他项目匹配原本不会匹配的项目,并且该项目可能会使匹配范围过大。C 语言示例:用于“//”注释的匹配不能使用“display”,因为该注释中的“/*”将匹配,然后开始一个跨越行尾的注释。
C 语言中可以使用的“display”示例
使用数字进行匹配
使用标签进行匹配
transparent :syn-transparent
如果给出“transparent”参数,则该项目本身不会被突出显示,而是会采用它所包含的项目的突出显示。这对于不需要任何突出显示而仅用于跳过文本一部分的语法项目很有用。
“contains=”参数也从它所包含的项目继承,除非为透明项目本身给出“contains”参数。为了避免包含不需要的项目,请使用“contains=NONE”。示例,该示例突出显示字符串中的单词,但对“vim”例外
:syn match myString /'[^']*'/ contains=myWord,myVim
:syn match myWord   /\<[a-z]*\>/ contained
:syn match myVim    /\<vim\>/ transparent contained contains=NONE
:hi link myString String
:hi link myWord   Comment
由于“myVim”匹配出现在“myWord”之后,因此它是首选匹配(相同位置的最后一个匹配优先于较早的匹配)。“transparent”参数使“myVim”匹配使用与“myString”相同的突出显示。但它不包含任何内容。如果省略“contains=NONE”参数,则“myVim”将使用 myString 的 contains 参数并允许包含“myWord”,该单词将被突出显示为注释。发生这种情况是因为包含的匹配不会在相同位置与其自身内部匹配,因此“myVim”匹配在这里不会覆盖“myWord”匹配。
当您查看彩色文本时,就像查看包含项目的层一样。包含的项目位于它所包含的项目的顶部,因此您看到包含的项目。当包含的项目是透明的时,您可以透视它,因此您看到它所包含的项目。在图中
从这里看
| | | | | | V V V V V V
xxxx yyy more contained items .................... contained item (transparent) ============================= first item
“x”、“y”和“=”表示突出显示的语法项目。“.”表示透明组。
您看到的是
=======xxxx=======yyy========
因此,您可以透视“....”。
oneline :syn-oneline
“oneline”参数表示该区域不会跨越行边界。它必须在当前行中完全匹配。但是,当该区域包含跨越行边界的项目时,它将在下一行继续。包含的项目可用于识别行延续模式。但“end”模式必须仍然在第一行匹配,否则该区域甚至不会开始。
当开始模式包含“\n”以匹配行尾时,结束模式必须在开始模式结束的同一行中找到。结束模式也可以包含行尾。因此,“oneline”参数表示开始模式的结尾和结束模式的开头必须位于同一行内。这不能通过匹配换行的跳过模式来改变。
“fold”参数使该项目的折叠级别增加 1。示例
:syn region myFold start="{" end="}" transparent fold
:syn sync fromstart
:set foldmethod=syntax
这将使每个 {} 块形成一个折叠。
折叠将从项目开始的行开始,并在项目结束的地方结束。如果开始和结束在同一行内,则没有折叠。 'foldnestmax' 选项限制语法折叠的嵌套。有关如何根据行的语法项目计算行的折叠级别的信息,请参阅 :syn-foldlevel
:syn-contains E405 E406 E407 E408 E409 contains={group-name},..
“contains”参数后面跟着语法组名称列表。这些组将被允许在项目内部开始(它们可能扩展到包含组的结尾之外)。这允许递归嵌套匹配和区域。如果没有“contains”参数,则该项目中不会包含任何组。组名不需要在使用之前定义。
contains=ALL 如果 contains 列表中的唯一项目是“ALL”,则所有组都将在项目内部被接受。
contains=ALLBUT,{group-name},.. 如果 contains 列表中的第一个项目是“ALLBUT”,则所有组都将在项目内部被接受,除了列出的那些组。示例
:syntax region Block start="{" end="}" ... contains=ALLBUT,Function
contains=TOP 如果 contains 列表中的第一个项目是“TOP”,则所有不具有“contained”参数的组都将在项目内部被接受。contains=TOP,{group-name},.. 与“TOP”类似,但不包括列出的组。
contains=CONTAINED 如果 contains 列表中的第一个项目是“CONTAINED”,则所有具有“contained”参数的组都将在项目内部被接受。contains=CONTAINED,{group-name},.. 与“CONTAINED”类似,但不包括列出的组。
“contains”列表中的 {group-name} 可以是模式。所有与该模式匹配的组名都将被包含(或排除,如果使用“ALLBUT”)。该模式不能包含空格或“,”。示例
... contains=Comment.*,Keyw[0-3]
匹配将在执行语法命令时进行。之后定义的组不会被匹配。此外,如果当前语法命令定义了一个新组,则它不会被匹配。注意:将语法命令放在文件中时,不能依赖于组未被定义,因为该文件可能已在之前被加载,并且“:syn clear”不会删除组名。
包含的组也将匹配区域的开始和结束模式。 如果不希望如此,可以使用“matchgroup”参数 :syn-matchgroup。 可以使用“ms=”和“me=”偏移量来更改包含项目匹配的区域。 请注意,这也会限制突出显示的区域。
containedin={group-name}... :syn-containedin
“containedin”参数后跟语法组名称列表。 允许该项目在这些组内开始。 这就像包含项目具有包含该项目的“contains=”参数一样。
上面解释过,{group-name}... 可以像“contains”一样使用。
这在之后添加语法项目时很有用。 可以告诉一个项目包含在现有项目中,而无需更改该项目的定义。 例如,在加载 C 语法后,在 C 注释中突出显示一个单词
:syn keyword myword HELP containedin=cComment contained
请注意,“contained”也被使用,以避免该项目在顶层匹配。
“containedin”的匹配项将添加到该项目可能出现的其他位置。 通常还可以添加“contains”参数。 不要忘记关键字从不包含其他项目,因此将它们添加到“containedin”将不起作用。
nextgroup={group-name},.. :syn-nextgroup
“nextgroup”参数后跟语法组名称列表,这些名称之间用逗号分隔(就像“contains”一样,所以你也可以使用模式)。
如果提供了“nextgroup”参数,则在匹配或区域结束之后,将尝试使用提到的语法组进行匹配。 如果这些组都没有匹配,则突出显示将照常继续。 如果有匹配,则将使用此组,即使它没有在当前组的“contains”字段中提及。 这就像赋予提及的组比所有其他组更高的优先级。 例如
:syntax match  ccFoobar  "Foo.\{-}Bar"  contains=ccFoo
:syntax match  ccFoo     "Foo"            contained nextgroup=ccFiller
:syntax region ccFiller  start="."  matchgroup=ccBar  end="Bar"  contained
这将以不同的方式突出显示“Foo”和“Bar”,并且只有在“Foo”之后有“Bar”时才会突出显示。 在下面的文本行中,“f”表示 ccFoo 用于突出显示的位置,“bbb”表示 ccBar 用于突出显示的位置。
Foo asdfasd Bar asdf Foo asdf Bar asdf
fff               bbb        fff         bbb
请注意使用“.\{-}”来跳过尽可能少的字符,直到下一个 Bar。 当使用“.*”时,由于 ccFooBar 匹配将包括行中的第一个“Foo”和最后一个“Bar”(请参阅 pattern),因此“Bar”和“Foo”之间的“asdf”将根据“ccFoobar”组进行突出显示。
skipwhite :syn-skipwhite
skipnl :syn-skipnl
skipempty :syn-skipempty
这些参数仅与“nextgroup”结合使用。 它们可以用来允许下一个组在跳过一些文本后匹配:skipwhite 跳过空格和制表符 skipnl 跳过行尾 skipempty 跳过空行(意味着“skipnl”)
如果存在“skipwhite”,则只有在没有与空格匹配的下一个组时才会跳过空格。
如果存在“skipnl”,则可能会在下一行中找到与 nextgroup 的匹配项。 这只有在当前项目在当前行的末尾结束时才会发生! 如果不存在“skipnl”,则 nextgroup 只能在当前项目在同一行中的后面找到。
在查找下一个组时跳过文本时,会忽略其他组的匹配项。 只有在没有下一个组匹配时,才会再次尝试其他项目进行匹配。 这意味着匹配下一个组以及跳过空格和<EOL>的优先级高于其他项目。
示例
:syn match ifstart "\<if.*"          nextgroup=ifline skipwhite skipempty
:syn match ifline  "[^ \t].*" nextgroup=ifline skipwhite skipempty contained
:syn match ifline  "endif"        contained
请注意,“[^ \t].*”匹配项匹配所有非空白文本。 因此,它也会匹配“endif”。 因此,“endif”匹配项放在最后,以便它具有优先级。 请注意,此示例不适用于嵌套的“if”。 你需要添加“contains”参数才能使其工作(为了简化示例而省略)。

IMPLICIT CONCEAL :syn-conceal-implicit

:sy[ntax] conceal [on|off] 这定义了以下“:syntax”命令是否会定义具有“conceal”标志设置的关键字、匹配项或区域。 在“:syn conceal on”之后,所有随后的“:syn keyword”、“:syn match”或“:syn region”定义将隐式地具有“conceal”标志设置。 “:syn conceal off”返回到正常状态,在这种状态下必须显式地给出“conceal”标志。
:sy[ntax] conceal 显示“syntax conceal on”或“syntax conceal off”。

8. 语法模式 :syn-pattern E401 E402

在语法命令中,模式必须用两个相同的字符括起来。 这就像它在“:s”命令中工作一样。 最常用的字符是双引号。 但是如果模式包含双引号,你可以使用模式中没有使用的其他字符。 例如
:syntax region Comment  start="/\*"  end="\*/"
:syntax region String   start=+"+    end=+"+         skip=+\\"+
请参阅 pattern 以了解模式的含义。 语法模式始终像'magic' 选项已设置一样进行解释,无论'magic' 的实际值是什么。 并且模式的解释方式与“l”标志未包含在'cpoptions' 中一样。 这样做是为了使语法文件可移植且独立于'magic' 设置。
尽量避免可以匹配空字符串的模式,例如“[a-z]*”。 由于它在任何地方都会匹配,因此这会大大降低突出显示的速度。
:syn-pattern-offset
模式后可以跟一个字符偏移量。 这可以用来更改突出显示的部分,以及更改匹配项或区域中包含的文本区域(这只有在尝试匹配其他项目时才重要)。 两者相对于匹配的模式。 跳过模式的字符偏移量可用于说明在何处继续查找结束模式。
偏移量采用“{what}={offset}”的形式 {what} 可以是七个字符串之一
ms 匹配开始偏移量,用于匹配文本的开始 me 匹配结束偏移量,用于匹配文本的结束 hs 突出显示开始偏移量,用于突出显示开始的位置 he 突出显示结束偏移量,用于突出显示结束的位置 rs 区域开始偏移量,用于区域主体开始的位置 re 区域结束偏移量,用于区域主体结束的位置 lc 领先上下文偏移量,超过模式的“领先上下文”
{offset} 可以是
s 匹配模式的开头 s+{nr} 匹配模式的开头加上{nr} 个字符到右边 s-{nr} 匹配模式的开头加上{nr} 个字符到左边 e 匹配模式的结尾 e+{nr} 匹配模式的结尾加上{nr} 个字符到右边 e-{nr} 匹配模式的结尾加上{nr} 个字符到左边 {nr} (仅适用于“lc”):从匹配模式开始的{nr} 个字符右边开始匹配
例如:“ms=s+1”、“hs=e-2”、“lc=3”。
尽管所有偏移量都可以在任何模式之后被接受,但它们并不总是有效的。 此表显示了实际使用的偏移量
ms me hs he rs re lc
匹配项 yes yes yes yes - - yes 区域项目开始 yes - yes - yes - yes 区域项目跳过 - yes - - - - yes 区域项目结束 - yes - yes - yes yes
偏移量可以连接起来,中间用“,”隔开。 例如
:syn match String  /"[^"]*"/hs=s+1,he=e-1
some "string" text ^^^^^^ 突出显示
注意
模式和字符偏移量之间不能有空格。
突出显示区域永远不会超出匹配的文本。
结束模式的负偏移量可能并不总是有效,因为可能在突出显示应该已经停止时检测到结束模式。
在 Vim 7.2 之前,偏移量是以字节而不是字符计算的。 这对于多字节字符来说效果不佳,因此在 Vim 7.2 版本中进行了更改。
匹配的开始不能在与模式匹配的行以外的行中。 这不起作用:“a\nb”ms=e。 你可以使突出显示在另一行开始,这可以工作:“a\nb”hs=e。
示例(匹配注释但不突出显示/* and */
:syntax region Comment start="/\*"hs=e+1 end="\*/"he=s-1
/* this is a comment */
  ^^^^^^^^^^^^^^^^^^^          highlighted
更复杂的示例
:syn region Exa matchgroup=Foo start="foo"hs=s+2,rs=e+2 matchgroup=Bar end="bar"me=e-1,he=e-1,re=s-1
abcfoostringbarabc
   mmmmmmmmmmm            match
     sssrrreee            highlight start/region/end ("Foo", "Exa" and "Bar")
注意:这是一个过时的功能,仅为了向后兼容以前的 Vim 版本而包含。 现在建议使用 /\@<= 构造在模式中。 你也可以经常使用 /\zs
“lc”偏移量指定领先上下文 - 模式的一部分,它必须存在,但不被认为是匹配的一部分。 偏移量“lc=n”将导致 Vim 在尝试模式匹配之前后退 n 列,允许已经在先前模式中匹配的字符也用作此匹配的领先上下文。 例如,这可以用来指定“转义”字符不能出现在匹配项之前
:syn match ZNoBackslash "[^\\]z"ms=s+1
:syn match WNoBackslash "[^\\]w"lc=1
:syn match Underline "_\+"
___zzzz ___wwww ^^^ ^^^ 匹配 Underline ^ ^ 匹配 ZNoBackslash ^^^^ 匹配 WNoBackslash
除非你显式设置“ms”,否则“ms”偏移量将自动设置为与“lc”偏移量相同的值。
多行模式 :syn-multi-line
模式可以包含“\n”以匹配行尾。 大多数情况下,这按预期工作,但有一些例外。
当使用带有偏移量的开始模式时,不允许匹配的开始出现在后面的行中。 尽管突出显示可以在后面的行中开始。 使用“\zs”项也要求匹配的开始不要移动到另一行。
跳过模式可以包含“\n”,但对结束模式的搜索将在下一行的第一个字符处继续,即使该字符与跳过模式匹配也是如此。 这是因为重绘可能会在区域中间的任何行中开始,并且没有检查跳过模式是否在之前的行中开始。 例如,如果跳过模式是“a\nb”并且结束模式是“b”,则结束模式确实在以下内容的第二行中匹配
x x a
b x x
通常,这意味着跳过模式不应匹配“\n”后面的任何字符。
外部匹配项 :syn-ext-match
这些额外的正则表达式项可在区域模式中使用
/\z( /\z(\) E50 E52 E879 \z(\) 将子表达式标记为“外部”,这意味着可以从另一个模式匹配中访问它。 目前仅在定义语法区域开始模式时可以使用。
/\z1 /\z2 /\z3 /\z4 /\z5 \z1 ... \z9 /\z6 /\z7 /\z8 /\z9 E66 E67 匹配与先前开始模式匹配中相应子表达式匹配的相同字符串。
有时,区域的开始和结束模式需要共享一个公共子表达式。一个常见的例子是 Perl 和许多 Unix shell 中的“here”文档。这种效果可以通过“\z”特殊正则表达式项来实现,该项将子表达式标记为“外部”,这意味着它可以在定义它的模式之外被引用。例如,here-document 示例可以这样完成
:syn region hereDoc start="<<\z(\I\i*\)" end="^\z1$"
如这里所示,\z 实际上执行了双重职责。在开始模式中,它将“\(\I\i*\)” 子表达式标记为外部;在结束模式中,它将 \z1 反向引用更改为外部引用,引用开始模式中的第一个外部子表达式。外部引用也可以用在跳过模式中
:syn region foo start="start \z(\I\i*\)" skip="not end \z1" end="end \z1"
请注意,普通子表达式和外部子表达式是完全正交的,并且分别进行索引;例如,如果模式“\z(..\)\(..\)” 应用于字符串“aabb”,那么 \1 将引用“bb”,而 \z1 将引用“aa”。还要注意,外部子表达式不能像普通子表达式那样在同一个模式中作为反向引用访问。如果你想将一个子表达式用作普通子表达式和外部子表达式,你可以将它们嵌套,就像“\(\z(...\)\)” 一样。
请注意,只能使用单行内的匹配。不能引用多行匹配。

9. 语法集群 :syn-cluster E400

:sy[ntax] cluster {cluster-name} [contains={group-name}..] [add={group-name}..] [remove={group-name}..]
此命令允许您将语法组列表集群在一起,并使用单个名称。
contains={group-name}.. 集群设置为指定的组列表。 add={group-name}.. 指定的组将添加到集群中。 remove={group-name}.. 指定的组将从集群中删除。
这样定义的集群可以在 contains=.., containedin=.., nextgroup=.., add=.. 或 remove=.. 列表中使用“@”前缀引用。您也可以使用此表示法在指定其内容之前隐式声明集群。
示例
:syntax match Thing "# [^#]\+ #" contains=@ThingMembers
:syntax cluster ThingMembers contains=ThingMember1,ThingMember2
正如前面的示例所示,对集群的修改实际上是追溯性的;集群的成员资格是在最后一刻检查的,可以说是这样
:syntax keyword A aaa
:syntax keyword B bbb
:syntax cluster AandB contains=A
:syntax match Stuff "( aaa bbb )" contains=@AandB
:syntax cluster AandB add=B          " now both keywords are matched in Stuff
这也对嵌套集群有影响
:syntax keyword A aaa
:syntax keyword B bbb
:syntax cluster SmallGroup contains=B
:syntax cluster BigGroup contains=A,@SmallGroup
:syntax match Stuff "( aaa bbb )" contains=@BigGroup
:syntax cluster BigGroup remove=B        " no effect, since B isn't in BigGroup
:syntax cluster SmallGroup remove=B        " now bbb isn't matched within Stuff
E848
集群的最大数量为 9767。

10. 包含语法文件 :syn-include E397

一种语言的语法文件包含相关语言的语法文件通常很有用。根据确切的关系,这可以通过两种不同的方式完成
如果要允许包含的语法文件中的顶级语法项在包含语法中处于顶级,则可以使用 :runtime 命令
" In cpp.vim:
:runtime! syntax/c.vim
:unlet b:current_syntax
如果要将包含的语法文件中的顶级语法项包含在包含语法中的区域内,则可以使用“:syntax include”命令
:sy[ntax] include [@{grouplist-name}] {file-name}
包含文件中声明的所有语法项都将添加“contained”标志。此外,如果指定了组列表,则包含文件中所有顶级语法项都将添加到该列表中。
" In perl.vim:
:syntax include @Pod <sfile>:p:h/pod.vim
:syntax region perlPOD start="^=head" end="^=cut" contains=@Pod
{file-name} 是一个绝对路径(以“/”、“c:”、“$VAR” 或“<sfile>”开头)时,该文件将被源代码化。当它是一个相对路径(例如,“syntax/pod.vim”)时,将在 'runtimepath' 中搜索该文件。所有匹配的文件都将被加载。建议使用相对路径,因为它允许用户用自己的版本替换包含文件,而无需替换执行“:syn include”的文件。
E847
包含的最大数量为 999。

11. 同步 :syn-sync E403 E404

Vim 希望能够从文档中的任何位置开始重绘。为了实现这一点,它需要知道重绘开始位置的语法状态。
:sy[ntax] sync [ccomment [group-name] | minlines={N} | ...]
有四种同步方式:1. 始终从文件开头解析。 :syn-sync-first 2. 基于 C 样式注释。Vim 了解 C 样式注释的工作方式,并可以确定当前行是否从注释内或注释外开始。 :syn-sync-second 3. 向后跳转一定数量的行,并在那里开始解析。 :syn-sync-third 4. 在文本中向后搜索同步模式。 :syn-sync-fourth
:syn-sync-maxlines :syn-sync-minlines 对于最后三种方法,解析可以开始的行范围受“minlines”和“maxlines”限制。
如果给出了“minlines={N}”参数,则解析始终至少从该参数指定的行数向后开始。如果解析可能需要几行才能正确执行,或者在不可能使用同步时,可以使用它。
如果给出了“maxlines={N}”参数,则搜索注释或同步模式的行数将限制为向后 N 行(在添加“minlines”后)。如果您只有很少的同步内容并且计算机运行速度很慢,这将很有用。示例
:syntax sync maxlines=500 ccomment
:syn-sync-linebreaks
当使用匹配多行的模式时,一行中的更改可能会导致模式不再匹配之前的一行。这意味着必须从更改位置上方开始。可以使用“linebreaks”参数指定多少行。例如,当模式可能包含一个换行符时,使用
:syntax sync linebreaks=1
结果是,重绘始终至少从更改位置之前的一行开始。 “linebreaks”的默认值为零。“minlines”的值通常大于“linebreaks”。
第一种同步方法: :syn-sync-first
:syntax sync fromstart
文件将从开头解析。这使语法高亮显示准确,但对于长文件来说可能很慢。Vim 会缓存以前解析的文本,因此只有在第一次解析文本时才会很慢。但是,在进行更改时,需要再次解析部分文本(最坏情况:到文件末尾)。
使用“fromstart”等同于使用带有非常大数字的“minlines”。
第二种同步方法: :syn-sync-second :syn-sync-ccomment
对于第二种方法,只需要给出“ccomment”参数。示例
:syntax sync ccomment
当 Vim 发现显示开始的行位于 C 样式注释内时,将使用具有组名称“Comment”的最后一个区域语法项。这要求有一个具有组名称“Comment”的区域!可以指定一个备用组名称,例如
:syntax sync ccomment javaComment
这意味着将使用用“syn region javaComment”指定的最后一个项来表示检测到的 C 注释区域。这只有在该区域确实具有开始模式“\/*”和结束模式“*\/”时才有效。
可以使用“maxlines”参数限制搜索的行数。可以使用“minlines”参数至少从一定数量的行数向后开始(例如,如果有一些结构只需要几行,但很难同步)。
注意: 在字符串跨行并包含“*/”时,在 C 注释上同步不起作用。由于让字符串跨行是一个不好的编程习惯(许多编译器会发出警告消息),并且“*/”出现在注释内的可能性很小,因此很少注意到此限制。
第三种同步方法: :syn-sync-third
对于第三种方法,只需要给出“minlines={N}”参数。Vim 将从行号中减去 {N} 并从那里开始解析。这意味着需要解析额外的 {N} 行,这使得这种方法稍微慢一些。示例
:syntax sync minlines=50
“lines”等同于“minlines”(由旧版本使用)。
第四种同步方法: :syn-sync-fourth
这样做的目的是在几个特定区域的末尾进行同步,称为同步模式。只有区域可以跨行,因此当我们找到某个区域的末尾时,我们可能能够知道我们位于哪个语法项中。搜索从重绘开始的行上面的那行开始。从那里开始,搜索在文件中向后继续。
这与非同步语法项的工作方式相同。您可以使用包含匹配、nextgroup 等。但有一些区别
不能使用关键字。
具有“sync”关键字的语法项形成一个完全独立的语法项组。您不能混合同步组和非同步组。
匹配在缓冲区中向后工作(逐行),而不是向前工作。
可以给出行延续模式。它用于确定哪些组的线需要像一行一样被搜索。这意味着使用指定的项进行匹配的搜索从包含延续模式的连续行中的第一行开始。
当使用“nextgroup”或“contains”时,这仅在单行(或延续行的组)内有效。
当使用区域时,它必须在同一行(或延续行的组)中开始和结束。否则,将假定结束位于行(或延续行的组)的末尾。
当找到与同步模式匹配的项时,将搜索该行(或延续行的组)的其余部分以查找另一个匹配项。使用最后一个匹配项。当一行可以同时包含区域的开始和结束时,使用它(例如,在 C 注释中,如 /* this */,使用最后一个“*/”)。
有两种方法可以使用与同步模式匹配的项:1. 用于高亮显示的解析从重绘开始的位置(以及搜索同步模式开始的位置)开始。必须指定预期在该位置有效的语法组。当跨行的区域不能包含其他区域时,这很有效。 2. 用于高亮显示的解析在匹配项之后继续。必须指定预期存在于匹配项之后的语法组。当先前的方法不起作用时,可以使用它。速度要慢得多,因为需要解析更多文本。两种类型的同步模式可以同时使用。
除了同步模式外,还可以指定其他匹配和区域,以避免找到不需要的匹配。
[同步模式单独给出,是因为同步点的搜索通常比确定高亮要简单得多。模式数量减少意味着它将运行得(快)很多。]
syn-sync-grouphere E393 E394 :syntax sync match {sync-group-name} grouphere {group-name} "pattern" ..
定义用于同步的匹配项。{group-name} 是紧随匹配项之后的语法组的名称。文本的高亮解析从匹配项之后开始。此 {group-name} 必须存在一个区域。将使用定义的第一个区域。“NONE” 可用于匹配项之后没有语法组的情况。
syn-sync-groupthere
:syntax sync match {sync-group-name} groupthere {group-name} "pattern" ..
与 "grouphere" 相似,但 {group-name} 是在搜索同步点开始的行首要使用的语法组的名称。匹配项与同步模式搜索开始之间的文本被假定不会改变语法高亮。例如,在 C 语言中,您可以向后搜索 "/*" 和 "*/"。如果首先找到 "/*",您就知道您在注释中,因此 "groupthere" 是 "cComment"。如果首先找到 "*/",您就知道您不在注释中,因此 "groupthere" 是 "NONE"。(实际上要复杂一些,因为 "/*" 和 "*/" 可能出现在字符串中。这留给读者作为练习……)。
:syntax sync match .. :syntax sync region ..
没有 "groupthere" 参数。定义在搜索同步点时跳过的区域或匹配项。
syn-sync-linecont
:syntax sync linecont {pattern}
{pattern} 在一行中匹配时,它被认为在下一行继续。这意味着同步点的搜索将把这些行视为连接在一起的。
如果还给出了 "maxlines={N}" 参数,则搜索匹配项的行的数量将限制为 N。如果您只有很少的东西需要同步并且计算机速度很慢,这很有用。示例
:syntax sync maxlines=100
您可以使用以下命令清除所有同步设置
:syntax sync clear
您可以使用以下命令清除特定的同步模式
:syntax sync clear {sync-group-name} ..

12. 列出语法项 :syntax :sy :syn :syn-list

此命令列出所有语法项
:sy[ntax] [list]
要显示一个语法组的语法项
:sy[ntax] list {group-name}
要列出一个集群中的语法组:E392
:sy[ntax] list @{cluster-name}
有关 ":syntax" 命令的其他参数,请参见上文。
请注意,":syntax" 命令可以缩写为 ":sy",尽管 ":syn" 使用得更多,因为它看起来更好。

13. 高亮命令 :highlight :hi E28 E411 E415

高亮组有两种类型
内置的 highlight-groups
用于特定语言的那些。对于这些,名称以语言名称开头。其中许多没有属性,而是链接到第二种类型的组。 hitest.vim
您可以使用此命令查看当前所有活动的组
:so $VIMRUNTIME/syntax/hitest.vim
这将打开一个新窗口,其中包含所有高亮组名称,以其自身的颜色显示。
:colo :colorscheme E185 :colo[rscheme] 输出当前活动配色方案的名称。这基本上与以下命令相同
:echo g:colors_name
如果 g:colors_name 未定义,则 :colo 将输出 "default"。
:colo[rscheme] {name} 加载配色方案 {name}。这将在 'runtimepath' 中搜索文件 "colors/{name}.{vim,lua}"。找到的第一个文件将被加载。 注意:首先尝试 "colors/{name}.vim"。还会搜索 'packpath' 中的所有插件,首先搜索 "start" 下面的插件,然后搜索 "opt" 下面的插件。
不能递归工作,因此您不能在配色方案脚本中使用 ":colorscheme"。
要自定义配色方案,请使用其他名称,例如 "~/.config/nvim/colors/mine.vim",并使用 :runtime 加载原始配色方案
runtime colors/evening.vim
hi Statement ctermfg=Blue guifg=Blue
加载配色方案之前,将触发 ColorSchemePre 自动命令事件。加载配色方案之后,将触发 ColorScheme 自动命令事件。有关编写配色方案文件的信息,请参见
:edit $VIMRUNTIME/colors/README.txt
:hi[ghlight] 列出所有已设置属性的当前高亮组。
:hi[ghlight] {group-name} 列出一个高亮组。
highlight-clear :hi-clear :hi[ghlight] clear 将所有高亮重置为默认值。删除用户添加的所有组的高亮。使用 'background' 的当前值来决定使用哪个默认颜色。如果存在默认链接,则恢复它。 :hi-link
:hi[ghlight] clear {group-name} :hi[ghlight] {group-name} NONE 禁用一个高亮组的高亮。它不会被设置为默认颜色。
:hi[ghlight] [default] {group-name} {key}={arg} .. 添加一个高亮组,或更改现有组的高亮。有关 {key}={arg} 参数,请参见 highlight-args。有关可选的 [default] 参数,请参见 :highlight-default
通常,高亮组在启动时添加一次。这将设置高亮显示的默认值。之后,您可以使用其他高亮命令来更改要设置为非默认值的那些参数。值 "NONE" 可用于关闭值或返回到默认值。
更改颜色的简单方法是使用 :colorscheme 命令。这将加载一个包含以下 ":highlight" 命令的文件
:hi Comment        gui=bold
请注意,所有未包含的设置都保持不变,只使用指定的字段,并且设置与以前的设置合并。因此,结果就像使用了以下单个命令一样
:hi Comment        ctermfg=Cyan guifg=#80a0ff gui=bold
:highlight-verbose
当列出一个高亮组并且 'verbose' 不为零时,列表还将说明它最后是在哪里设置的。示例
:verbose hi Comment
Comment xxx ctermfg=4 guifg=Blue
Last set from /home/mool/vim/vim7/runtime/syntax/syncolor.vim
当使用 ":hi clear" 时,将提及使用此命令的脚本的默认值。有关详细信息,请参见 :verbose-cmd
highlight-args E416 E417 E423 高亮有两种类型的 UI:cterm 终端 UI (TUI) gui GUI 或支持 RGB 的 TUI ('termguicolors')
对于每种类型,都可以给出高亮。这使得在所有 UI 上使用相同的语法文件成为可能。
1. TUI 高亮参数
bold underline undercurl underdouble underdotted underdashed inverse italic standout strikethrough altfont nocombine
cterm={attr-list} attr-list highlight-cterm E418 attr-list 是以下项目的逗号分隔列表(不含空格)(可以按任何顺序):bold underline undercurl curly underline underdouble double underline underdotted dotted underline underdashed dashed underline strikethrough reverse inverse same as reverse italic standout altfont nocombine 覆盖属性而不是合并它们 NONE 不使用属性(用于重置它)
请注意,这里可以使用 "bold" 并使用粗体字。它们具有相同的效果。"undercurl"、"underdouble"、"underdotted" 和 "underdashed" 在不支持它们的终端中回退到 "underline"。颜色使用 guisp 设置。
start={term-list} highlight-start E422 stop={term-list} term-list highlight-stop 这些终端代码列表可用于在终端上获得非标准属性。
使用 "start" 参数指定的转义序列将在高亮区域的字符之前写入。它可以是您想要发送到终端以高亮显示此区域的任何内容。使用 "stop" 参数指定的转义序列将在高亮区域之后写入。这应该撤消 "start" 参数。否则,屏幕将显示混乱。
{term-list} 是包含转义序列的字符串。这可以是任何字符的字符串,但它不能以 "t_" 开头,并且不允许空格。这里会识别 <> 符号,因此您可以使用诸如 "<Esc>" 和 "<Space>" 之类的内容。示例:start=<Esc>[27h;<Esc>[<Space>r;
ctermfg={color-nr} ctermfg E421 ctermbg={color-nr} ctermbg
{color-nr} 参数是一个颜色编号。它的范围是零到(不包括)可用的 tui-colors 的数量。具有此编号的实际颜色取决于终端类型及其设置。有时颜色还取决于 "cterm" 的设置。例如,在某些系统上,"cterm=bold ctermfg=3" 会给出另一种颜色,而在其他系统上,您只会获得颜色 3。
以下(不区分大小写)的名称将被识别
cterm-colors
NR-16 NR-8 COLOR NAME
0 0 Black 1 4 DarkBlue 2 2 DarkGreen 3 6 DarkCyan 4 1 DarkRed 5 5 DarkMagenta 6 3 Brown, DarkYellow 7 7 LightGray, LightGrey, Gray, Grey 8 0* DarkGray, DarkGrey 9 4* Blue, LightBlue 10 2* Green, LightGreen 11 6* Cyan, LightCyan 12 1* Red, LightRed 13 5* Magenta, LightMagenta 14 3* Yellow, LightYellow 15 7* White
"NR-16" 下的编号用于 16 色终端('t_Co' 大于或等于 16)。"NR-8" 下的编号用于 8 色终端('t_Co' 小于 16)。"*" 表示为 ctermfg 设置了粗体属性。在许多 8 色终端(例如 "linux")中,这会导致亮色出现。这对于背景色不起作用!没有 "*",则会删除粗体属性。如果您想以不同的方式设置粗体属性,请在 "ctermfg=" 或 "ctermbg=" 参数之后放置 "cterm=" 参数。或者使用数字而不是颜色名称。
请注意,对于 16 色 ansi 风格的终端(包括 xterms),将使用 NR-8 列中的编号。在这里,"*" 表示 "添加 8",因此 Blue 是 12,DarkGray 是 8 等等。
请注意,对于某些彩色终端,这些名称可能会导致错误的颜色!
您还可以使用 "NONE" 来删除颜色。
:hi-normal-cterm
当为 Normal 组设置 "ctermfg" 或 "ctermbg" 颜色时,它们将成为用于非高亮文本的颜色。示例
:highlight Normal ctermfg=grey ctermbg=darkblue
当设置 Normal 组的 "ctermbg" 颜色时,如果颜色被识别并且 'background' 没有被显式设置,则 'background' 选项将被自动调整。这会导致依赖于 'background' 的高亮组发生改变!这意味着您应该先设置 Normal 的颜色,然后再设置其他颜色。当使用配色方案时,更改 'background' 会导致配色方案重新加载,这可能会重置所有颜色(包括 Normal)。如果您不希望这样,请先删除 "g:colors_name" 变量。
当您为 Normal 组设置了 "ctermfg" 或 "ctermbg" 时,Vim 需要在退出时重置颜色。这是使用 "orig_pair" terminfo 条目完成的。 E419 E420 当 Vim 知道正常的 foreground 和 background 颜色时,"fg" 和 "bg" 可以用作颜色名称。这仅在设置 Normal 组的颜色和 MS-Windows 控制台的颜色后才有效。例如,用于反向视频
:highlight Visual ctermfg=bg ctermbg=fg
请注意,使用的是在执行此命令时有效的颜色。如果 Normal 组的颜色稍后更改,"fg" 和 "bg" 颜色将不会调整。
2. GUI 高亮参数
gui={attr-list} highlight-gui
这些参数指定在 GUI 模式下使用的属性。有关说明,请参见 attr-list。请注意,"bold" 可以在这里使用,也可以使用粗体字体。它们具有相同的效果。请注意,这些属性对 "Normal" 组会被忽略。
font={font-name} highlight-font
font-name 是字体的名称,在 Vim 运行的系统上使用。对于 X11,这是一个复杂的名称,例如
font=-misc-fixed-bold-r-normal--14-130-75-75-c-70-iso8859-1
可以使用字体名称 "NONE" 来恢复默认字体。当为 "Normal" 组设置字体时,它将成为默认字体(直到 'guifont' 选项更改;最后设置的字体将被使用)。以下内容仅适用于 Motif,不适用于其他 GUI:当为 "Menu" 组设置字体时,菜单将发生更改。当为 "Tooltip" 组设置字体时,工具提示将发生更改。除 Menu 和 Tooltip 外,所有使用的字体都应与默认字体的字符大小相同!否则将出现重绘问题。要使用包含空格或其他特殊字符的字体名称,请将其放在单引号中。单引号不能使用。例如
:hi comment font='Monospace 10'
guifg={color-name} guifg
guibg={color-name} guibg
guisp={color-name} guisp
这些参数指定在 GUI 中使用的 foreground (guifg)、background (guibg) 和 special (guisp) 颜色。 "guisp" 用于各种下划线。有一些特殊名称:NONE 没有颜色(透明) bg 使用正常的 background 颜色 background 使用正常的 background 颜色 fg 使用正常的 foreground 颜色 foreground 使用正常的 foreground 颜色 要使用包含空格或其他特殊字符的颜色名称,请将其放在单引号中。单引号不能使用。例如
:hi comment guifg='salmon pink'
gui-colors
建议的颜色名称(这些名称在大多数系统上可用):Red LightRed DarkRed Green LightGreen DarkGreen SeaGreen Blue LightBlue DarkBlue SlateBlue Cyan LightCyan DarkCyan Magenta LightMagenta DarkMagenta Yellow LightYellow Brown DarkYellow Gray LightGray DarkGray Black White Orange Purple Violet
定义 Nvim 默认配色方案的颜色:NvimDarkBlue NvimLightBlue NvimDarkCyan NvimLightCyan NvimDarkGray1 NvimLightGray1 NvimDarkGray2 NvimLightGray2 NvimDarkGray3 NvimLightGray3 NvimDarkGray4 NvimLightGray4 NvimDarkGreen NvimLightGreen NvimDarkMagenta NvimLightMagenta NvimDarkRed NvimLightRed NvimDarkYellow NvimLightYellow
您也可以使用其 RGB (red, green, blue) 值来指定颜色。格式为 "#rrggbb",其中 "rr" 是红色值 "gg" 是绿色值 "bb" 是蓝色值 所有值都是十六进制,范围从 "00" 到 "ff"。例如
:highlight Comment guifg=#11f0c3 guibg=#ff00ff
blend={integer} highlight-blend opacity 覆盖 popupmenu 或浮动窗口中高亮组的混合级别。仅当 'pumblend''winblend' 为菜单或窗口设置时才生效。请参阅相关选项的帮助。
另请参阅 nvim_buf_set_extmark() 的 "blend" 标志。
highlight-groups highlight-default 这些是内置的高亮组。请注意,高亮取决于 'background' 的值。您可以使用 ":highlight" 命令查看当前设置。 hl-ColorColumn
ColorColumn 用于使用 'colorcolumn' 设置的列。 hl-Conceal
Conceal 隐藏文本的占位符字符(请参见 'conceallevel')。 hl-CurSearch
CurSearch 最后一个搜索模式的当前匹配项(请参见 'hlsearch')。 注意:这在搜索后是正确的,但如果进行了更改或屏幕被重新绘制,可能会过时。 hl-Cursor hl-lCursor 光标下的字符。 lCursor 当使用 语言映射 时光标下的字符(请参见 'guicursor')。 hl-CursorIM
CursorIM 与 Cursor 相似,但在 IME 模式下使用。 CursorIM hl-CursorColumn
CursorColumn 光标所在的屏幕列,当 'cursorcolumn' 设置时。 hl-CursorLine
CursorLine 光标所在的屏幕行,当 'cursorline' 设置时。如果 foreground (ctermfg OR guifg) 没有设置,则优先级较低。 hl-Directory
Directory 目录名(以及列表中的其他特殊名称)。 hl-DiffAdd
DiffAdd Diff 模式:添加的行。 diff.txt hl-DiffChange
DiffChange Diff 模式:更改的行。 diff.txt hl-DiffDelete
DiffDelete Diff 模式:删除的行。 diff.txt hl-DiffText
DiffText Diff 模式:更改行内的更改文本。 diff.txt hl-EndOfBuffer
EndOfBuffer 缓冲区末尾后的填充行(~)。默认情况下,它与 hl-NonText 相似。 hl-TermCursor
TermCursor 处于焦点状态的终端中的光标。 hl-TermCursorNC
TermCursorNC 处于非焦点状态的终端中的光标。 hl-ErrorMsg
ErrorMsg 命令行上的错误消息。 hl-WinSeparator
WinSeparator 窗口分割之间的分隔符。 hl-Folded
Folded 用于关闭折叠的行。 hl-FoldColumn
FoldColumn 'foldcolumn' hl-SignColumn
SignColumn 显示 符号 的列。 hl-IncSearch
IncSearch 'incsearch' 高亮;也用于用 ":s///c" 替换的文本。 hl-Substitute
Substitute :substitute 替换文本高亮。 hl-LineNr
LineNr ":number" 和 ":#" 命令的行号,以及当 'number''relativenumber' 选项设置时。 hl-LineNrAbove
LineNrAbove 当 'relativenumber' 选项设置时,光标行上方的行号。 hl-LineNrBelow
LineNrBelow 当 'relativenumber' 选项设置时,光标行下方的行号。 hl-CursorLineNr
CursorLineNr 当 'cursorline' 设置且 'cursorlineopt' 包含 "number" 或为 "both" 时,光标行的 LineNr。 hl-CursorLineFold
CursorLineFold 当 'cursorline' 为光标行设置时,与 FoldColumn 相似。 hl-CursorLineSign
CursorLineSign 当 'cursorline' 为光标行设置时,与 SignColumn 相似。 hl-MatchParen
MatchParen 光标下的字符或其之前的字符,如果它是成对的括号,以及它的匹配项。 pi_paren.txt hl-ModeMsg
ModeMsg 'showmode' 消息(例如,"-- INSERT --")。 hl-MsgArea
MsgArea 消息和命令行的区域,另请参见 'cmdheight'hl-MsgSeparator
MsgSeparator 滚动消息的分隔符 msgsephl-MoreMsg
MoreMsg 更多提示 hl-NonText
NonText 窗口末尾的 "@"、来自 'showbreak' 的字符以及文本中实际上不存在的其他字符(例如,当双倍宽字符不适合在行尾时显示的 ">")。另请参见 hl-EndOfBufferhl-Normal
Normal 普通文本。 hl-NormalFloat
NormalFloat 浮动窗口中的普通文本。 hl-FloatBorder
FloatBorder 浮动窗口的边框。 hl-FloatTitle
FloatTitle 浮动窗口的标题。 hl-FloatFooter
FloatFooter 浮动窗口的页脚。 hl-NormalNC
NormalNC 非当前窗口中的普通文本。 hl-Pmenu
Pmenu 弹出菜单:普通项目。 hl-PmenuSel
PmenuSel 弹出菜单:选定的项目。与 hl-Pmenu 相结合。 hl-PmenuKind
PmenuKind 弹出菜单:普通项目 "kind"。 hl-PmenuKindSel
PmenuKindSel 弹出菜单:选定的项目 "kind"。 hl-PmenuExtra
PmenuExtra 弹出菜单:普通项目 "额外文本"。 hl-PmenuExtraSel
PmenuExtraSel 弹出菜单:选定的项目 "额外文本"。 hl-PmenuSbar
PmenuSbar 弹出菜单:滚动条。 hl-PmenuThumb
PmenuThumb 弹出菜单:滚动条的滑块。 hl-PmenuMatch
PmenuMatch 弹出菜单:普通项目中的匹配文本。与 hl-Pmenu 相结合。 hl-PmenuMatchSel
PmenuMatchSel 弹出菜单:选定项中的匹配文本。与 hl-PmenuMatchhl-PmenuSel 结合使用。 hl-Question
Question hit-enter 提示和是/否问题。 hl-QuickFixLine
QuickFixLine 快速修复窗口中的当前 quickfix 项。当光标位于此处时,与 hl-CursorLine 结合使用。 hl-Search
Search 最后一个搜索模式的突出显示(参见 'hlsearch')。也用于需要突出的类似项目。 hl-SnippetTabstop
SnippetTabstop 代码片段中的制表位。 vim.snippet hl-SpecialKey
SpecialKey 不可打印字符:显示的文本与实际文本不同。但不是 'listchars' 空格。 hl-Whitespace hl-SpellBad
SpellBad 拼写检查器无法识别的单词。 spell 与其他使用的突出显示相结合。 hl-SpellCap
SpellCap 应该以大写字母开头的单词。 spell 与其他使用的突出显示相结合。 hl-SpellLocal
SpellLocal 拼写检查器识别为在另一个区域使用的单词。 spell 与其他使用的突出显示相结合。 hl-SpellRare
SpellRare 拼写检查器识别为很少使用的单词。 spell 与其他使用的突出显示相结合。 hl-StatusLine
StatusLine 当前窗口的状态行。 hl-StatusLineNC
StatusLineNC 非当前窗口的状态行。 hl-StatusLineTerm
StatusLineTerm 终端 窗口的状态行。 hl-StatusLineTermNC
StatusLineTermNC 非当前 终端 窗口的状态行。 hl-TabLine
TabLine 选项卡页行,而不是活动选项卡页标签。 hl-TabLineFill
TabLineFill 选项卡页行,没有标签的地方。 hl-TabLineSel
TabLineSel 选项卡页行,活动选项卡页标签。 hl-Title
Title ":set all"、":autocmd" 等输出的标题。 hl-Visual
Visual 视觉模式选择。 hl-VisualNOS
VisualNOS 当 vim “不拥有选择”时,视觉模式选择。 hl-WarningMsg
WarningMsg 警告消息。 hl-Whitespace
Whitespace 'listchars' 中的 "nbsp"、"space"、"tab"、"multispace"、"lead" 和 "trail"。 hl-WildMenu
WildMenu 'wildmenu' 完成中的当前匹配项。 hl-WinBar
WinBar 当前窗口的窗口栏。 hl-WinBarNC
WinBarNC 非当前窗口的窗口栏。
hl-User1 hl-User1..9 hl-User9 'statusline' 语法允许在状态行和标尺(通过 'rulerformat')中使用 9 种不同的突出显示。名称为 User1 到 User9。
对于 GUI,您可以使用以下组来设置菜单、滚动条和工具提示的颜色。它们没有默认值。这对于 Win32 GUI 不起作用。这里只有三个突出显示参数有效:font、guibg 和 guifg。
hl-Menu
Menu 菜单的当前字体、背景和前景颜色。也用于工具栏。适用的突出显示参数:font、guibg、guifg。
hl-Scrollbar
Scrollbar 主窗口滚动条的当前背景和前景。适用的突出显示参数:guibg、guifg。
hl-Tooltip
Tooltip 工具提示的当前字体、背景和前景。适用的突出显示参数:font、guibg、guifg。
当您想对多个语法组使用相同的突出显示时,您可以通过将这些组链接到一个通用的突出显示组,并仅对该组提供颜色属性,从而更轻松地完成此操作。
要设置链接
:hi[ghlight][!] [default] link {from-group} {to-group}
要删除链接
:hi[ghlight][!] [default] link {from-group} NONE
注意: E414
如果 {from-group} 和/或 {to-group} 不存在,则会创建它。对于不存在的组,您不会收到错误消息。
一旦您对链接组使用 ":highlight" 命令,链接就会被移除。
如果 {from-group} 已经存在突出显示设置,则不会建立链接,除非给出 '!'。对于源文件中 ":highlight link" 命令,您不会收到错误消息。这可用于跳过已具有设置的组的链接。
:hi-default :highlight-default [default] 参数用于设置组的默认突出显示。如果已经为该组指定了突出显示,则命令将被忽略。如果存在现有链接,也会忽略。
使用 [default] 特别有用,可以覆盖特定语法文件的突出显示。例如,C 语法文件包含
:highlight default link cComment Comment
如果您喜欢 C 注释的 Question 突出显示,请将此内容放在您的 vimrc 文件中
:highlight link cComment Question
如果没有 C 语法文件中的 "default",当加载语法文件时,突出显示将被覆盖。
要让链接在 :highlight clear 后仍然存在,如果您对特定文件类型进行了突出显示,并且希望在选择其他配色方案时保留它,请在 "after/syntax/{filetype}.vim" 文件中添加类似下面的命令
highlight! default link cComment Question

15. 清理 :syn-clear E391

如果您想清除当前缓冲区的语法内容,可以使用此命令
:syntax clear
当您想关闭语法突出显示,或者想切换到使用其他语法时,应使用此命令。它通常在语法文件本身中不需要,因为语法会通过加载语法文件的自动命令清除。该命令还会删除 "b:current_syntax" 变量,因为执行此命令后不会加载任何语法。
要清理当前缓冲区的特定语法组
:syntax clear {group-name} ..
这将删除 {group-name} 的所有模式和关键字。
要清理当前缓冲区的特定语法组列表
:syntax clear @{grouplist-name} ..
这会将 {grouplist-name} 的内容设置为一个空列表。
:syntax-off :syn-off 如果你想对所有缓冲区禁用语法高亮,你需要移除加载语法文件的自动命令
:syntax off
此命令实际执行的命令是
:source $VIMRUNTIME/syntax/nosyntax.vim
有关详细信息,请参见 "nosyntax.vim" 文件。请注意,要使此方法正常工作,$VIMRUNTIME 必须有效。参见 $VIMRUNTIME
:syntax-reset :syn-reset 如果您更改了颜色并且弄乱了它们,请使用此命令使颜色恢复为默认值
:syntax reset
这是一个有点错误的名称,因为它不会重置任何语法项目,只会影响突出显示。
请注意,您在 vimrc 文件中设置的语法颜色也会重置回 Vim 默认值。请注意,如果您使用配色方案,则配色方案为语法突出显示定义的颜色将丢失。
请注意,当使用配色方案时,可能会对您定义的颜色或配色方案中的颜色有所混淆。这取决于配色方案文件。参见 :colorscheme

16. 突出显示标签 tag-highlight

如果您想突出显示文件中的所有标签,可以使用以下映射。
<F11> -- 生成 tags.vim 文件,并突出显示标签。<F12> -- 只根据现有的 tags.vim 文件突出显示标签。
:map <F11>  :sp tags<CR>:%s/^\([^        :]*:\)\=\([^        ]*\).*/syntax keyword Tag \2/<CR>:wq! tags.vim<CR>/^<CR><F12>
:map <F12>  :so tags.vim<CR>
警告: 标签文件越长,此操作的速度越慢,Vim 占用的内存越多。
也可以只突出显示 typedef、union 和 struct。为此,您必须使用 Universal Ctags (https://ctags.io) 或 Exuberant ctags。
在您的 Makefile 中添加以下几行
# Make a highlight file for types.  Requires Universal/Exuberant ctags and awk
types: types.vim
types.vim: *.[ch]
        ctags --c-kinds=gstu -o- *.[ch] |\
                awk 'BEGIN{printf("syntax keyword Type\t")}\
                        {printf("%s ", $$1)}END{print ""}' > $@
并在您的 vimrc 中添加以下几行
" load the types.vim highlighting file, if it exists
autocmd BufRead,BufNewFile *.[ch] let fname = expand('<afile>:p:h') .. '/types.vim'
autocmd BufRead,BufNewFile *.[ch] if filereadable(fname)
autocmd BufRead,BufNewFile *.[ch]   exe 'so ' .. fname
autocmd BufRead,BufNewFile *.[ch] endif

17. 窗口本地语法 :ownsyntax

通常,缓冲区上的所有窗口共享相同的语法设置。但是,可以将文件上的特定窗口设置为具有自己的私有语法设置。一个可能的例子是在一个窗口中使用传统突出显示来编辑 LaTeX 源代码,而在另一个窗口中以不同的方式突出显示相同的源代码(以便隐藏控制序列并指示粗体、斜体等区域)。这里 'scrollbind' 选项很有用。
要将当前窗口设置为具有语法 "foo",与缓冲区上的所有其他窗口分开
:ownsyntax foo
w:current_syntax
这会将 "w:current_syntax" 变量设置为 "foo"。 "b:current_syntax" 的值不会改变。这是通过保存和恢复 "b:current_syntax" 来实现的,因为语法文件确实设置了 "b:current_syntax"。语法文件设置的值会分配给 "w:current_syntax"。注意: 这会重置 'spell''spellcapcheck''spellfile''spelloptions' 选项。
一旦窗口具有自己的语法,从同一缓冲区上的其他窗口(包括 :syntax clear)执行的语法命令将不会产生任何影响。相反,从该窗口执行的语法命令不会影响同一缓冲区上的其他窗口。
当另一个缓冲区加载到该窗口中或文件重新加载时,具有自己语法的窗口会恢复正常行为。当拆分窗口时,新窗口将使用原始语法。

18. 彩色 xterm xterm-color color-xterm

colortest.vim
要测试您的颜色设置,Vim 发行版中包含了一个文件。要使用它,请执行以下命令
:runtime syntax/colortest.vim
Nvim 尽可能使用 256 色和 真彩色 终端功能。

19. 语法速度慢时 :syntime

这针对语法文件作者。
如果你的语法导致重绘速度变慢,这里有一些关于如何加快速度的提示。要查看速度是否变慢,请开启一些通常会干扰的特性,例如 'relativenumber'折叠
要找出哪些模式消耗了最多的时间,请使用以下序列进行概览
:syntime on
[ redraw the text at least once with CTRL-L ]
:syntime report
这将显示一个语法模式列表,按匹配文本所花费的时间排序。
:syntime on 开始测量语法时间。这会增加一些开销来计算语法模式匹配所花费的时间。
:syntime off 停止测量语法时间。
:syntime clear 将所有计数器重置为零,重新开始测量。
:syntime report 显示当前窗口中 ":syntime on" 之后使用的语法项。使用更宽的显示以查看更多输出。
列表按总时间排序。列分别是:TOTAL 匹配此模式所花费的总时间(以秒为单位)。COUNT 模式使用次数。MATCH 模式实际匹配次数。SLOWEST 一次尝试的最长时间。AVERAGE 一次尝试的平均时间。NAME 语法项的名称。请注意,这不是唯一的。PATTERN 使用的模式。
当模式匹配必须尝试许多备选方案时,速度会变慢。尝试尽可能多地包含文字文本,以减少模式不匹配的方式数量。
使用 "\@<=" 和 "\@<!" 项目时,添加最大尺寸以避免在当前行和前一行中的所有位置尝试。例如,如果该项目是文字文本,请指定该文本的尺寸(以字节为单位)。
"<\@<=span" 在 "<span" 中匹配 "span"。这会在许多位置尝试与 "<" 匹配。"<\@1<=span" 匹配相同的内容,但只尝试 "span" 之前的 1 个字节。
主目录
命令索引
快速参考