syntax

syntax.txt 适用于 Vim 9.2 版本。 最近更新: 2026年7月 VIM 参考手册 by Bram Moolenaar 译者: Willis 语法高亮 syntax syntax-highlighting coloring 语法高亮使 Vim 用不同字体或颜色显示文本的不同部分。可用关键字或模式匹配来指定 不同部分。为了保持快速,Vim 不会完整分析整个文件,高亮功能因此有其限制。此功能 更准确的叫法是词法高亮,但语法高亮已是约定俗成,本文档沿用该名称。 Vim 在所有终端上支持语法高亮。但多数普通终端色彩渲染能力有限,GUI 版本 gvim 的 语法高亮的效果最佳。 用户手册参考: usr_06.txt 语法高亮基础入门。 usr_44.txt 语法文件编写教程。 1. 快速入门 :syn-qstart 2. 语法文件 :syn-files 3. 语法加载流程 syntax-loading 4. 转换为 HTML 2html.vim 5. 语法文件相关说明 :syn-file-remarks 6. 语法定义 :syn-define 7. :syntax 命令参数 :syn-arguments 8. 语法模式 :syn-pattern 9. 语法簇 :syn-cluster 10. 内嵌语法文件 :syn-include 11. 语法同步 :syn-sync 12. 列出语法项目 :syntax 13. 色彩方案 color-schemes 14. Highlight 命令 :highlight 15. 高亮组链接 :highlight-link 16. 清理语法 :syn-clear 17. 标签高亮 tag-highlight 18. 窗口局部语法 :ownsyntax 19. 彩色 xterm xterm-color 20. 语法高亮性能排查 :syntime {Vi 无此功能} {仅当编译时加入 +syntax 特性才有效}

1. 快速入门 :syn-qstart

:syn-enable :syntax-enable 开启语法高亮的命令为: :syntax enable 该命令实际执行如下命令 :source $VIMRUNTIME/syntax/syntax.vim 未设置 VIM 环境变量时,Vim 会自动检索路径 (见 $VIMRUNTIME )。 一般可正常加 载,如果失效,可将 VIM 环境变量手动设为 Vim 相关文件实际所在目录。例如,假定语 法文件位于 "/usr/vim/vim82/syntax" 目录,启动 Vim 前,可从外壳上将 $VIMRUNTIME 设为 "/usr/vim/vim82"。 GUI 正在运行或即将启动时,此命令还会加载 menu.vim 脚本。要跳过菜单加载,可见 'go-M' :syn-on :syntax-on `:syntax enable` 命令会保留绝大部分当前高亮设置。在其前后执行 :highlight 命 令自定义颜色均可。要 Vim 用系统缺省值覆盖全部自定义设置,可用: :syntax on :hi-normal :highlight-normal 运行在 GUI 环境上时,可设置黑底白字: :highlight Normal guibg=Black guifg=White 关于色彩终端,见 :hi-normal-cterm 。 关于自定义语法高亮色彩,见 syncolor注意: MS-Windows 上的语法文件以 <CR><NL> 结束每一行。Unix 上则以 <NL> 结尾。一 般需使用对应系统格式的文件。不过,在 MS-Windows 上,'fileformats' 选项非空时会 自动适配换行格式。 注意: 反色 ("gvim -fg white -bg black") 启动时,'background' 缺省值要等到 GUI 窗口打开时才会实际设置。这通常晚于 gvimrc 加载,导致缺省语法高亮设置错误。要 在启动高亮前正确初始化 'background' 缺省值,需在 gvimrc 文件中包含 :gui 命 令: :gui " 打开窗口并初始化 'background' 缺省值 :syntax on " 启动语法高亮,使用正确 'background' 值适配颜色 注意: 在 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} 是语言的全称或缩写 (为兼容 DOS 文件系统,文件名必须限制在 8.3 字符 范围)。 例如: c.vim perl.vim java.vim html.vim cpp.vim sh.vim csh.vim 语法文件和 vimrc 文件一样,可包含任意 Ex 命令。但仅应存放对应语言的高亮规则。 假定一门语言是另一门语言的超集,可加载后者的对应语法文件。例如,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 自定义语法文件后,要使 `:syntax enable` 能自动加载,步骤如下: 1. 创建用户运行时目录。通常取 'runtimepath' 选项的首项。Unix 示例: mkdir ~/.vim 2. 在其中创建 "syntax" 目录。Unix 上: mkdir ~/.vim/syntax 3. 编写或下载 Vim 语法文件。写入用户 syntax 目录。"mine" 语法示例: :w ~/.vim/syntax/mine.vim 现在可手动启用该语法: :set syntax=mine 无需退出 Vim 即可生效。 要使 Vim 自动检测文件类型,见 new-filetype 。 要在多个用户共用环境下统一部署公共语法文件,可选用 'runtimepath' 下的其他目 录。 添 加 到 已 存 在 的 语 法 文 件 mysyntaxfile-add 对已有语法文件大体满意,只需对高亮项目作少量增删时,步骤如下: 1. 创建用户 'runtimepath' 目录,见上。 2. 在其中创建 "after/syntax" 目录。Unix 上: mkdir -p ~/.vim/after/syntax 3. 编写 Vim 脚本,包含自定义高亮命令。C 语法色彩更改示例: highlight cComment ctermfg=Green guifg=Green 4. 将脚本写入 "after/syntax" 目录。文件名必须是语法名加上 ".vim"。C 语法示例: :w ~/.vim/after/syntax/c.vim 大功告成。下次编辑 C 文件时,Comment 色彩就会自动调整。甚至无需重启 Vim。 支持多个扩展脚本。为此,可用文件类型作为目录名,该目录下所有的 "*.vim" 脚本会 被自动加载。例如: ~/.vim/after/syntax/c/one.vim ~/.vim/after/syntax/c/two.vim 替 换 已 有 语 法 文 件 mysyntaxfile-replace 对官方发布的语法文件版本不满意,或已下载新版本时,可按照上面 mysyntaxfile 所 述的相同步骤进行操作。只需确保将语法文件写入 'runtimepath' 靠前目录即可,因为 Vim 仅加载首个找到的语法脚本,前提是该脚本设置了 b:current_syntax 。 命 名 惯 例 group-name {group-name} E669 W18 语法组名用于表示匹配同类内容的语法项。语法组再链接到指定颜色的高亮组。语法组名 本身不指定任何颜色或显示属性。 高亮组或语法组的名称必须由 ASCII 字母、数位、下划线、句号或连字符组成。正则模 式记法为: "[a-zA-Z0-9_.-]*"。不过,如果使用其他非法字符,Vim 不会报错。组名最 大长度约 200 字节。 E1249 要方便用户自由选用配色方案,多语言通同的高亮组需要一套标准名称。以下是推荐使用 的组名 (语法高亮正确工作时,此处应能看到实际颜色,"Ignore" 除外): *Comment v 任意注释 *Constant v 任意常数 String v 字符串常数: "这是字符串" Character v 字符常数: 'c'、'\n' Number v 数值常数: 234、0xff Boolean v 布尔型常数: TRUE、false Float v 浮点常数: 2.3e10 *Identifier v 任意变量名 Function v 函数名 (也包括: 类方法名) *Statement v 任意语句 Conditional v if、then、else、endif、switch 等 Repeat v for、do、while 等 Label v case、default 等 Operator v "sizeof"、"+"、"*" 等 Keyword v 其他关键字 Exception v try、catch、throw *PreProc v 通用预处理命令 Include v 预处理命令 #include Define v 预处理命令 #define Macro v 同 Define PreCondit v 预处理命令 #if、#else、#endif 等 *Type v int、long、char 等类型 StorageClass v static、register、volatile 等存储类 Structure v struct、union、enum 等结构类型 Typedef v typedef 定义 *Special v 任意特殊符号 SpecialChar v 常数中的特殊字符 Tag v 可以使用 CTRL-] 的标签项目 Delimiter v 需要留意的字符 SpecialComment v 注释内部的特殊内容 Debug v 调试语句 *Underlined v 突出显示的文本、HTML 链接 *Bold v 粗体文本 *Italic v 斜体文本 *BoldItalic v 粗斜体文本 *Ignore v 留空,被隐藏文本 hl-Ignore *Error v 错误语法结构 *Todo v 需要额外留意的内容;通常为关键字 TODO、FIXME 和 XXX *Added v 差异文中的新增行 *Changed v 差异文中的修改行 *Removed v 差异文中的删除行 * 标记的名称为主要组,其余是次要组。"syntax.vim" 文件为主要组提供缺省高亮设 置。次要组则链接到主要组,从而继承相同高亮设置。加载 "syntax.vim" 文件后,可用 :highlight 命令覆盖高亮组的缺省值。 注意 高亮组名大小写不敏感。"String" 和 "string" 指向同一个组。 以下名称为保留字,不可用作组名: NONE ALL ALLBUT contains contained hl-Ignore 使用 Ignore 组的场合,也可考虑改用隐藏机制。见 conceal

3. 语法加载流程 syntax-loading

本节详细解释命令 `:syntax enable` 执行时的具体步骤。Vim 初始化自身时,已确定运 行时文件所在位置。以下用到的 $VIMRUNTIME 变量就指向该位置。 `:syntax enable` 和 `:syntax on` 执行以下步骤: 执行 $VIMRUNTIME/syntax/syntax.vim | +- 执行 $VIMRUNTIME/syntax/nosyntax.vim,清空所有旧语法项 | +- 执行 'runtimepath' 下首个可用的 syntax/synload.vim | | | +- 设置语法高亮配色。已定义色彩方案时,会通过 ":colors {name}" 再次加 | | 载。否则执行 `:runtime! syntax/syncolor.vim :syntax on` 会覆盖 | | 已有颜色,而 `:syntax enable` 仅设置尚未定义的组。 | | | +- 设置 Syntax 自动命令,以便在设置 'syntax' 选项时,自动加载对应的 | | 语法文件。 synload-1 | | | +- 执行 mysyntaxfile 变量指定的用户可选文件。仅用于兼容 Vim 5.x。 | | (译者注: 与 mysyntaxfile 不同,后者是新版的推荐机制) synload-2 | +- 执行 `:filetype on`,后者内部执行 `:runtime! filetype.vim`,加载所有找 | 到的 filetype.vim。因此总会执行 $VIMRUNTIME/filetype.vim。其具体操作 | 是: | | | +- 根据后缀注册自动命令,用于设置 'filetype' 选项。已知文件类型与文件 | | 名的关联在此处建立。 synload-3 | | | +- 执行 myfiletypefile 变量指定的用户可选文件。仅用于兼容 Vim 5.x。 | | synload-4 | | | +- 注册自动命令,用于对未能识别的文件类型执行 scripts.vim 脚本。 | | synload-5 | | | +- 执行 $VIMRUNTIME/menu.vim,设置语法菜单。 menu.vim | +- 设置 FileType 自动命令,以便在检测到文件类型后自动设置 'syntax' 选 | 项。 synload-6 | +- 对所有已加载的缓冲区,执行语法相关自动命令 (见下),开启语法高亮。 打开文件时,Vim 查找相应语法文件的步骤如下: 载入文件触发 BufReadPost 自动命令。 | +- 匹配 synload-3 (已知文件类型) 的一条自动命令或通过 synload-4 (用户 | 自定义文件类型) 成功设置文件类型时,相应设置 'filetype' 选项。 | +- 如果文件类型尚未找到,会触发 synload-5 中的自动命令,在'runtimepath' | 里搜索 scripts.vim。因此总会执行 $VIMRUNTIME/scripts.vim。其具体操作 | 是: | | | +- 执行 myscriptsfile 变量指定的用户可选文件。仅用于兼容 Vim 5.x。 | | | +- 如果文件类型仍然未知,读取文件内容进行检测,通过相当于 | "getline(1) =~ pattern" 的匹配规则识别文件类型,成功时设置 | 'filetype'。 | +- 文件类型确定且 'filetype' 已设置时,触发上述 synload-6 定义的 | FileType 自动命令。将 'syntax' 设为已识别的文件类型。 | +- 'syntax' 选项设置后,触发 synload-1 (以及 synload-2 ) 定义的自动命 | 令。后者在 'runtimepath' 里搜索主语法文件: | runtime! syntax/<name>.vim | +- 触发其余用户安装的 FileTypeSyntax 自动命令。可用于为特定语法修 | 正高亮。

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

2html 本身并非语法文件,而是一个用于将当前窗口内容转换成 HTML 的脚本。Vim 会打 开新窗口,在其中构造 HTML 文件。 保存生成文件后,可使用任意浏览器浏览。其中颜色效果应当和 Vim 里所见完全一致。 可置位 g:html_line_ids ,在浏览器地址栏 URL 末尾追加 #L123 或 #123 时,跳转到 相应行。而置位 g:html_dynamic_folds 后,可动态展开或关闭 Vim 中定义的折叠。 不应将 'filetype''syntax' 选项设为 "2html"!要执行该脚本转换当前文件: :runtime! syntax/2html.vim 有诸多变量可以调整 2html.vim 的输出;见下。下面所列所有的开关选项都可通过显式 设置其值开启或关闭,使用 :unlet 删除变量可恢复其缺省值。 评注: - 一些非常老旧的浏览器可能无法显示背景色。 - 大多数浏览器支持彩色打印生成文件! - 如果编译时未加入 GUI 支持,颜色未必准确。 - 新版 TOhtml 需要 Vim 9.1 或更高版本。 Unix 外壳上批量转换所有 .c 和 .h 文件的示例: for f in *.[ch]; do gvim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" $f; done g:html_start_line g:html_end_line 要限制转换的行范围,使用下述的 :TOhtml 命令并加上行范围,也可将 g:html_start_lineg:html_end_line 变量分别设为要转换的首行和末行。例 如,要指定最近可视选区: :let g:html_start_line = line("'<") :let g:html_end_line = line("'>") :runtime! syntax/2html.vim :TOhtml :[range]TOhtml 在标准插件里定义本命令。命令内部会执行 2html.vim 。给 出行范围时, g:html_start_lineg:html_end_line 分别设为范围起止行。省略时默认范围为整个缓冲区。 对参与 diff 的窗口,除非 g:html_diff_one_file 置 位,否则本命令会转换当前标签页里所有参与比较的窗口, 并排放入生成 HTML的一个 <table> 元素内。置位 g:html_line_ids 后,可用锚点跳转到指定窗口的指定行, 例如 #W1L42 会跳到参与比较的首个窗口第 42 行,而 #W3L87 则跳到其中第三个窗口第 87 行。 示例: :10,40TOhtml " 将第 10-40 行转换为 html :'<,'>TOhtml " 转换当前/最近的可视选区 :TOhtml " 转换整个缓冲区 g:html_diff_one_file 缺省值: 0。 为 0 时, :TOhtml 会转换当前标签页里所有参与比较的窗口,并排放入生成 HTML的一 个 <table> 元素内。 为 1 时,只转换当前缓冲区。 示例: let g:html_diff_one_file = 1 g:html_whole_filler 缺省值: 0。 为 0 且 g:html_diff_one_file 为 1 时,超过三行的填充行会显示为三行,其中间行 标注总插入行数。 为 1 时,总是显示所有插入行 (译者注: 原文如此,应为填充行),这也是 g:html_diff_one_file 复位时的行为。 :let g:html_whole_filler = 1 TOhtml-performance g:html_no_progress 缺省值: 0。 为 0 时,转换的每个主要阶段都会在状态行显示进度条。 为 1 时,不显示进度条。可小幅提升转换速度,但无法预估剩余耗时;大文件可能需时 颇长! 示例: let g:html_no_progress = 1 想要获取更大性能提升,可指示 Vim 以非交互方式运行,遍历缓冲区、切换窗口时避免 重绘消耗时间,例如: vim -E -s -c "let g:html_no_progress=1" -c "syntax on" -c "set ft=c" \ -c "runtime syntax/2html.vim" -cwqa myfile.c 注意 -s 标志位跳过 .vimrc 和所有插件的加载,必须手动执行或打开 HTML 转换的相关 设置。详见 -E-s-ex 。建议编写独立脚本,存放所有命令,搭配 -u 参数调 用,而不是逐条写在 -c 之后。 hl-TOhtmlProgress TOhtml-progress-color 进度条显示时,状态行上会出现带色彩色块,展示 HTML 导出进度。背景色缺省取自当前 hl-DiffDelete 高亮组。如果该组和 hl-StatusLine 背景色相同,会自动调整颜色 加以区分。如果不喜欢自动配色,可自定义进度条高亮色。示例: hi TOhtmlProgress guifg=#c0ffee ctermbg=7 g:html_number_lines 缺省值: 当前 'number' 选项值。 为 0 时,生成 HTML 在显示缓冲区文本时不带行号。 为 1 时,生成 HTML 中加入行号栏,使用和 Vim 行号栏相同的高亮 ( hl-LineNr )。 要强制开启行号 (即使 'number' 关闭): :let g:html_number_lines = 1 要强制关闭行号: :let g:html_number_lines = 0 要回到缺省情况,即跟随 'number' 设置,可删除本变量: :unlet g:html_number_lines g:html_line_ids 缺省值: g:html_number_lines 当前值。 为 1 时,为每个行号添加 HTML id 属性,行号不显示时,则插入空 <span> 承载 id。 单缓冲区 HTML 页面的 ID 属性形如 L123,而对包含比较视图的页面,则为 W2L123,ID 可用于跳转到指定行 (比较视图中同时指定窗口)。同时会加入 Javascript 代码,在跳 到指定行之前自动展开目标行所在的关闭折叠 ( g:html_dynamic_folds )。Javascript 代码同时支持 url 指定的 ID 参数省略窗口号与前缀字母 L。示例: page.html#L123 跳转到单缓冲区页面第 123 行 page.html#123 同上 diff.html#W1L42 跳转到比较视图中首个窗口第 42 行 diff.html#42 同上 g:html_use_css 缺省值: 1。 为 1 时,生成合法 HTML 5 并使用层叠样式表 (CSS),现代浏览器和多数旧浏览器均可 兼容。 为 0 时,生成 <font> 等过时标签。不推荐,但适用于完全不支持 CSS 的老旧浏览器、 邮件客户端、论坛编辑器等环境。示例: :let g:html_use_css = 0 g:html_ignore_conceal 缺省值: 0。 为 0 时,可隐藏文本不会导出到 HTML,会根据 'conceallevel' 当前值,替换为 :syn-cchar'listchars' 指定字符。 为 1 时,导出所有缓冲区文本,包含可隐藏 ( conceal ) 文本。 以下两条命令任意一条都可导出缓冲区全部文本 (折叠文本除外): :let g:html_ignore_conceal = 1 :setl conceallevel=0 g:html_ignore_folding 缺省值: 0。 为 0 时,已关闭折叠导出到 HTML 时被 Vim 折叠提示文本 ( fold-foldtext ) 代替。 要在 HTML 中能够手动展开折叠 (同 Vim 中的行为),另见 g:html_dynamic_folds 。 为 1 时,导出所有缓冲区文本;包含已关闭折叠的内部文本。 g:html_dynamic_folds 此时不生效。 以下两条命令任意一条都可导出缓冲区全部文本 (可隐藏文本除外): zR :let g:html_ignore_folding = 1 g:html_dynamic_folds 缺省值: 0。 为 0 时,不导出已关闭折叠的内部文本。 为 1 时,生成 Javascript,支持点击时展开折叠 (同 Vim 中的行为)。 设为 1 时,强制采用 CSS 样式, g:html_use_css 设置不生效。 g:html_ignore_folding 置位时,本变量不生效。 :let g:html_dynamic_folds = 1 g:html_no_foldcolumn 缺省值: 0。 为 0 且 g:html_dynamic_folds 为 1 时,生成类似 Vim ( fold-foldcolumn ) 的折 叠栏,用户可点击以切换折叠开关。生成列的最小宽度使用 'foldcolumn' 当前值。 为 1 时,不生成折叠栏;但可改用 g:html_hover_unfold 机制,该变量置位时鼠标悬 浮折叠文本可展开折叠。 :let g:html_no_foldcolumn = 1 TOhtml-uncopyable-text g:html_prevent_copy 缺省值: 空串。 在网页内选择文本时,本选项可以使某些区块免于被复制。这用于保证用户仅复制-粘贴 原始文本,而不包括额外显示的折叠栏或行号栏。可指定以下字母序列,分别对应要跳过 的区块: f: 折叠栏 n: 行号栏 (也包括折叠文本中的行号) t: 折叠提示文本 d: 比较视图的占位填充行 复制时跳过折叠栏和行号栏的示例: :let g:html_prevent_copy = "fn" 网页防复制的具体实现机制由下述的 g:html_use_input_for_pc 值控制。 g:html_use_input_for_pc 缺省值: "none"。 仅当 g:html_prevent_copy 非空时生效。 为 "all" 时,不可复制区块使用只读 <input> 元素替代普通文本。部分浏览器 (尤其是 旧浏览器) 在全选复制页面时,不粘贴 <input> 标签内容。 g:html_no_invalid 为 0 时,<input> 标签将带上非法类型;此法兼容性更广,但页面无法通过合法验证。 注意: 此法 适用新版 Chrome 及等价浏览器;<input> 标签依然会被粘贴。 为 "fallback" (缺省值 (译者注: 原文如此)) 时,为旧浏览器生成上述 <input> 元 素,但新浏览器 (通过 CSS 特性查询识别) 会隐藏 <input> 元素,改用 ::before CSS 伪元素显示不可复制文本。此法兼容新旧浏览器数量最广。 为 "none" 时,完全不生成 <input> 元素。只使用伪元素方案,旧浏览器 (尤其是 Interenet Explorer) 可能依旧复制禁止复制的文本,或使该文本完全消失不见。但这是 最符合 HTML 标准的方法,生成的标注也更少。 g:html_no_invalid 缺省值: 0。 为 0、 g:html_prevent_copy 非空且 g:html_use_input_for_pc 不是 "none" 时, 会刻意为不可复制区块使用的 <input> 元素插入非法属性。以此阻止部分应用 (特别是 部分版本的 Microsoft Word) 粘贴这些包含非法属性的 <input> 元素。 为 1 时,不插入非法标记,导出页面总能通过合法验证。但部分应用一旦粘贴 <input> 元素后,事后很难清除。 g:html_hover_unfold 缺省值: 0。 为 0 时,只能用 g:html_dynmaic_folds 设置生成的动态折叠,通过点击折叠栏展开 折叠。 为 1 时,可通过 CSS 2.0 机制,使鼠标悬浮在折叠提示文本上时自动展开折叠。适用 Javascript 被禁用的用户查看折叠内容。 注意 旧浏览器 (尤其是 Internet Explorer 6) 不支持该功能。脚本附带 IE6 特定标 记,使用普通 CSS 1 样式作为后备方案以正确显示折叠,但无折叠栏时无法展开折叠。 :let g:html_hover_unfold = 1 g:html_id_expr 缺省值: "" 动态折叠和行号 ID 跳转功能都依赖于文档所用 ID 的唯一性。导出 HTML 嵌入到更大网 页时,ID 唯一性难有保证。此时可设置本变量指定 Vim 表达式,计算结果会作为后缀追 加到给定文档中的每个 ID 上,确保该网页被合并进其他页面时,ID 仍然唯一。例如, 可为每个 ID 追加 _ 以及当前缓冲区编号: :let g:html_id_expr = '"_" .. bufnr("%")' 要为每个 ID 号追加固定后缀 "_mystring": :let g:html_id_expr = '"_mystring"' 注意 转换比较视图时,仅对比较视图首个窗口求值一次,所得后缀用于所有窗口。 TOhtml-wrap-text g:html_pre_wrap 缺省值: 'wrap' 当前值。 为 0 且 g:html_no_pre 为 0 或未设置时,导出 HTML 在浏览器窗口边缘处不回绕。 为 1 且 g:html_use_css 为 1 时,使用 CSS 2.0 "white-space:pre-wrap" 设置,使 文本在浏览器窗口边缘处回绕。 要显式打开回绕: :let g:html_pre_wrap = 1 要显式关闭回绕: :let g:html_pre_wrap = 0 恢复缺省值,由 'wrap' 决定回绕行为: :unlet g:html_pre_wrap g:html_no_pre 缺省值: 0。 为 0 时,导出 HTML 用 <pre>...</pre> 标签包围缓冲区文本。无需特别标记,直接按 原样显示连续空格,按本义使用制表符 (见 g:html_expand_tabs )。 为 1 时 (不推荐),使用普通 <div> 代替 <pre> 标签,连续空格用 "&nbsp;" 的序列替 换,<br> 用于结束每行。该方案同样可以实现文本回绕,更好兼容旧浏览器,但生成页 面与 Vim 的显示效果差别显著。 :let g:html_no_pre = 1 g:html_no_doc 缺省值: 0。 为 1 时,不生成完整 HTML 文档,省略 DOCTYPE、<head><body> 等结构标签。打开 g:html_use_css (缺省) 时,需要自行补充 CSS 样式。 g:html_dynamic_foldsg:html_line_ids 设置 (缺省关闭) 还会附带生成 JavaScript 代码。 g:html_no_links 缺省值: 0。 开启后,不为形如 URL 的文本自动生成 <a> 标签。 g:html_no_modeline 缺省值: 0。 开启后,不再生成用于禁止折叠的模式行 (译者注: 导出 HTML 要计算折叠耗时太长)。 g:html_expand_tabs 缺省值: 'tabstop' 为 8、'expandtab' 关闭,未使用 'vartabstop',且导出 HTML 不 使用折叠栏或行号栏时,缺省为 0; 否则,缺省为 1。 为 1 时,缓冲区文本中的 <Tab> 替换为对应数量的空格 ( g:html_no_pre 为 1 时, 则替换为 "&nbsp;")。 为 0 且 g:html_no_pre 为 0 或未设置时,缓冲区文本中的 <Tab> 字符按原样写入 导出 HTML。便于浏览器复制粘贴时不丢失源文档中的实际空白。注意 除非符合缺省条 件,手动设为 0 很容易造成页面文本的对齐与缩进出现错乱。 强制保留 <Tab> 字符: :let g:html_expand_tabs = 0 强制扩展制表符: :let g:html_expand_tabs = 1 TOhtml-encoding-detect TOhtml-encoding 要部署到网页服务器的内容,强烈建议通过 g:html_use_encoding 指定编码。 未指定编码时,使用 'fileencoding' 当前值 (非空时优先使用) 或 'encoding' 当前值 的首选 IANA 名作为字符集名。部分特殊 'buftype' 类型总使用 'encoding'。导出文档 的 'fileencoding' 会设为文档选定编码。 自动检测适用于所有 encoding-names 指定的编码,但 TOhtml 目前仅自动使用浏览器 广泛支持的部分编码,对其他缺省不自动检测的编码,可手动覆盖 (见以下相关选项)。 IANA 字符集名可见 http://www.iana.org/assignments/character-sets备注: 缺省所有 Unicode 编码统一将导出 HTML 转换为不带 BOM 的 UTF-8,这符合 W3C 规范: http://www.w3.org/International/questions/qa-choosing-encodings http://www.w3.org/International/questions/qa-byte-order-mark g:html_use_encoding 缺省值: 无,自动读取 'fileencoding' 当前值的 IANA 字符集名,如上所述。 要完全覆盖自动字符集检测,可手动设置本变量。要部署到网页服务器的网页,强烈建议 使用 UTF-8 等受到广泛支持的字符集: :let g:html_use_encoding = "UTF-8" 如果想移除指定字符集的 HTML 声明行,可将本变量设为空串 ( 推荐): :let g:html_use_encoding = "" 要恢复自动机制,删除变量: :unlet g:html_use_encoding g:html_encoding_override 缺省值: 无,autoload/tohtml.vim 内置了 encoding-names 所列编码的映射关系。 g:html_use_encoding 手动指定的字符集不在缺省映射表时,可用本变量指定正确的 'fileencoding'。 本变量为从字符集映射到编码的字典,用于替代或扩充内置的自动映射。 将 HTML 字符集 "windows-1252" 映射为 Vim 编码 "8bit-cp1252" 的示例: :let g:html_encoding_override = {'windows-1252': '8bit-cp1252'} g:html_charset_override 缺省值: 无,autoload/tohtml.vim 内置了 encoding-names 中浏览器广泛支持编码的 缺省转换。 本变量为从编码映射到字符集的字典。用于指定无法自动检测的 'fileencoding''encoding' 所对应的 HTML 字符集。也可覆盖已有编码到字符集的映射。例如,缺省所 有 Unicode/UCS 编码都使用 UTF-8。要改用 UTF-16 和 UTF-32,可用: :let g:html_charset_override = {'ucs-4': 'UTF-32', 'utf-16': 'UTF-16'} 注意 UTF-32 或 UTF-16 在主流浏览器中存在兼容性问题。 g:html_font 缺省值: "monospace"。 本变量指定导出网页使用的字体或字体集。本选项为字符串时,会以单引号括起该值。本 选项为列表时,以单引号括起每项,各项间逗号分隔。两种方式都会加入 "monospace" 作为后备通用字体族名,最终结果会被用作 font-family (CSS 模式) 或 <font> 的 face 属性 (非 CSS 模式)。例如: " font-family: 'Consolas', monospace; :let g:html_font = "Consolas" " font-family: 'DejaVu Sans Mono', 'Consolas', monospace; :let g:html_font = ["DejaVu Sans Mono", "Consolas"] convert-to-XML convert-to-XHTML g:html_use_xhtml 缺省值: 0。 为 0 时,生成标准 HTML 4.01 (尽可能使用 strict 严格模式)。 为 1 时,生成 XHTML 1.0 (符合 XML 规范的 HTML)。 :let g:html_use_xhtml = 1

5. 语法文件相关说明 :syn-file-remarks

b:current_syntax-variable Vim 将当前加载的语法名存入 b:current_syntax 变量。可用于根据当前激活语法,加 载其他设定。例如: :au BufReadPost * if b:current_syntax == "csh" :au BufReadPost * 执行 csh 特定设置 :au BufReadPost * endif ABEL abel.vim ft-abel-syntax 提供若干用户定义选项。设置任意值可启用相应选项。例如: :let g:abel_obsolete_ok=1:unlet 关闭选项。例如: :unlet g:abel_obsolete_ok 变量 高亮效果 abel_obsolete_ok 废弃关键字视为 Statement,而非 Error abel_cpp_comments_illegal 不将 '//' 识别为行内注释引导符 ADA 见 ft-ada-syntax ALGOL 68 algol68 ft-algol68-syntax 主要面向 Algol 68 Genie 项目,缺省使用 UPPER stropping 规则。也应支持其他采用 UPPER stropping 的环境,但支持可能不够完整。 以下变量可进一步配置语法高亮。 变量 高亮效果 algol68_no_preludes 不高亮预置环境 (prelude) 中的标识符、过程或 运算符 ANT ant.vim ft-ant-syntax 缺省内置 Javascript 和 Python 脚本语法高亮。可通过 AntSyntaxScript() 函数安装 其他脚本语言的语法高亮。函数接受的第一个参数是标签名,第二个是脚本语法文件名。 例如: :call AntSyntaxScript('perl', 'perl.vim') 这会为以下 ant 代码提供 Perl 语法高亮 <script language = 'perl'><![CDATA[ # 此处内容会使用 Perl 脚本高亮 ]]></script> 要永久安装脚本语言支持,见 mysyntaxfile-add 。 APACHE apache.vim ft-apache-syntax 为 Apache HTTP 服务器 2.2.3 版本提供语法高亮。 asm.vim asmh8300.vim nasm.vim masm.vim asm68k ASSEMBLY ft-asm-syntax ft-asmh8300-syntax ft-nasm-syntax ft-masm-syntax ft-asm68k-syntax fasm.vim 扩展名为 "*.i" 的可为 Progress 源码,也可是汇编文件。如果自动检测不准确,或者 完全不使用 Progress,可在 vimrc 里加入: :let g:filetype_i = "asm" 将 "asm" 替换为实际使用的汇编方言。 多种汇编语言都使用相同的文件扩展名。需要手动选择类型,或在汇编源文件中加入使 Vim 可识别的标记行。目前内置以下语法文件: asm GNU 汇编 (通常使用 .s 或 .S 扩展名,由 GCC 或 CLANG 等 C 编译器生成) asm68k Motorola 680x0 汇编 asmh8300 Hitachi H-8300 版本的 GNU 汇编 ia64 Intel Itanium 64 fasm Flat 汇编 (http://flatassembler.net) masm Microsoft 汇编 (.masm 文件使用 Microsoft 的 Macro Assembler 编译。仅支持 x86、x86_64、ARM 和 AARCH64 CPU 家族) nasm Netwide 汇编 tasm Turbo 汇编 (支持最高到 Pentium 和 MMX 的 80x86 指令集) pic PIC 汇编 (目前支持 PIC16F84) 最灵活的方式是在汇编文件前五行内加上如下标记行: asmsyntax=nasm 把 "nasm" 换成实际汇编语法名。该文本前后不能紧接着非空白文本。注意 此 asmsyntax=foo 标记等价于在 modeline 中设置 ft=foo,如果两者有冲突,模式行设 置优先 (尤其是模式行指定 ft=asm 则总使用 GNU 的语法高亮,而忽略 asmsyntax 的设 置)。 可通过 b:asmsyntax 变量强制覆盖当前缓冲区的语法类型: :let b:asmsyntax = "nasm" 未手动或自动设置 b:asmsyntax 时,使用全局变量 g:asmsyntax 值作为缺省汇编方 言: :let g:asmsyntax = "nasm" 以上设置都缺失时,默认使用 "asm" 语法。 Netwide 汇编器 (nasm.vim) 可选高亮特性 要打开特性: :let {variable}=1|set syntax=nasm 要关闭特性: :unlet {variable} |set syntax=nasm 变量 高亮 nasm_loose_syntax 非官方语法不标记为 Error (依赖具体分析器;不推荐) nasm_ctx_outside_macro 宏外部的非法上下文不标记为 Error nasm_no_warn 潜在风险语法不标记为 Todo ASTRO astro.vim ft-astro-syntax 配置 以下变量可加入 .vimrc,控制若干语法高亮功能。 要为 ".astro" 文件打开 TypeScript 和 TSX (缺省 "disable"): let g:astro_typescript = "enable" 要为 ".astro" 文件打开 Stylus (缺省 "disable"): let g:astro_stylus = "enable" 注意: 需要安装第三方插件,才能在 astro 文件内支持 stylus。 ASPPERL ft-aspperl-syntax ASPVBS ft-aspvbs-syntax *.asp 和 *.asa 文件既可以是 Perl,也可以是 Visual Basic 脚本。因为很难自动检 测,需要通过两个全局变量指示所用语言。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 为 BaanIV 到 SSA ERP LN 发行版的 BaanC 提供语法支持,用于 3 GL 和 4 GL 编程。 支持大量标准宏定义/常量。 要报告部分不合编码标准的错误,可在 .vimrc 里加入: let g:baan_code_stds=1 baan-folding 以下变量可开启不同级别的语法折叠 (在 .vimrc 里设置)。源码块和 SQL 上的复杂折 叠可能会消耗更多 CPU。 要开启函数级别的折叠: let g:baan_fold=1 要开启源码块级别的折叠,如 if、while、for 等,这里要求开始/结束关键字之前的缩 进严格匹配 (空格与制表不等价): let g:baan_fold_block=1 要开启内嵌 SQL 块的折叠,如 SELECT、SELECTDO、SELECTEMPTY 等,这里要求开始/结 束关键字之前的缩进严格匹配 (空格与制表不等价)。 let g:baan_fold_sql=1 注意: 源码块级别折叠可能产生大量小折叠块。建议在 .vimrc 里通过 :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" 区分文件类型,有则是 "vb",否则就是 "basic"。扩展名为 ".frm" 则 总被视为 Visual Basic 类型。 自动检测失效,或需要手动指定其他类型 (如 FreeBASIC),可在 .vimrc 里指定: :let g:filetype_bas = "freebasic" C c.vim ft-c-syntax 提供多项可选设置。设置任意值可启用相应选项 (包括零)。例如: :let g:c_comment_strings = 1 :let g:c_no_bracket_error = 0:unlet 关闭选项。例如: :unlet g: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/ObjC++ 语法 (备注: 此变量已废弃,因为 *.h 文件缺省已用 C 语法,而检测到文 件包含 C++ 或 Objective-C 语法时才会自动切换。如果自动 检测机制失效,可用 g:filetype_h 修正缺省文件类型) c_no_if0 不将 "#if 0" 块高亮为注释 c_no_cformat 不高亮字符串内的 %-格式占位符 c_no_c99 不高亮 C99 标准项目 c_no_c11 不高亮 C11 标准项目 c_no_c23 不高亮 C23 标准项目 c_no_bsd 不高亮 BSD 专用类型 c_functions 高亮函数调用和函数定义 c_function_pointers 高亮函数指针定义 'foldmethod' 设为 "syntax" 时,/* */ 注释块和 { } 代码块会生成折叠。要禁止注释 块生成折叠: :let g:c_no_comment_fold = 1 "#if 0" 块缺省也生成折叠,要关闭之: :let g:c_no_if0_fold = 1 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下内部变量设为 较大值: :let g:c_minlines = 100 语法同步此时在首个可视行上方 100 行开始。缺省值为 50 (设置 g:c_no_if0 后缺省 值为 15)。但该值越大则重绘效率越低。 "#if 0" / "#endif" 风格的注释高亮仅当 "#if 0" 出现在窗口顶部往上不超过 g: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 路 径为 ~/.vim/after/syntax/c.vim),加入以下内容: syn sync fromstart set foldmethod=syntax CANGJIE cangjie.vim ft-cangjie-syntax 仓颉是一种面向全场景智能的新一代编程语言。 缺省打开所有高亮。要关闭特定组的高亮,可在 vimrc 里将对应变量设为 0。要关闭 高亮全部选项: :let g:cangjie_builtin_color = 0 :let g:cangjie_comment_color = 0 :let g:cangjie_identifier_color = 0 :let g:cangjie_keyword_color = 0 :let g:cangjie_macro_color = 0 :let g:cangjie_number_color = 0 :let g:cangjie_operator_color = 0 :let g:cangjie_string_color = 0 :let g:cangjie_type_color = 0 CH ch.vim ft-ch-syntax C/C++ 解释器。语法与 C 类似,实现基于 C 语法文件。所有可用 C 设置见 c.vim 。 要使用 Ch 语法处理 *.h 文件,而非 C 或 C++ 语法,可设置以下变量: :let g:filetype_h = 'ch' 注意: 旧版 Vim 使用以下变量 (现已废弃),不再推荐: :let ch_syntax_for_h = 1 CHILL chill.vim ft-chill-syntax 语法与 C 类似。所有可用设置见 c.vim 。额外提供以下设置: chill_space_errors 类似 c_space_errors chill_comment_string 类似 c_comment_strings chill_minlines 类似 c_minlines CHANGELOG changelog.vim ft-changelog-syntax 缺省将行首空白高亮为错误。要关闭高亮,可在 .vimrc 里加入: let g:changelog_spacing_errors = 0 下次打开 changelog 文件时生效。也可用 b:changelog_spacing_errors 为不同缓冲 区独立设置 (必须在加载语法文件前设置)。 要调整高亮,例如将空格高亮为错误: :hi link ChangelogError Error 要关闭高亮: :hi link ChangelogError NONE 修改立即生效。 CLOJURE ft-clojure-syntax g:clojure_syntax_keywords 缺省高亮 "clojure.core" 定义的公共变量,要额外高亮自定义符号,可将其加入 g:clojure_syntax_keywords 变量。该变量为字典,从语法组名映射到对应的标识符列 表: let g:clojure_syntax_keywords = { \ 'clojureMacro': ["defproject", "defcustom"], \ 'clojureFunc': ["string/join", "string/replace"] \ } 合法语法组名参见 Closure 语法脚本。 另有缓冲区局部版本 b:clojure_syntax_keywords ,供插件动态添加符号高亮。 设置 b:clojure_syntax_without_core_keywords 变量可关闭缺省的 "clojure.core" 变量高亮。可用于设置 `(:refer-clojure :only [])` 的命名空间。 g:clojure_fold 要打开 Clojure 代码的折叠,可将 g:clojure_fold 设为 1 。所有跨行 list、 vector 或 map 都可通过 Vim 标准命令 fold-commands 进行折叠。 g:clojure_discard_macro 将此变量设为 1 ,可打开 Clojure 的 "丢弃阅读器宏 (discard reader macro)" 的 基础高亮。 #_(defn foo [x] (println x)) 注意 该选项无法正确高亮嵌套丢弃宏 (如 #_#_ )。 COBOL cobol.vim ft-cobol-syntax 老式代码和新代码对高亮有不同需要,源于需求差异 (主要目的是维护还是开发) 以及其 他因素。要启用老式代码高亮,可在 .vimrc 里加入: :let g:cobol_legacy_code = 1 要再次关闭: :unlet g:cobol_legacy_code COLD FUSION coldfusion.vim ft-coldfusion-syntax 提供自有风格的 HTML 注释。要打开 ColdFusion 风格的注释高亮,可加入以下设置: :let html_wrong_comments = 1 ColdFusion 语法文件基于 HTML 语法文件实现。 CPP cpp.vim ft-cpp-syntax 绝大多数设置同 ft-c-syntax变量 高亮效果 cpp_no_cpp11 不高亮 C++11 标准项目 cpp_no_cpp14 不高亮 C++14 标准项目 cpp_no_cpp17 不高亮 C++17 标准项目 cpp_no_cpp20 不高亮 C++20 标准项目 cpp_no_cpp23 不高亮 C++23 标准项目 cpp_no_cpp26 不高亮 C++26 标准项目 CSH csh.vim ft-csh-syntax 用于 "csh" 外壳。注意 部分系统实际使用的是 tcsh。 自动检测 csh 与 tcsh 异常困难。部分系统将 /bin/csh 符号链接到 /bin/tcsh,几乎 无法区分。如果 VIM 判断出错,可手动设置。要使用 csh: g:filetype_csh :let g:filetype_csh = "csh" 要使用 tcsh: :let g:filetype_csh = "tcsh" 带 tcsh 扩展名的脚本或标准 tcsh 文件名 (.tcshrc、tcsh.tcshrc、tcsh.login) 自动 采用 tcsh 文件类型。 除非 定义了 "filetype_csh" 变量,tcsh/csh 脚本缺省识别为 tcsh。变量给出时,文件类型直接设为变量值。 CSV ft-csv-syntax 修改 CSV 文件定界符后,语法高亮不再匹配新文本。为此需要先清除以下变量: :unlet b:csv_delimiter 然后保存并重载文件: :w :e 现在语法引擎就会自动识别新 CSV 定界符。 CYNLIB cynlib.vim ft-cynlib-syntax Cynlib 文件为 C++ 文件,通过 Cynlib 类库实现硬件建模和仿真。Cynlib 文件通常使 用 .cc 或 .cpp 扩展名,与普通的 C++ 文件难以区分。要使用 Cynlib 为 .cc 文件高 亮,在 .vimrc 文件里加入: :let g:cynlib_cyntax_for_cc=1 对 cpp 文件 (Windows 常用此扩展名),类似地 :let g:cynlib_cyntax_for_cpp=1 要再次关闭: :unlet g:cynlib_cyntax_for_cc :unlet g:cynlib_cyntax_for_cpp CWEB cweb.vim ft-cweb-syntax 扩展名为 "*.w" 的可为 Progress 源码,也可是 cweb 文件。如果自动检测不准确,或 者完全不使用 Progress,可在 vimrc 里加入: :let g:filetype_w = "cweb" CSHARP cs.vim ft-cs-syntax C# 原始字符串常量可用任意数量双引号包围文本块,原始插值字符串常量也可用任意数 量的大括号包围插值内容,如 $$$""""Hello {{{name}}}"""" Vim 缺省高亮 3-8 个双引号,1-8 个插值大括号。可通过以下变量修改识别上限: 变量 缺省 g:cs_raw_string_quote_count 8 g:cs_raw_string_interpolation_brace_count 8 DART dart.vim ft-dart-syntax Dart 是面向对象、强类型、基于类定义,带垃圾回收的编程语言,用于移动端、桌面 端、网站和后端应用开发。Dart 使用 C 风格语法,源自 C、Java 和 JavaScript,并借 鉴 Smalltalk、Python、Ruby 等语言特性。 语言及开发环境详见 Dart 语言官网 https://dart.dev dart.vim 语法可检测并高亮 Dart 语句、保留字、类型声明、存储类、条件句、循环、 插值和注释。不支持 Flutter 及其他 Dart 框架的专属用法。 改动,修正?请提交议题或拉取请求: https://github.com/pr3d4t0r/dart-vim-syntax/ DESKTOP desktop.vim ft-desktop-syntax 主要依据 freedesktop.org 标准: https://specifications.freedesktop.org/desktop-entry-spec/latest/ 高亮 .desktop 和 .directory 文件。 要高亮不以 X- 开头的非标准扩展字段: let g:desktop_enable_nonstd = 1 注意 这可能会导致错误高亮。 要高亮 KDE 专用特性: let g:desktop_enable_kde = 1 省略时, g:desktop_enable_kde 默认跟随 g:desktop_enable_nonstd 的值。 DIFF diff.vim 缺省识别翻译后的文件头。如果文件有超长行,操作可能会变慢。要关闭翻译头识别: :let g:diff_translations = 0 另见 diff-slow 。 DIRCOLORS dircolors.vim ft-dircolors-syntax 仅有一个选项。用与兼容 Slackware GNU/Linux 发布版本的相应工具。该版本支持绝大 多数版本忽略的若干关键字。要启用 Slackware 关键字,可在启动文件里加入: let g: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 会自动识别类型并设置该变量。如果识别失败,缺省类型为 XML。 也可手动设置: :let b:docbk_type = "sgml" 或者: :let b:docbk_type = "xml" 需要在加载语法文件前先进行设置,这有点繁琐。更简单方式是将文件类型设为 "docbkxml" 或 "docbksgml": :set filetype=docbksgml 或: :set filetype=docbkxml 要指定 DocBook 版本 (也提供 b: 变量): :let g:docbk_ver = 3 未设置时默认版本号为 4。 DOSBATCH dosbatch.vim ft-dosbatch-syntax 以下变量可选择 Windows 命令解释器支持的扩展集版本。Windows NT (Windows 2000 之 前) 版本取值为 1,Windows 2000 及之后版本应该为 2: :let g:dosbatch_cmdextversion = 1 未设置时默认版本为 2,支持 Windows 2000 及之后版本。 原版 MS-DOS 支持使用双冒号 (::) 作为注释行的备选引导符。现代 Windows 命令解释 器同样支持,但在 ( ... ) 命令块内部使用会引发问题。相关讨论可见 Stack Overflow

https://stackoverflow.com/questions/12407800/which-comment-style-should-i-use-in-batch-files 要允许在命令块内识别 :: 引导的注释 (设为任意值均可): :let g:dosbatch_colons_comment = 1 设置此变量后,命令块末行上的 :: 注释会被高亮为错误。 *.btm 文件既可为 "dosbatch" 类型 (MS-DOS 批处理文件),也可为 "btm" 类型 (4DOS 批处理文件)。缺省为后者。要选择前者: :let g:dosbatch_syntax_for_btm = 1 该变量未定义或为零时,默认选择 btm 语法。 DOXYGEN doxygen.vim doxygen-syntax Doxygen 使用特殊文档注释格式 (类似 Javadoc) 生成代码文档。可为 c、cpp、idl 和 php 文件提供 Doxygen 高亮,也应可用于 Java。 启用 Doxygen 语法有几种方式。首先,可显式在 'syntax' 选项上追加 ".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 注释启用非标准高亮风格。 g:doxygen_my_rendering 0 关闭 HTML 粗体、斜体和下划线的高亮。 设置 g:html_my_rendering 也可关闭。 g:doxygen_javadoc_autobrief 1 为 0 则关闭 Javadoc autobrief 高亮 (译 者注: 即 /** 开头的 Javadoc 风格注释首 行作为简要说明,无需 \brief 标签)。 g:doxygen_end_punctuation '[.]' 匹配简要说明结束标点的正则表达式。 此处尚值一提的若干可供配置的高亮组。 高亮 效果 doxygenErrorComment code、verbatim 或 dot 段落如果丢失结束标签,注 释尾部的颜色,缺省链接到 Error。 doxygenLinkError \link 段落如果丢失 \endlink,注释尾部的颜色, 缺省链接到 Error。 DTD dtd.vim ft-dtd-syntax 缺省大小写敏感。要关闭大小写敏感高亮: :let g:dtd_ignore_case=1 未知标签缺省高亮为错误。如果此行为造成困扰,可在加载 dtd.vim 语法文件前设置: :let g:dtd_no_tag_errors=1 参数实体 (parameter entity) 定义中的实体名使用 'Type' 高亮组,句号和 '%' 则用 'Comment'。参数实体实例使用 'Constant',其中定界符 % 和 ; 则用 'Type'。要关闭 参数实体高亮: :let g:dtd_no_param_entities=1 xml.vim 会内嵌 DTD 语法文件,用于高亮内嵌 dtd。 EIFFEL eiffel.vim ft-eiffel-syntax Eiffel 语言本身大小写不敏感,但编码规范鼓励区分大小写,语法高亮遵循该规范。同 时可对类名作差异化高亮。要关闭大小写敏感高亮: :let g:eiffel_ignore_case=1 类名和注释里的 TODO 标记仍然会区分大小写。 相反,要开启更严格检查,可选以下两者之一: :let g:eiffel_strict=1 :let g:eiffel_pedantic=1 g:eiffel_strict 仅捕获五个预定义单词: "Current"、"Void"、"Result"、 "Precursor" 和 "NONE" 的错误大小写。警告当作特性名或类名的误用。 g:eiffel_pedantic 则严格遵循 Eiffel 编码规范 (例如,检查大小写字母任意混合, 关键字的过时大小写拼法)。 要使用小写版本的 "Current"、"Void"、"Result" 和 "Precursor",可用 :let g:eiffel_lower_case_predef=1 无需完全关闭大小写敏感。 部分编译器支持 ISE 推荐的实验性新的创建语法,要支持该语法: :let eiffel_ise=1 最后,要高亮部分厂商支持的十六进制常数,可在启动文件里加入: :let eiffel_hex_constants=1 (译者注: Eiffel 使用 *.e 扩展名,但多个语言共用此扩展名,Vim 逻辑是在设置 g:filetype_euphoria 时设为 Euphoria (3 或 4),否则如果在文件内检查到相应关键 字时,设为 Specman,否则默认为 Eiffel) EUPHORIA euphoria3.vim euphoria4.vim ft-euphoria-syntax 提供两套语法高亮文件。一套用于 Euphoria 3.1.1 版本,这是缺省,另一套用于 Euphoria 4.0.5 及以上版本。 缺省的 Euphoria 3.1.1 版本 (http://www.rapideuphoria.com/ 链接看来已失效) 仍支 持 DOS 平台开发,Euphoria 4 (http://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 文件扩展名。设置 g:filetype_euphoria 或在文件内 检查到相应关键字时,文件类型自动设为 Euphoria。否则,缺省类型为 Elixir。 ERLANG erlang.vim ft-erlang-syntax Erlang 是爱立信开发的函数式编程语言。自动识别以下 Erlang 文件类型扩展名: erl、 hrl、yaws。 Vim 缺省把三重引号的文档字符串高亮为注释。 要将三重引号的文档字符串高亮为 Markdown,在 .vimrc 里加入: :let g:erlang_use_markdown_for_docs = 1 文档字符串普通文本 (即不用 Markdown 语法高亮的部分) 仍高亮为注释。 要修改文档字符串普通文本的高亮组 (示例使用 String),在 .vimrc 里加入: :let g:erlang_docstring_default_highlight = 'String' 未开启 Markdown 时,整个文档字符串都会改用该高亮组。 要完全关闭普通文本的高亮: :let g:erlang_docstring_default_highlight = '' 配置示例: " 将文档字符串高亮为 Markdown。 :let g:erlang_use_markdown_for_docs = 1 " 1. 文档字符串内 Markdown 元素使用 Markdown 高亮。 " 2. 文档字符串普通文本使用 String 高亮。 :let g:erlang_use_markdown_for_docs = 1 :let g:erlang_docstring_default_highlight = 'String' " 文档字符串整体使用 String 高亮 (不启用 Markdown)。 :let g:erlang_docstring_default_highlight = 'String' " 1. 文档字符串内 Markdown 元素使用 Markdown 高亮。 " 2. 文档字符串普通文本关闭高亮。 :let g:erlang_use_markdown_for_docs = 1 :let g:erlang_docstring_default_highlight = '' ELIXIR elixir.vim ft-elixir-syntax Elixir 是用于构建规模化易维护应用的动态函数型语言。 自动检测以下 Elixir 文件类型扩展名: *.ex, *.exs, *.eex, *.leex, *.lock Elixir 和 Euphoria 共用 *.ex 文件扩展名。设置 g:filetype_euphoria 或在文件内 检查到相应关键字时,文件类型自动设为 Euphoria。否则,缺省类型为 Elixir。 FLEXWIKI flexwiki.vim ft-flexwiki-syntax FlexWiki 是基于 ASP.NET 的 wiki 包,原官网 www.flexwiki.com 现已失效,维基记载 项目已在 2009 年停止开发。 支持 FlexWiki 常用语法元素高亮。文件类型插件提供了若干缓冲区局部选项,优化页面 编辑体验。FlexWiki 将换行视作新段落开始,因此设置 'tw'=0 (无限行长),置位 'wrap' (回绕长行,不水平滚动),同时置位 'linebreak' (在 'breakat' 指定字符上而 非屏幕末尾换行) 等。 附带一组键盘映射,使 "j" 和 "k" 以及光标键按显示行上下移动。缺省关闭。要打开这 些键盘映射,可在 .vimrc 里加入: :let g:flexwiki_maps = 1 FORM form.vim ft-form-syntax FORM 文件语法元素使用缺省高亮组: Conditional、Number、Statement、Comment、 PreProc、Type 和 String。遵循荷兰 CAN 组织 J.A.M. Vermaseren 1991 年编著的 'Symbolic Manipulation with FORM' 语言规范。 自定义配色需要重定义以下语法组: - formConditional - formNumber - formStatement - formHeaderStatement - formComment - formPreProc - formDirective - formType - formString 注意 FORM 预处理器命令和指令缺省归入同一语法组。 提供增强色彩模式,可用于区分头部语句和程序主体语句。要激活此模式,可在 vimrc 里加入 :let g:form_enhanced_color=1 增强模式也对深色 gvim 显示作了颜色优化。语句 (formStatement) 使用 LightYellow 而非 Yellow,而条件句 (formConditional) 使用 LightBlue,提升区分度。 Visual Basic 和 FORM 共用 ".frm" 扩展名。Vim 会在文件头五行检查 "VB_Name" 字符 串。存在则将自动设置文件类型为 "vb",否则为 "form"。 如果自动检测不准确,或者只需要编辑其中一种语言 (如 FORM),可在 vimrc 里指定: :let g:filetype_frm = "form" FORTH forth.vim ft-forth-syntax "*.f" 文件既可以是 Fortran,也可以是 Forth,而 "*.fs" 文件也可能是 F# 或 Forth。如果自动检测不准确,或者不需要编辑其他语言 (如 F# 或 Fortran),可在 vimrc 里指定: :let g:filetype_f = "forth" :let g:filetype_fs = "forth" FORTRAN fortran.vim ft-fortran-syntax 缺省高亮方式和方言 Vim 缺省按照 Fortran 2023 (最新标准) 高亮。应该适合绝大多数用户,因为 Fortran 2023 基本兼容以前所有版本 (Fortran 2018、2008、2003、95、90、77 和 66)。部分被 新标准删除和标记废弃的旧语法会被分别为高亮为错误和待办项目。 语法脚本不再支持 Fortran 方言切换。变量 g:fortran_dialect 已被静默忽略。同样 由于硬件性能提升,变量 g:fortran_more_precise 不再需要,也被静默忽略。 Fortran 源码格式 Fortran 源码分为固定格式和自由格式。格式设置错误会导致语法高亮错乱。 新建 Fortran 文件时,语法脚本假定使用固定格式。要总是使用自由格式,在 .vimrc 里 `:syntax on` 命令前加入 :let g:fortran_free_source=1 要总是使用固定格式,则在 `:syntax on` 命令前加入 :let g:fortran_fixed_source=1 要根据扩展名自行选择源代码格式 (且与下述的标准对应不同) 时,建议在文件类型插件 里设置 g:fortran_free_source 。详见 ftplugin注意 此方法要求 .vimrc 文件里 `filetype plugin indent on` 命令出现在 `syntax on` 命令之前。 编辑已有的 Fortran 文件时, g:fortran_free_source 变量置位时,假定使用自由格 式,否则当 g:fortran_fixed_source 变量置位时,假定使用固定格式。两者都未设置 时,会依据主流编译器 (ifort、gfortran、Cray、NAG 和 PathScale) 惯例,通过文件 扩展名判断 (.f、.for、.f77 为固定格式,.f90、.f95、.f03、.f08 为自由格式)。扩 展名 .fpp 和 .ftn 无缺省,因为不同编译器处理方式不一致。如果上述步骤仍无法判 定,脚本会再检查文件头 500 行的头 5 列。未发现自由格式特征时则判定为固定格式。 此算法应能正确处理绝大多数情况。假定出现文件开头 500 行全是注释行,误判为固定 格式仍有可能。要处理这种特例,可在前 500 行的头 5 列任意位置写入非注释语句,保 存 ( :w ) 后重新读入 ( :e! ) 文件即可。 厂商扩展 固定 Fortran 标准最大行长为 72 字符,为兼容近 30 年来的编译器实际用法,脚本将 最大行长放宽到 80 字符,要支持 132 字符超长行: :let g:fortran_extended_line_length=1 确保写在 `:syntax on` 命令之前。 要开启 CUDA Fortran 扩展高亮: :let g:fortran_CUDA=1 确保写在 `:syntax on` 命令之前。 要启用常见非标准厂商内置函数高亮: :let g:fortran_vendor_intrinsics=1 确保写在 `:syntax on` 命令之前。 Fortran 源码中允许制表键 Fortran 标准不识别制表键。固定源码依赖固定列边界,制表并非明智选择,因此制表缺 省被识别为错误。不过,有些程序员仍然喜欢使用制表。要允许 Fortran 文件不将制表 高亮为错误,可在 vimrc 里加入: :let g:fortran_have_tabs=1 确保写在 `:syntax on` 命令之前。允许使用制表的代价是列位置错误无法被正确识别。 Fortran 语法折叠 要开启 foldmethod=syntax : :let g:fortran_fold=1 为程序单元定义折叠区域。程序单元 (program unit) 包括以 program 语句开头的主程 序、子例程、函数子程序、模块、子模块、注释行块以及块数据单元。此外,block、 interface、associate、critical、类型定义和 change team 构造也会被折叠。要额外 开启条件构造折叠: :let g:fortran_fold_conditionals=1 do 循环、if 块和 select case、select type 和 select rank 构造此时都会定义折叠 区域。注意 定义折叠区域会使大文件高亮变慢。 syntax/fortran.vim 脚本包含了内嵌注释,说明如何通过增加注释和/或去除注释修改脚 本源码,以 (a) 识别非标准厂商自定内置函数 (intrinsic) 及 (b) 关闭 2008 标准已 删除或废止功能的待办项目高亮。 限制 括号检查无法发现闭括号缺失。也不能识别 Hollerith 字符串。Fortran90 无保留字, 因此部分关键字可能高亮异常。 更多 Fortran 相关,可见 ft-fortran-indentft-fortran-plugin 。 FREEBASIC freebasic.vim ft-freebasic-syntax 提供 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 对文件名不匹配 fvwmrc fvwm2rc 的 Fvwm 配置文件,需要在 myfiletypes.vim 文件里 (译者注: 新版建议放入用户运行时目录下的 filetype.vim) 添加自定义模式。 匹配模式时,需要设置变量 b:fvwm_version 为 Fvwm 主版本号,同时将 'filetype' 选项设为 fvwm。 将 /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 代码应可正常高亮,少数特殊情况仍然可能出错。要新增可内嵌 Java 代 码的 HTML 组以修正高亮,可从 html.vim 复制对应行,在 contains 子句中加入 gspJava (译者注: 应为 gspInLine) 即可。 用于内嵌 Java 的反引号使用 htmlError 组高亮,使其更加醒目。 GDB gdb.vim ft-gdb-syntax 为注释和块语句提供语法折叠 folding (见 :syn-fold )。要开启折叠: :set foldmethod=syntax GROFF groff.vim ft-groff-syntax groff 语法文件是 nroff.vim 的包装脚本,用法和配置见 nroff.vim 。此包装用于 通过 modeline 或用户文件类型脚本 (见 filetype.txt ) 设置专属文件类型,从而 可设置 groff 专用语法扩展。 HASKELL haskell.vim lhaskell.vim ft-haskell-syntax 支持普通 Haskell 与文学式 (literate) Haskell 代码,后者支持 Bird 风格和 Tex 风 格。同时支持 C 预处理指令高亮。 要高亮定界符 (适用于浅色背景),可在 .vimrc 里加入: :let g:hs_highlight_delimiters = 1 要将 True 和 False 高亮为关键字而非普通标识符: :let g:hs_highlight_boolean = 1 要将基础类型名字高亮为关键字: :let g:hs_highlight_types = 1 要将更多常用类型名高亮为关键字: :let g:hs_highlight_more_types = 1 要开启调试函数名称高亮: :let g:hs_highlight_debug = 1 Haskell 语法高亮也高亮 C 预处理指令,以 # 开头但非法的指令会被标记为错误。这与 Haskell 自身可能也会用 # 开头的操作符语法有冲突,要将此类语法高亮为运算符而非 错误,可在 .vimrc 里加入: :let g:hs_allow_hash_operator = 1 文学式 Haskell 代码的语法高亮会试图自动猜测是否包含 Tex 标记,决定是否高亮 Tex 构造。要全局关闭此行为 :let g:lhs_markup = none 可完全关闭高亮。也可用 :let g:lhs_markup = tex 强制启用 Tex 标记高亮。更灵活的方法是使用缓冲区局部版本,示例 :let b:lhs_markup = tex 强制为单个缓冲区启用 TeX 高亮。必须在该缓冲区开启语法高亮或加载文件前设置。 HTML html.vim ft-html-syntax HTML 文件内,使用以下标签色彩方案。 起始标签 <> 和闭合标签 </> 配色不同。这是有意的设计!起始标签使用 'Function' 高亮,而闭合标签使用 'Identifier' 高亮 (具体高亮定义可查看 syntax.vim)。 已知标签名使用 C 语句 (Statement) 高亮。未知标签名与其相应的 <> 或 </> 使用相 同高亮,以便纠错。 注意 参数 (或属性) 名使用相同逻辑。已知和未知属性名使用不同高亮。 部分 HTML 标签的作用是改变文本的渲染效果。识别以下风格标签,并相应调整普通文本 的显示方式: <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 g:html_my_rendering=1 可从 https://web.archive.org/web/20241129015117/https://www.fleiner.com/vim/download.html 下载示例文件 (mysyntax.vim)。 要完全关闭风格标签渲染效果,可在 vimrc 文件里加入: :let g:html_no_rendering=1 缺省从首个显示行回溯 250 行开始语法同步。要调整配置: :let g:html_minlines = 500 HTML 注释语法特殊 (详见 HTML 参考文档),本色彩方案会高亮所有语法错误。要兼容非 标准注释写法 (以 <!-- 开始、--> 结束),可定义 :let g:html_wrong_comments=1 HTML 内嵌 JavaScript 和 Visual Basic 脚本整体使用 'Special' 高亮,内部语句、注 释、字符串等沿用对应编程语言的高亮。注意 目前仅支持 JavaScript 和 Visual Basic,不支持其他脚本语言。 内嵌及行内 (inline) 层叠样式表 (CSS) 也会启用高亮。 目前有好几种 HTML 预处理语言,html.vim 的设计方便其被其他语言内嵌。为此,只需 在相应语言的语法高亮文件里加入 (此例取自 asp.vim 文件): runtime! syntax/html.vim syn cluster htmlPreproc add=asp 也就是说,只需将包含预处理语言元素的区域项加入 htmlPreproc 簇即可。 html-folding 提供起始标签和闭合标签之间的语法折叠 folding (见 :syn-fold )。要开启折叠 :let g:html_syntax_folding = 1 :set foldmethod=syntax 注意: 语法折叠可能会显著拖慢语法高亮,大文件尤其明显。 HTML/OS (AESTIVA 提供) htmlos.vim ft-htmlos-syntax HTML/OS 文件内,使用以下标签色彩方案。 函数名和变量名缺省使用相同配色,因为 VIM 缺省不区分 Function 和 Identifier 的 高亮。要使函数名独立配色 (推荐使用),可在 ~/.vimrc 里加入: :hi Function term=underline cterm=bold ctermfg=LightGray ctermfg 可按需修改为其他颜色。 HTML/OS 遇到的另一个问题是,没有专用文件扩展名来表明该文件包含 HTML/OS 代码。 可打开文件手动启用 HTML/OS 语法: :set syntax=htmlos 最后要提醒一下,HTML/OS 代码块的起止定界符分别是 << 或 [[,以及 >> 或 ]]。 IA64 ia64.vim intel-itanium ft-ia64-syntax 提供 Intel Itanium 64 汇编语言高亮。该文件类型的识别方式可见 asm.vim 。 要将 *.inc 文件识别为 IA64,可在 .vimrc 文件里加入: :let g:filetype_inc = "ia64" INFORM inform.vim ft-inform-syntax 因为被多数程序大量使用,缺省高亮 Inform 库提供的符号。要关闭库符号高亮,可在 vim 启动脚本里加入: :let inform_highlight_simple=1 缺省目标为 Z 机器。并对 Z 机器汇编语言符号做对应高亮。要改变目标为 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 (Interface Definition Language,接口定义语言) 文件用于定义 RFC 调用。 Microsoft 体系也用于定义 COM 接口和调用。 IDL 语法结构简单,可以分析完整语法,而无需启发式猜测。脚本体积偏大,存在部分重 复,但功能看来正常可用。 内置部分 Microsft IDL 扩展。其中部分可通过定义 g:idl_no_ms_extensions 关闭。 复杂度更高的扩展可通过定义 g:idl_no_extensions 关闭。 变量 效果 idl_no_ms_extensions 关闭部分 Microsoft 专用扩展 idl_no_extensions 关闭复杂扩展 idlsyntax_showerror 显示 IDL 错误 (相当显眼,但非常有用) idlsyntax_showerror_soft 显示错误,但缺省使用更柔和配色 JAVA java.vim ft-java-syntax 提供以下多个配置选项。 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 也可为其他公共和保护类型生成语法项,选择性高亮;见 java-package-info-url 。 支持缩进函数声明头部 (包括匿名函数表达式及方法引用表达式的相应部分) 高亮。但取 决于 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 使函数名及其参数列表括号与类型参数、返回类型、以及形式参数分别使用不同高亮; 匿名函数表达式的参数列表括号及其箭头也会与形式参数或标识符分别使用不同高亮。 两种模式都不合适,但仍需要函数声明头部高亮时,请修改或新增语法定义。 高阶函数类型有时很难用肉眼解析,均匀地柔化其中某些组成部分效果可能更好。只要类 型名遵循 Java 的命名规范,可以如此实现 :let g:java_highlight_generics = 1 Java 1.1 里,函数 System.out.println()System.err.println() 只应用于调 试。可在启动文件里加入: :let g:java_highlight_debug = 1 这会使调试语句主体采用以下高亮 *Debug v 调试语句, 并将其中的一部分元素进一步分组 (下表右列) 并链接到 (下表左列): *Special v DebugSpecial, *String v DebugString, *Boolean v DebugBoolean, *Type v DebugType, 它们分别用于高亮字符串里的特殊字符、按本义出现的字符串、布尔常量及特殊实例引用 ( superthisnull )。 Javadoc 工具会提取 Java 程序中的特殊注释,自动生成 HTML 文档。缺省标准配置会使 用标准 HTML 高亮 (见 html.vim ) 其中的 HTML 代码,HTML 代码中还可嵌入 Javascript 和 CSS (见下)。(译者注: /** */ 是基于 HTML 的传统风格,而 /// 则是 基于 Markdown 的新式风格) HTML 渲染和 Markdown 渲染在高亮处理上有所不同,具体 如下: 1. 第一句 (至首个后跟空白或换行的句号 '.'、或遇到首个块标签 (如 @param@return ) 为止) 使用高亮 *SpecialComment v 特殊注释。 2. 普通注释文本使用高亮 *Comment v 注释。 3. HTML 注释使用高亮 *Special v 特殊符号。 4. Javadoc 标准标签 ( @code@see 等) 使用高亮 *Special v 特殊符号。 部分标签参数使用高亮 *Function v 函数名。 要完全关闭 HTML 和 Markdown 特性: :let g:java_ignore_javadoc = 1 也可仅屏蔽 HTML 风格或 Markdown 风格的 Javadoc 注释: :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" 时,缺省会折叠多行代码块 ("b")、普通多行注释 ("c")、Javadoc 注释 ("d") 和连续 "import" 声明 ("i")。要 取消 指定类型折叠,在 以下变量中填入对应缩写字符: :let g:java_ignore_folding = "bcdi" 多行注释首行通常无文本,缺省 'foldtext' 设置下,Javadoc 注释的折叠行因此会缺乏 摘要信息;可打开以下变量,首行无文本时取第二行,而其他情况则取第一行作为摘要 :let g:java_foldtext_show_first_or_second_line = 1 要折叠 Javadoc 注释里的 HTML 标签,可依照 html-folding 指示,同时显式授权开 启 :let g:java_consent_to_html_syntax_folding = 1 仅当 Javadoc 注释里 全部 起始标签和可选闭合标签完整配对时,才建议开启;否则, 失控折叠可能会搞乱整体语法高亮。 要将拖尾空白或制表前的连续空格标为错误 :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 语法项定义中使用的可变宽度回顾断言 ( /\@<!/\@<= ),有任意指定的字节数上 限。对于相关的一组定义,可自定义另一个任意值。示例: :let g:java_lookbehind_byte_counts = {'javaMarkdownCommentTitle': 240} 字典键为语法项名。不同修订版中实际使用断言的语法项常有变动,因此无法提供完整的 支持键列表。 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下变量设为较大 值: :let g:java_minlines = 50 语法同步此时在首个可视行上方 50 行开始。缺省值为 10。但该值越大则重绘效率越 低。 Java 平台的重大变更会逐步以 JDK 增强提案 (JDK Enhancement Proposals,JEPs) 的 形式引入,在某个版本中实现并作为其预览特性提供。此类特性可能需要经过若干 JEP 和几个版本周期,最终才会被正式纳入平台,或被撤回。为满足早期试用者的要求,Vim 提供了已实现的语法相关预览特性的可选支持。可通过指定预览特性编号列表,开启相应 支持: :let g:java_syntax_previews = [530] 下表列出当前支持的 JEP 号: 430 : 字符串模板 [JDK 21] 530 : 模式、instanceof 和 switch 里的原始类型 注意 预览特性一旦正式纳入 Java 平台后,对应编号会从此表中删除,对应开关失效。 java-package-info-url https://github.com/zzzyxwvut/java-vim/blob/master/tools/javaid/src/javaid/package-info.java 一个自动生成类型名对应语法项的工具。 JSON json.vim ft-json-syntax g:vim_json_conceal g:vim_json_warnings 缺省提供隐藏高亮支持。要关闭隐藏支持: 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 KCONFIG ft-kconfig-syntax 要设置语法同步范围,可用 (缺省: 50): let g:kconfig_minlines = 50 要开启更丰富 (开销也更大) 的高亮,可用: let g:kconfig_syntax_heavy = 1 LACE lace.vim ft-lace-syntax Lace (Language for Assembly of Classes in Eiffel,Eiffel 类整合语言) 本身大小 写不敏感,但编码规范区分大小写。要关闭大小写敏感高亮,可在启动文件里使用: :let g:lace_case_insensitive=1 LF (LFRC) lf.vim ft-lf-syntax g:lf_shell_syntax b:lf_shell_syntax 对 lf 文件管理器配置文件 (lfrc),可通过以下变量设置不同的 :syn-include 命令 搜索模式,在全局和缓冲区局部范围切换内嵌外壳命令的高亮语法: let g:lf_shell_syntax = "syntax/dosbatch.vim" let b:lf_shell_syntax = "syntax/zsh.vim" 变量缺省未设置,默认内嵌 'syntax/sh.vim' 语法。 LEX lex.vim ft-lex-syntax Lex 使用暴力同步,因为 "^%%$" 小节定界符无法预判后续小节类型。因此,如果用户有 同步问题 (例如 lex 文件过大),可尝试调整 :syn sync minlines=300 值。 LIFELINES lifelines.vim ft-lifelines-syntax 要将废弃函数高亮为错误,可在 .vimrc 里加入: :let g:lifelines_deprecated = 1 LISP lisp.vim ft-lisp-syntax 提供以下两个选项: g:lisp_instring : 给出时,"(...)" 字符串按 Lisp 语法高亮。适用于 AutoLisp。 g:lisp_rainbow : 给出且非零时,不同嵌套层级的括号使用不同高亮。 g:lisp_rainbow 选项提供 10 级小括号与反引号括号配色。因为配色层级多,彩虹模 式直接使用 ctermfg 和 guifg 指定高亮颜色,不受采用标准高亮组的色彩方案控制。但 实际颜色仍然受 'bg' 深/浅设置影响。 LITE lite.vim ft-lite-syntax 提供以下两个选项。 要在字符串里内部启用 SQL 语法高亮: :let g:lite_sql_query = 1 缺省同步范围为回溯 100 行。要修改该值: :let g:lite_minlines = 200 LOG ft-log-syntax Vim 内置简易通用的日志语法高亮器。因为日志使用非常广泛,该高亮缺省不开启,避免 造成干扰。可按需手动设置 "log" 文件类型: :set ft=log 要自动开启 "*.log" 文件高亮,可在用户 filetype.vim 文件 (Unix 上通常位于 ~/.vim/filetype.vim$HOME/vimfiles/filetype.vim ,另见 new-filetype ) 里加入: augroup filetypedetect au! BufNewFile,BufRead *.log setfiletype log augroup END LPC lpc.vim ft-lpc-syntax LPC 即 Lars Pensjö C,一种轻量省内存的语言。常用扩展名是 *.c。直接把所有 *.c 识别为 LPC 会干扰普通 C 程序用户。要启用 LPC 语法,可在 .vimrc 文件里设置: :let g:lpc_syntax_for_c = 1 如果部分特定 C 或 LPC 文件识别异常,可用模式行。LPC 文件示例: // vim:set ft=lpc: 被误判为 LPC 的 C 文件则可用: // vim:set ft=c: 也可不设置此变量,而在 每个 LPC 文件内使用模式行。 LPC 存在多种实现,目前仅支持最主流版本。缺省语法基于 MudOS 系列。MudOS v22 及 更早版本,以下变量会关闭合适的修饰符,同时把 v22 之后新增 efuns 标记为非法。使 用新版 MudOS 版本是不要开启该变量: :let g:lpc_pre_v22 = 1 LpMud 3.2 系列: :let g:lpc_compat_32 = 1 LPC4 系列: :let g:lpc_use_lpc4_syntax = 1 uLPC 系列: uLPC 已演变为 Pike,应用 Pike 语法,源文件扩展名也改为 *.pike。 LUA lua.vim ft-lua-syntax 支持 Lua 4.0、5.0 及以上版本。全局变量 g:lua_versiong:lua_subversion 可指定目标版本。 MAIL mail.vim ft-mail.vim 对邮件所有标准元素 (信头、签名、引用文本以及网址 / 邮箱地址) 进行高亮。遵循邮 件惯例,签名起始行必须仅包含 "--",后跟可选若干空白并以回车结束。 ']'、'}'、'|'、'>' 或单词后跟 '>' 开始的行会被高亮为引用文本。但仅当引用文本以 '>' 开头 (可跟一个可选空格) 时,引用文本中的信头和签名才会被特别高亮。 语法同步缺省从首个可视行上方 100 行开始。机器性能较差且信头普通较短时,可缩小 同步范围: :let g:mail_minlines = 30 MAKE make.vim ft-make-syntax Makefile 缺省对命令启用高亮,方便排查错误。如果觉得颜色过多,可如此关闭: :let g:make_no_commands = 1 缺省也高亮注释。可如此关闭: :let g:make_no_comments = 1 各类 Make 实现提供 POSIX 规范外的扩展,彼此间互不兼容。文件名是 BSDmakefile 或 GNUmakefile 时,会自动判定类型,其余情况 Vim 会根据文件内容进行检测。如果高亮 出错,可设置以下变量,强制指定实现风格: :let g:make_flavor = 'bsd' " BSD make、或 :let g:make_flavor = 'gnu' " GNU make、或 :let g:make_flavor = 'microsoft' MAPLE maple.vim ft-maple-syntax Waterloo Maple Inc 的 Maple V 符号代数语言支持多种函数包,可按需加载。Vim 中可 选择性高亮 Maple V release 4 内置的标准包函数。在 .vimrc 文件里加入: :let g: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 要支持如引用、脚注、数学公式、学术书写元素以及内嵌代码块高亮等 Markdown 增强功 能,应将 g:filetype_md 设为 'pandoc',改用 pandoc 语法插件。配置详见 ft-pandoc-syntax 。 MATHEMATICA mma.vim ft-mma-syntax ft-mathematica-syntax 空白 *.m 文件缺省识别为 Matlab 文件,可在 .vimrc 里手动设置: let g:filetype_m = "mma" (译者注: 非空白 *.m 文件可根据内容自动识别为 Mathematica、Matlab、Murphi、 Objective C 或 Octave 之一,但可用上述变量手动覆盖) MBSYNC mbsync.vim ft-mbsync-syntax mbsync 应用使用配置文件定义邮箱名、用户名和密码。扩展名 .mbsyncrc 或文件名 为 isyncrc 的文件都会自动识别为 mbsync 配置文件。 MEDIAWIKI ft-mediawiki-syntax 缺省高亮 style 和标题等基础 HTML 标签 html.vim ,要仅限严格 Mediawiki 语法高 亮: let g:html_no_rendering = 1 打开 HTML 高亮时,可在终端中启用粗体和斜体等文本格式 (译者注: 此处似乎不确,缺 省已启用风格高亮,而该变量的作用恰好是关闭缺省风格高亮,允许用户自定义): let g:html_style_rendering = 1 MODULA2 modula2.vim ft-modula2-syntax 识别带方言标签的注释,自动选择对应方言。 方言标签注释语法是: taggedComment := '(*!' dialectTag '*)' ; dialectTag := m2pim | m2iso | m2r10 ; 保留字 m2pim = 'm2pim', m2iso = 'm2iso', m2r10 = 'm2r10' 方言标签注释识别必须出现在源代码前 200 行内。仅识别首个方言标签,后续被忽略。 示例: DEFINITION MODULE FooLib; (*!m2pim*) ... 如果无法通过 Modula-2 文件内容判断方言,可手动设置,未设置时缺省方言是 pim: let g:modula2_default_dialect = 'r10' 以下变量可进微调各个方言的高亮行为。 变量 高亮 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 含下划线的标识符不被高亮为错误 MOO moo.vim ft-moo-syntax 如果表达式内部使用 C 风格注释导致高亮错乱,可开启扩展匹配 (速度较慢!): :let g:moo_extended_cstyle_comments = 1 要关闭字符串内代词替换 (pronoun substitution) 模式的高亮: :let g:moo_no_pronoun_sub = 1 要关闭字符串内正则表达式 '%|' 操作符以及 '%(' 和 '%)' 配对所用的高亮: :let g:moo_no_regexp = 1 要将未配对的双引号高亮为错误: :let g:moo_unmatched_quotes = 1 要开启内置属性 (.name、.location、.programmer 等) 高亮: :let g:moo_builtin_properties = 1 要将未知内置函数高亮为错误 (启用后,自定义扩展需加入 mooKnownBuiltinFunction 组以免被高亮为错误): :let g:moo_unknown_builtin_functions = 1 将 sprintf() 加入已知内置函数列表的示例: :syn keyword mooKnownBuiltinFunction sprintf contained MSQL msql.vim ft-msql-syntax 提供以下两个选项。 要高亮字符串里的 SQL 语法: :let g:msql_sql_query = 1 缺省同步范围为回溯 100 行。要修改该值: :let g: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 是 Couchbase Server 数据库用于操作 JSON 文档的类 SQL 的声明式语言。 支持 N1QL 语句、关键字、操作符、类型、注释和特殊值的语法高亮。SQL 或众多方言拥 有但 N1QL 不存在的 COLUMN 或 CHAR 等语法元素则被忽略。 NCF ncf.vim ft-ncf-syntax 提供一个选项。 要将插件未识别的语句高亮为错误: :let g:ncf_highlight_unknowns = 1 该变量未设置时,缺省不高亮此类错误。 NROFF nroff.vim ft-nroff-syntax 原生支持 AT&T n/troff。Linux 和 BSD 发布版缺省文本排版包是 GNU troff (groff), 要将文件识别为 groff 格式 (见 ft-groff-syntax ),可在启动文件里加入: :let g:nroff_is_groff = 1 GNU troff 对老式 AT&T n/troff (现仍可在 Solaris 或 Plan 9 里找到) 做了 *roff 语法扩展。例如,AT&T troff 使用转义序列 \n(yr 访问自 1900 年起的两位数年份。 groff 兼容该写法,也支持扩展语法 \n[yr]。AT&T troff 文档指出 yr 寄存器应存储 "当前年份的后两位",但此处存在 Y2K 问题;groff 可使用 \n[year] 写法正确访问完 整 4 位公历年份。groff 的寄存器、宏、字符串和请求名都可超过两个字符,例如,在 GNU mm 宏包中,".VERBON" 和 ".VERBOFF" 控制行调用同名宏,包围 verbatim (按原样 输出) 环境。 要获取 g/troff 最佳排版效果,需遵循一些关于空格和标点的简单规则。 1. 每个句子末尾断行 (加换行符)。换行符前不能留拖尾空白。 2. 行尾出现句号、问号或感叹号,但该处不是句尾时,必须追加虚拟字符转义序列 \%。 3. 使用宏包时,应调用其段落宏以实现段落缩进和段间距。 3. 自由使用空请求 (单独占一行的 '.'),视觉上分隔内容,便于文档维护。 这些提示的背后原因是,g/n/troff 会自动检测句子结尾,并利用这一信息添加句间空 白。同时还可尽量减少仅因编辑器自动换行导致的不必要的差异文本数量。各类宏包通常 会使用不同于一个 vee (空输入行间距) 的段间距,并且通常会将段间距和段落缩进量分 别保存在用户可配置的寄存器中,以保证页面布局一致。 和 TeX 不同,troff 逐行而非逐段填充文本。要使排版输出中的单词间距和句间距保持 一致,应在输入文本里维持统一间距。要将拖尾空白和标点之后两个及以上的空格标为错 误,可用: :let g:nroff_space_errors = 1 另有一个检测多余空格与其他排版错误的技术,但会干扰文件的正确排版。这个方法是在 用户配置文件里,为语法组 "nroffDefinition" 和 "nroffDefSpecial" 提供醒目高亮定 义。例如: hi def nroffDefinition term=italic cterm=italic gui=reverse hi def nroffDefSpecial term=italic,bold cterm=italic,bold \ gui=reverse,bold 要使预处理指令用作小节标记以方便跳转,可在 .vimrc 文件里加入: let b:preprocs_as_sections = 1 还额外为 ms 宏包加入 Berkeley 和 GNU 扩展的 XP 段落宏标记, 最后,另有 groff.vim 语法文件,可按文件或全局缺省启用 groff 语法高亮。 OCAML ocaml.vim ft-ocaml-syntax 自动检测以下扩展名: .ml、.mli、.mll 和 .mly。 要切换为 camlp4 预处理器支持的修订语法: :let g:ocaml_revised = 1 如果源程序存在超长结构以致 Vim 不再能保持同步,可关闭 "end" 错误高亮: :let g:ocaml_noend_error = 1 PANDOC ft-pandoc-syntax Markdown 文件缺省识别为 "markdown" 文件类型。可考虑改用 "pandoc" 文件类型。为 此,可设置 g:filetype_md 变量: :let g:filetype_md = '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 要关闭指定代码块类型的特殊高亮,改用 Normal 高亮,可用以下变量。代码块类型包括 定义块内代码块 ("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 另外,提供以下两条命令: 要开启代码块中指定语言的内嵌高亮,LANG 语法同 g:pandoc#syntax#codeblocks#embeds#langs :PandocHighlight LANG 要关闭代码块中指定语言的内嵌高亮 :PandocUnhighlight LANG PAPP papp.vim ft-papp-syntax 处理 .papp 文件,也可有限处理 .pxml 和 .pxsl 文件。这类文件都以 xml 为顶层格 式,混合 perl / xml / html / 其他语言。phtml 和 pxml 区块内全部内容缺省视为内 嵌预处理器命令的字符串。要将 pthml 段使用 html 代码高亮,可在启动文件里加入: :let g:papp_include_html=1 代价是速度较慢,而且色彩过于鲜艳,可能干扰有效编辑 ;) papp.vim 语法文件最新版本可从 http://papp.plan9.de 获取。 PASCAL pascal.vim ft-pascal-syntax "*.p" 文件既可以是 Progress,也可以是 Pascal,而 "*.pp" 文件也可能是 Puppet 或 Pascal。如果自动检测不准确,或者只需要编辑 Pascal 文件,可在 vimrc 里加入: :let g:filetype_p = "pascal" :let g:filetype_pp = "pascal" 支持 Turbo Pascal、Free Pascal 和 GNU Pascal 编译器的一些语法扩展。同时支持 Delphi 关键字。缺省启用 Turbo Pascal 7.0 特性。要只想使用标准 Pascal 关键字, 可在启动文件里加入: :let g:pascal_traditional=1 要启用 Delphi 专用构造 (如单行注释、专属关键字等): :let g:pascal_delphi=1 要启用符号操作符 (如 +、* 等) 的 Operator 高亮,可用: :let g:pascal_symbol_operator=1 缺省高亮部分已知函数。要关闭函数高亮: :let g:pascal_no_functions=1 除 Delphi 外,也提供部分其他编译器的专属开关变量。缺省扩展匹配 Turbo Pascal: :let g:pascal_gpc=1 :let g:pascal_fpc=1 要只接受单行字符串 (多行字符串高亮为错误): :let g:pascal_one_line_string=1 要将 <Tab> 字符高亮为错误: :let g:pascal_no_tabs=1 PERL perl.vim ft-perl-syntax 提供以下若干选项。 缺省开启内嵌 POD 高亮。如果觉得 Perl 内嵌 POD 高亮增加不必要的复杂度,可用: :let g:perl_include_pod = 0 要进一步降低解析复杂度 (同时提高性能),可关闭用于变量名和内容解析的两个变量。 在变量和函数名里,要使包限定符 (如 '$PkgName::VarName' 里的 'PkgName::') 不做 特殊高亮: :let g:perl_no_scope_in_variables = 1 (Vim 6.x 行为相反,旧选项 "perl_want_scope_in_variables" 用于开启区别显示。) 要跳过复杂结构 (如 '@{${"foo"}}' 等嵌套变量表达式) 的解析: :let g:perl_no_extended_vars = 1 (Vim 6.x 里相反,用 perl_extended_vars 打开此项解析。) 可切换高亮风格。字符串和 qq 类字符串缺省高亮方式如下首行所示。设置变量 g:perl_string_as_statement 后,改为如下第二行所示高亮。 "hello world!"; qq|hello world|; ^^^^^^^^^^^^^^NN^^^^^^^^^^^^^^^N (未设置 g:perl_string_as_statement ) S^^^^^^^^^^^^SNNSSS^^^^^^^^^^^SN (设置 g:perl_string_as_statement ) (^ = perlString 高亮、S = perlStatement 高亮、N = 无高亮) 语法同步有三项设置。前两项关闭部分同步触发规则,仅当高亮出错时 (如滚动时整屏颜 色突变),才需要考虑关闭其中一项。如果可定位出错行,请反馈给开发者。 其中一项使用同步模式 (大致) "^\s*sub\s*",另一项则使用 (大致) "^[$@%]"。 :let g:perl_no_sync_on_sub :let g:perl_no_sync_on_global_var 要设置 VIM 回溯语法高亮起始点的最大行数: :let g:perl_sync_dist = 100 想开启 Perl 代码折叠: :let g:perl_fold = 1 要同时折叠 if 等语句块: :let g:perl_fold_blocks = 1 开启代码折叠时,缺省折叠例程。要关闭之: :let g:perl_nofold_subs = 1 缺省不开启折叠匿名例程;要打开之: :let g:perl_fold_anonymous_subs = 1 开启代码折叠时,缺省也折叠包定义。要关闭之: :let g:perl_nofold_packages = 1 PHP3 和 PHP4 php.vim php3.vim ft-php-syntax ft-php3-syntax [注意: 原先文件类型名为 "php3",现已同时支持 php4,因此改名为 "php"] 支持以下选项。 要开启字符串内部的 SQL 语法高亮: let g:php_sql_query = 1 要高亮基础库 (Baselib) 方法: let g:php_baselib = 1 要打开字符串内部的 HTML 语法高亮: let g:php_htmlInStrings = 1 要使用旧版色彩风格: let g:php_oldStyle = 1 要打开 ASP 风格短标签高亮: let g:php_asp_tags = 1 要禁用已废弃的短标签 (<? … ?>,建议改用 <?php … ?>): let g:php_noShortTags = 1 要将多余的 ] 或 ) 高亮为错误: let g:php_parent_error_close = 1 要在存在未闭合 ( 和 [ 时跳过 php 结束标签的解析: let g:php_parent_error_open = 1 要打开类和函数的代码折叠: let g:php_folding = 1 要选择同步策略: let g:php_sync_method = x x = -1 通过搜索同步 (缺省), x > 0 通过回溯至少 x 行同步, x = 0 从文件开头同步。 PLAINTEX plaintex.vim ft-plaintex-syntax TeX 是排版语言,而 plaintex 文件类型代表 Tex 的 "平凡" 变体。要将 *.tex 文件识 别为平凡 TeX,见 ft-tex-plugin 。 提供以下选项。 要高亮方括号 "[]" 和大括号 "{}": let g:plaintex_delimiters = 1 PPWIZARD ppwiz.vim ft-ppwiz-syntax PPWizard 是用于 HTML 和 OS/2 INF 文件的预处理器。 提供以下选项: - g:ppwiz_highlight_defs : 控制宏定义的高亮模式。可用值为 = 1 : #define 语句内部保留内容本身高亮 (如宏、变量)。 = 2 : 预处理器 #define 和 #evaluate 语句整体统一配色,仅续行符除外。 缺省值为 1。 - g:ppwiz_with_html : 为 1 (缺省) 时,高亮原生 HTML 代码;为 0 时,HTML 当作 普通文本处理。 PHTML phtml.vim ft-phtml-syntax 提供以下两个选项。 要高亮字符串内部的 SQL 语法高亮: :let phtml_sql_query = 1 缺省同步范围为回溯 100 行。要修改该值: :let phtml_minlines = 200 POSTSCRIPT postscr.vim ft-postscr-syntax 提供以下若干选项。 首先选择高亮的 PostScript 语言版本。目前已定义以下三个语言版本,或级别。Level 1 是原始基础版本,包含 Level 2 发布前全部扩展。Level 2 最为通用,包含 Level 3 发布前的全部扩展。Level 3 为当前支持的最高级别。要选择语言级别,可用: :let g:postscr_level=2 省略时缺省值为 2 (对应 Level 2),因为这是当前最常用版本。 注意: 并非所有 PS 解释器都完整支持对应语言级别的全部语言特性。特别是,PS 文件 头部 %!PS-Adobe-3.0 并 代表该文件为 Level 3 PostScript! 使用 Display PostScript 时,要开启其专属语法高亮: :let g:postscr_display=1 使用 Ghostscript 时,要开启其专属语法高亮: :let g:postscr_ghostscript=1 PostScript 是一个庞大的语言,包含许多预定义元素。包含全部元素的高亮很有用,但 在较慢机器上会影响 Vim 速度。出于性能考量,缺省不开启字体名和字符编码高亮。专 门处理字体和字符编码时,可考虑开启两者高亮 (之一或全部): :let g:postscr_fonts=1 :let g:postscr_encodings=1 and、or 和 not 高亮提供一个风格选项。PostScript 里,该组操作符的语义取决于其操 作数类型 - 布尔操作数为逻辑操作符。整数操作数则为按位二进制操作符。因为二进制 和布尔型操作符高亮方式不同,两者只能选一。缺省作为逻辑操作符高亮。要改用二进制 操作符高亮: :let g:postscr_andornot_binary=1 ptcap.vim ft-printcap-syntax PRINTCAP 和 TERMCAP ft-ptcap-syntax ft-termcap-syntax 适用于 printcap 和 termcap 数据库。 文件名不匹配模式 "*printcap*" 或 "*termcap*" 时,需要在 myfiletypefile 文件 (译者注: 新版建议放入用户运行时目录下的 filetype.vim) 里添加自定义匹配规则。匹 配模式时,需要设置变量 b:ptcap_type 为 "print" 或 "term",同时将 'filetype' 选项设为 ptcap。 将 /etc/termcaps/ 下全部文件识别为 termcap 文件的示例: :au BufNewFile,BufRead /etc/termcaps/* let b:ptcap_type = "term" | \ set filetype=ptcap 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下变量设为较大 值 (缺省为 20 行): :let g:ptcap_minlines = 50 PROGRESS progress.vim ft-progress-syntax "*.w" 文件既可以是 Progress,也可以是 cweb。如果自动检测不准确,或者完全不使用 cweb,可在启动 vimrc 里加入: :let g:filetype_w = "progress" 同样适用于可为汇编文件的 "*.i" 扩展名,以及可为 Pascal 文件的 "*.p" 扩展名。如 果完全不使用汇编和 Pascal,可用: :let g:filetype_i = "progress" :let g:filetype_p = "progress" PYTHON python.vim ft-python-syntax 提供以下七个选项。 要关闭数值高亮: :let g:python_no_number_highlight = 1 要关闭内置函数高亮: :let g:python_no_builtin_highlight = 1 要关闭标准异常高亮: :let g:python_no_exception_highlight = 1 要关闭 doctest 及内部代码高亮: :let g:python_no_doctest_highlight = 1 或 (仅关闭内部代码高亮) :let g:python_no_doctest_code_highlight = 1 设置第一个选项隐含第二个选项生效。 要将拖尾空白还有空格和制表混合高亮为错误: :let g:python_space_error_highlight = 1 要将内置常量与其他关键字使用不同高亮: :let g:python_constant_highlight = 1 要打开全部可用 Python 高亮: :let g:python_highlight_all = 1 这等价于设置 g:python_space_error_highlightg:python_constant_highlight , 并清除其余选项。 使用 Python 2 或跨版本代码 (即同时兼容 Python 2 和 3) 时,可强制使用旧版本语法 (支持 Python 2 直到 Python 3.5): :let g:python_use_python2_syntax = 1 这会排除 Python 3.6 或更新版本中的全部现代特性。 注意: 以上选项只需设置即可生效,与变量取值无关,1 可替换成任意值。 QUAKE quake.vim ft-quake-syntax 适用于绝大多数基于 Quake 引擎的 FPS (第一人称射击游戏)。但三款游戏 (Quake、 Quake 2 和 Quake 3 Arena) 所有命令名存在差异。通过以下三个全局变量 (仅检查其是 否给出),限定合法命令集。 仅高亮 Quake 专属命令: :let g:quake_is_quake1 = 1 仅高亮 Quake 2 专属命令: :let g:quake_is_quake2 = 1 仅高亮 Quake 3 Arena 专属命令: :let g:quake_is_quake3 = 1 三个变量可任意组合开启,但可能会高亮目标游戏实际并不支持的命令。 R r.vim ft-r-syntax 语法解析缺省回溯 40 行,要在 vimrc 里设置其他值: let g:r_syntax_minlines = 60 要关闭 ROxygen 语法高亮: let g:r_syntax_hl_roxygen = 0 要打开小括号、方括号和花括号界定代码块的折叠: let g:r_syntax_folding = 1 要使后跟开括号的关键字全部按函数高亮: let g:r_syntax_fun_pattern = 1 R MARKDOWN rmd.vim ft-rmd-syntax 要关闭 YAML 头部语法高亮,在 vimrc 加入: let g:rmd_syn_hl_yaml = 0 要关闭引用键语法高亮: let g:rmd_syn_hl_citations = 0 要开启 knitr 块头部内 R 代码高亮: let g:rmd_syn_hl_chunk = 1 R 代码块缺省遵循 R 语言规则高亮。缓冲区保存时也会自动扫描缓冲区,识别并高亮其 他语言块。缺省保存时也识别并高亮 LaTeX 代码。这些行为可分别用变量 g:rmd_dynamic_fenced_languagesg:rmd_include_latex 控制,其合法值为: let g:rmd_dynamic_fenced_languages = 0 " 关闭代码块语言自动检测 let g:rmd_dynamic_fenced_languages = 1 " 开启代码块语言自动检测 let g:rmd_include_latex = 0 " 关闭 LaTeX 代码高亮 let g:rmd_include_latex = 1 " 自动检测 LaTeX 代码 let g:rmd_include_latex = 2 " 总是启用 LaTeX 高亮 rmd_dynamic_fenced_languages 为 0 时,仍然可以手动设置开启高亮的语法块语言列 表,例如: let g:rmd_fenced_languages = ['r', 'python'] R RESTRUCTURED TEXT rrst.vim ft-rrst-syntax 要开启 knitr 块头部内 R 代码高亮,可在 vimrc 加入: let g:rrst_syn_hl_chunk = 1 RASI rasi.vim ft-rasi-syntax Rasi 代表 Rofi Advanced Style Information (Rofi 高级样式信息)。供 rofi 程序配 置搜索窗口的渲染样式。其语法大量借鉴 CSS。自动识别以下 Rasi 扩展名: .rasi。 READLINE readline.vim ft-readline-syntax readline 库主要供 Bash 外壳使用,Bash 在原生基础上新增大量命令和选项。要高亮 Bash (2.05a 及其后版本,也包括部分更早版本) 扩展项目,可在 vimrc 里加入 (也 可在加载 readline 类型文件前,手动在命令行上输入): let g:readline_has_bash = 1 REGO rego.vim ft-rego-syntax Rego 是 Styra 开发的查询语言。主要用作 kubernetes 策略语言,但可用于几乎任何领 域。自动识别以下 rego 扩展名: .rego。 RESTRUCTURED TEXT rst.vim ft-rst-syntax 文档内代码块仅对指定文件类型开启语法高亮。缺省语法列表见 $VIMRUNTIME/syntax/rst.vim。 要自定义代码块语法高亮列表: let g:rst_syntax_code_list = ['vim', 'lisp', ...] 该变量使用字典类型时,可将多种代码块类型映射到同一种语法: let g:rst_syntax_code_list = { \ 'cpp': ['cpp', 'c++'], \ 'bash': ['bash', 'sh'], ... \ } 要为强调文本启用颜色高亮: let g:rst_use_emphasis_colors = 1 要开启章节折叠: let g:rst_fold_enabled = 1 备注 部分平台上开启折叠可能影响性能。 语法同步的最小回溯行数缺省为 50。要修改此值: let g:rst_minlines = 100 REXX rexx.vim ft-rexx-syntax 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下变量设为较大 值: :let g: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: 操作符高亮 要开启操作符高亮: :let g:ruby_operators = 1 ruby_space_errors Ruby: 空白错误 要开启空白错误高亮: :let g:ruby_space_errors = 1 具体来说,会将拖尾空白,空格后的制表高亮为错误。可进一步通过 g:ruby_no_trail_space_errorg:ruby_no_tab_space_error 变量分别忽略拖尾 空白和空格后制表错误。 ruby_fold ruby_foldable_groups Ruby: 代码折叠 可开启代码折叠: :let g:ruby_fold = 1 会将 'foldmethod' 当前窗口局部选项设为 "syntax",启用 Ruby 文件语法折叠。 缺省折叠粒度较细,如 "if"、"do"、"%w[]" 等小语法单元都会创建相应折叠级别。 要限定可折叠的语法组: :let g:ruby_foldable_groups = 'if case %' 值为空格分隔的关键字列表: 关键字 含义 -------- ------------------------------------- ALL 绝大多数块语法 (缺省) NONE 全部不折叠 if "if" 或 "unless" 块 def "def" 块 class "class" 块 module "module" 块 do "do" 块 begin "begin" 块 case "case" 块 for "for"、"while"、"until" 循环 { 花括号块或哈希常量 [ 数组常量 % "%" 记号常量,如: %w(STRING)、%!STRING! / 正则表达式 string 字符串和外壳命令输出 (使用 '、"、` 字符包围) : 符号 # 多行注释 << Here 文档 __END__ "__END__" 指令之后的源码 ruby_no_expensive Ruby: 降低操作开销 "end" 关键字缺省根据其闭合块的起始语句使用不同高亮。尽管很有用,该特性很消耗资 源: 如果重绘变慢 (或者终端颜色支持有限等原因),可关闭该特性: :let g:ruby_no_expensive = 1 此时,所有的控制关键字使用相同高亮。 ruby_minlines 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下变量设为较大 值 (超过 50): :let g:ruby_minlines = 100 取值应大于源码中最大类或模块所需的行数。 ruby_spellcheck_strings Ruby: 字符串拼写检查 可开启字符串内部的拼写检查: :let g:ruby_spellcheck_strings = 1 SCHEME scheme.vim ft-scheme-syntax 缺省仅高亮和正确缩进 R7RS 关键字。 同时支持 Chicken Scheme->C 编译器扩展语法。要启用该扩展,设置 b:is_chickeng:is_chicken 。 SDL sdl.vim ft-sdl-syntax SDL 关键字数量庞大,高亮存在部分关键字缺漏在所难免。 SDL-2000 新标准要求标识符区分大小写 (旧标准并非如此),但关键字接受全大写或全小 写两种形式。要开启新标准模式: :let g:sdl_2000=1 开启后会加载大量新关键字。建议同时关闭旧版关键字: :let g:sdl_no_96=1 缩进实现经作者测试已经够用,但可能未必完善。 SED sed.vim ft-sed-syntax 要使制表符与普通空格区分开来 (具体是通过 Todo 高亮),可在 vimrc 里加入: :let g:sed_highlight_tabs = 1 (仅作用于搜索模式、替代文本、地址或 Append/Change/Insert 命令内含文本中的制 表。) 打开该选项时建议将制表宽度设为一个字符;方便计算字符串内的制表数量。 GNU sed 允许注释出现在同行文本之后。BSD sed 则只允许 "#" 在行首的注释。要强制 BSD-风格注释规则,即将行尾注释高亮为错误,可用: :let g:sed_dialect = "bsd" 注意 此设置 (仍) 未反映 GNU sed 和 BSD sed 其余的差异。 已知缺陷: 转换命令 (y) 被当作替代命令处理。语法文件会误认为转换命令接受替代命令相同的 标志位,但转换命令实际无标志位。因为牵涉命令需要非常复杂的处理 (需要 95 套不 同模式定界符的正则表达式),该问题暂时保留。 SGML sgml.vim ft-sgml-syntax SGML 文件内,使用以下标签色彩方案。 起始标签 <> 和闭合标签 </> 配色不同。这是有意的设计!起始标签使用 'Function' 高亮,而闭合标签使用 'Type' 高亮 (具体高亮定义可查看 syntax.vim)。 已知标签名使用 C 语句 (Statement) 高亮。未知标签名与其相应的 <> 或 </> 使用相 同高亮,以便纠错。 注意 参数 (或属性) 名使用相同逻辑。已知和未知属性名使用不同高亮。 部分 SGML 标签的作用是改变文本的渲染效果。识别以下风格标签,并相应调整普通文本 的显示方式: <varname> <emphasis> <command> <function> <literal> <replaceable> <ulink><link>。 要调整文本渲染效果,必须重定义以下语法组: - sgmlBold - sgmlBoldItalic - sgmlUnderline - sgmlItalic - sgmlLink (链接) 必须同时重定义所有组,并在 vimrc (受初始化文件加载顺序限制) 里加入 :let g:sgml_my_rendering=1 要完全关闭风格标签渲染效果,可在 vimrc 文件里加入: :let g:sgml_no_rendering=1 (改编自 Claudio Fleiner <claudio@fleiner.com> 的 html.vim 的帮助文档) ft-posix-syntax ft-dash-syntax SH sh.vim ft-sh-syntax ft-bash-syntax ft-ksh-syntax 支持老式 Unix (Bourne) sh 以及 bash、dash、posix 和 Korn 新式外壳的语法高亮。 Vim 通过文件名自动识别外壳类型,例如: ksh : .kshrc* *.ksh bash: .bashrc* bashrc bash.bashrc .bash_profile* *.bash 完整模式列表可见 $VIMRUNTIME/filetype.vim。无匹配时,解析文件首行 (查找 /bin/sh /bin/ksh /bin/bash 等内容),使用找到的类型。部分脚本 (如 .profile) 已 知为外壳专用,但类型不易推断。另外很多系统里 sh 被符号链接到 "bash" (Linux、 Windows+cygwin) 或 "ksh" (POSIX),增加了推断难度。 可在 <.vimrc> 里设置以下变量之一,手动设置全局缺省值: ksh: let g:is_kornshell = 1 posix: (缺省) let g:is_posix = 1 bash: let g:is_bash = 1 dash: let g:is_dash = 1 sh: Bourne shell let g:is_sh = 1 依据 shebang 行 ("#! ...") 成功检测外壳后,会自动打开对定外壳特性。KornShell 可区分 mksh、ksh88、ksh93、ksh93u、ksh93v 和 ksh2020 不同版本的特性。 无 "#! ..." 一行,且未手动覆盖语法设置时,默认采用 POSIX 外壳语法。报错反馈时 请勿引用 RFC 或者市场占有率数据 (译者注: 此处大概指希望使用其它缺省值的用户) -- 直接自行选择当前系统的缺省 sh 版本并手动设置相应变量即可。 提供若干级别的基于语法的折叠: let g:sh_fold_enabled= 0 (缺省,无语法高亮) let g:sh_fold_enabled= 1 (开启函数折叠) let g:sh_fold_enabled= 2 (开启嵌入 (here) 文档折叠) let g:sh_fold_enabled= 4 (开启 if/do/for 折叠) 开启后会创建指定语法项 (Here 文档、函数等) 的语法折叠 (见 :syn-fold )。位 掩码可相加组合,例如: let g:sh_fold_enabled= 3 (同时开启函数和嵌入文档折叠) 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下变量设为较大 值: let g:sh_minlines = 500 语法同步此时在首个可视行上方 500 行开始。缺省值为 200。但该值越大则重绘效率越 低。 同步内容较少时,显示可能很慢,可设置语法同步行数上限: let g:sh_maxlines = 100 缺省为 g:sh_minlines 的两倍。调小可加快显示速度,但代价是增大高亮出错概率。 若干问题缺省会高亮为错误;包括常见的未配对 ']'、'done''fi' 等情况。如果错误 处理不正常,可在 .vimrc 里屏蔽错误高亮: let g:sh_no_error= 1 sh-embed sh-awk Sh: 内 嵌 语 言 可在外壳脚本里内嵌其他语言。以 Lorance Stinson 提供了 awk 内嵌为例。将以下内容 写入 $HOME/.vim/after/syntax/sh/awkembed.vim 文件: >vim " AWK 内嵌: " ========= " 毫不客气照搬了 Aaron Hope 的 aspperl.vim。 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 工厂仿真器) 提供以下选项: - g:strict_subsections : 给出时,仅节 (section) 和子节 (subsection) 关键字会 作为 Statement 高亮,其他关键字 (如 OPERATION 节里的 WITHIN) 不会。 - g:highlight_types : 给出时,temperature 或 pressure 等流类型使用 Type 高 亮而非普通 Identifier。这里包含了 DECLARE 节常见类型;自定义类型需要修改语法 文件。 - g:oneline_comments : 取值 1 到 3,控制 # 风格注释的高亮方式。 = 1 : 偶数个 # 之后允许正常 Speedup 代码。 = 2 : 第二个 # 开始的内容高亮为错误。这是缺省设置。 = 3 : 包含超过一个 # 的整行高亮为错误。 由于 OPERATION 节尤其容易因为包含巨量 PRESET (预设) 变量,正确同步设置非常重 要。机器速度够快时,可在语法文件的末尾增加 minlines 和/或 maxlines 的值。 SQL sql.vim ft-sql-syntax sqlinformix.vim ft-sqlinformix-syntax sqlanywhere.vim ft-sqlanywhere-syntax SQL 尽管有 ANSI 标准,各数据库引擎都有私有扩展。Vim 目前支持 Oracle 和 Informix 的 SQL 方言。"*.sql" 文件缺省使用 Oracle SQL。 不同厂商 SQL 支持目前通过不同语法脚本提供。可修改缺省设置,从 Oracle 改为任何 目前支持的 SQL 类型。也可按缓冲区独立切换 SQL 方言。 详见 ft_sql.txt 。 SQUIRREL squirrel.vim ft-squirrel-syntax Squirrel 是命令式面向对象高级程序语言,设计目标是轻量级脚本语言,满足视频游戏 之类应用对体积、内存带宽和实时性等需求。自动识别以下 squirrel 文件类型扩展名: .nut。 TCSH tcsh.vim ft-tcsh-syntax 用于名为 "tcsh" 的外壳。这是 csh 的超集。文件类型检测规则见 csh.vim 。 tcsh 的字符串内缺省不支持用 \" 转义,仅当开启 "backslash_quote" 外壳变量时才允 许。要使 VIM 认定不存在该转义语法 (缺省支持),可在 .vimrc 里加入: :let g:tcsh_backslash_quote = 0 如果反向滚动出现高亮问题,但可用 CTRL-L 重绘手动修复,可尝试将以下变量设为较大 值: :let g:tcsh_minlines = 1000 语法同步此时在首个可视行上方 1000 行开始。缺省值为 100。但该值越大则重绘效率越 低。也可设置此变量为特殊值 "fromstart",强制从文件开头执行语法同步。 TEX tex.vim ft-tex-syntax latex-syntax syntax-tex syntax-latex Tex 内容 Tex: 要语法折叠么? tex-folding Tex: 不想拼写检查 g:tex_nospell Tex: 不想检查注释里的拼写? tex-nospell Tex: 需要在 Verbatim 区中使用拼写检查? tex-verb Tex: 在注释还是数学模式里 tex-runon Tex: 语法高亮很慢? tex-slow Tex: 想高亮更多的命令? tex-morecommands Tex: 过于激进的 Error 高亮? tex-error Tex: 需要新的数学环境? tex-math Tex: 要自定义样式? tex-style Tex: 利用隐藏模式进行渲染 tex-conceal Tex: 选择性隐藏模式 g:tex_conceal Tex: 控制 iskeyword g:tex_isk Tex: 上下标精细控制 tex-supersub Tex: 匹配检查控制 tex-matchcheck tex-folding g:tex_fold_enabled Tex: 要语法折叠么? 语法版本 28 支持 part、chapter、section、subsection 等项目的语法折叠。可将 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 文档的拼写检查,可在 .vimrc 里加入 let g:tex_nospell=1 要仅在注释中关闭拼写检查,见下 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: 需要在 Verbatim 区中使用拼写检查? verbatim 环境通常用于存放源码;缺省不对该区域进行拼写检查。要开启 verbatim 区 的拼写检查,可在 <.vimrc> 里放入: let g:tex_verbspell= 1 tex-runon tex-stopzone Tex: 在注释还是数学模式里? 支持 TeX、LaTeX 和部分 AmsTeX 高亮。高亮支持包括三大区域: 普通文本、texZone 和 texMathZone。尽管已经付出相当努力,确保这些区域能够正确结束,但由于 $..$ 和 $$..$$ 定界区域的起始和结束模式无法区分,这类区域无法正确同步。为此,提供特殊 "TeX 注释" 标记 %stopzone 用以强制终止 texZone 或 texMathZone 的高亮。 tex-slow tex-sync Tex: 语法高亮很慢? 如果机器速度较慢,可调小以下设置值 :syn sync maxlines=200 :syn sync minlines=50 (后者尤其有效)。相反,机器速度很快时,可调大这些值。这些设置主要影响语法同步 (即如何判断屏幕顶部文本所属的语法组 (如有))。 语法折叠也会影响高亮速度;解决办法见 tex-folding g:tex_fast 如果语法高亮还是太慢,最后可在 .vimrc 里设置 :let g:tex_fast= "" 此时,不再定义各类语法区域及相关同步规则。从而使语法高亮速度大幅提升;但作为代 价: 高亮能力削弱,语法折叠失效,也无法基于语法进行错误检查。 也可选择性启用部分语法项目;参见下表: b : 接受粗体和斜体语法 c : 接受 texComment 语法 m : 接受 texMatcher 语法 (即 {...} 和 [...]) M : 接受 texMath 语法 p : 接受 part、chapter、section 等语法 r : 接受 texRefZone 语法 (nocite、bibliography、label、pageref、eqref) s : 接受 上标/下标区域 S : 接受 texStyle 语法 v : 接受 verbatim 语法 V : 接受 texNewEnv 和 texNewCmd 语法 示例,`g:tex_fast= "M"` 仅打开数学相关高亮,但关闭其他环境的语法高亮。 (另见: g:tex_concealtex-supersub ) tex-morecommands tex-package Tex: 想高亮更多的命令? LaTeX 是编程语言,拥有数以千计的宏包,包含各种专用 LaTeX 命令、语法和字体。用 户当然希望语法脚本能内置支持所有用户实际使用的宏包,但这显然不切实际。请考虑使 用 mysyntaxfile-add 介绍的方法,扩展或修改已有高亮。也请考虑将编写的扩展写入 $HOME/after/syntax/tex/[pkgname].vim,并上传到 http://vim.sf.net/。 作者个人网站上提供了若干常用宏包的支持: http://www.drchip.org/astronaut/vim/index.html#LATEXPKGS 下载后可放入 .../after/syntax/tex/ 目录。 tex-error g:tex_no_error Tex: 过于激进的 Error 高亮? 支持各种词法错误检查。尽管很有用,但有时会误报。要关闭全部语法错误检查,可在 <.vimrc> 里放入: let g:tex_no_error=1 tex-math Tex: 需要新的数学环境? 要新增 LaTeX 数学环境,可在 .vim/after/syntax/tex.vim 里调用: call TexNewMathZone(sfx,mathzone,starform) "sfx" 为新环境专用唯一后缀 (目前,A-L (译者注: 脚本实际使用 A-I) 和 V-Z 已 被脚本占用),"mathzone" 为新环境名,"starform" 变量为真时,代表新环境存在带星 号的变体 (如 "eqnarray*")。eqnarray 环境示例: call TexNewMathZone("D","eqnarray",1) tex-style b:tex_stylish Tex: 要自定义样式? 可在 *.tex 文件里使用 "\makeatletter",使命令可用 "@"。但因为 *.tex 文件不使用 以下扩展名: sty cls clo dtx ltx,"@" 缺省会被高亮为错误。要为当前缓冲区解决此 问题: :let b:tex_stylish = 1 :set ft=tex 也可在 <.vimrc> 里加入 `let g:tex_stylish=1`,全局生效。 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 。缺省为 "admgs", 可用字符分别为: a = 重音/连写体 (accents/ligatures) b = 粗体和斜体 d = 定界符 m = 数学符号 g = 希腊字母 s = 上标/下标 删除对应字符,代表该类文本不再用隐藏字符替代。 g:tex_isk g:tex_stylish Tex: 控制 iskeyword LaTeX 缺省关键字字符包括 0-9、a-z、A-Z、192-255。除 *.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",所以,应在 ~/.vim/ftplugin/tex/tex.vim 里放入 let g:tex_subscripts= "[0-9aeijoruvx,+-/().]" 避免出现无法渲染的 utf8 字形。 tex-matchcheck g:tex_matchcheck Tex: 匹配检查控制 部分场景可能故意使用不匹配的小括号、方括号和/或花括号;例如, \text{(1, 10]} 为从 1 (开) 到 10 (闭) 的半开区间。这与括号匹配检测机制 有冲突。为此,可设置以下正则模式 (示例为缺省值): let g:tex_matchcheck = '[({[]' 该模式会分别匹配 '('、'['、'{' 字符,判定是否进行对应括号的匹配检测。 例如,要跳过 [] 和 () 匹配检测,可用: let g:tex_matchcheck= '[{]' 要关闭在粗体和斜体区域内的匹配检测,可用: let g:tex_excludematcher= 1 这会在粗斜体区域中不加载 texMatcher 语法组。 TF tf.vim ft-tf-syntax 提供一个选项。 语法同步的最小回溯行数缺省为 100。要修改此值: :let g:tf_minlines = 用户选择 TYPESCRIPT typescript.vim ft-typescript-syntax typescriptreact.vim ft-typescriptreact-syntax 提供一个选项。 g:typescript_host_keyword 变量设为 1 时 (缺省),高亮 addEventListener 等宿主环境专属 API。可在 .vimrc 里设为零以关闭相应高亮: let g:typescript_host_keyword = 0 TYPST ft-typst-syntax 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 : 设置同步最小行数 g:vimsyn_maxlines : 设置同步最大行数 (g:vim_minlines 和 g:vim_maxlines 是对应已废弃名) g:vimsyn_embed 要控制内嵌脚本高亮的类型: g:vimsyn_embed == 0 : 不支持任何内嵌脚本 g:vimsyn_embed =~# 'l' : 支持内嵌 Lua g:vimsyn_embed =~# 'm' : 支持内嵌 MzScheme g:vimsyn_embed =~# 'p' : 支持内嵌 Perl g:vimsyn_embed =~# 'P' : 支持内嵌 Python g:vimsyn_embed =~# 'r' : 支持内嵌 Ruby g:vimsyn_embed =~# 't' : 支持内嵌 Tcl 该变量未设置时,默认支持 Lua 和 Python 脚本接口。 g:vimsyn_folding 'foldmethod' 设为 "syntax" 时,支持以下折叠: g:vimsyn_folding == 0 或未设置: 无语法折叠 g:vimsyn_folding =~# 'a' : 折叠自动命令组 g:vimsyn_folding =~# 'c' : 折叠 Vim9 类 g:vimsyn_folding =~# 'e' : 折叠 Vim9 枚举 g:vimsyn_folding =~# 'f' : 折叠函数 g:vimsyn_folding =~# 'h' : 折叠 let 嵌入文档 (heredoc) g:vimsyn_folding =~# 'i' : 折叠 Vim9 接口 g:vimsyn_folding =~# 'H' : 折叠 Vim9 老式头部 (译者注: vim9script) g:vimsyn_folding =~# 'l' : 折叠 Lua 嵌入文档 g:vimsyn_folding =~# 'm' : 折叠 MzScheme 嵌入文档 g:vimsyn_folding =~# 'p' : 折叠 Perl 嵌入文档 g:vimsyn_folding =~# 'P' : 折叠 Python 嵌入文档 g:vimsyn_folding =~# 'r' : 折叠 Ruby 嵌入文档 g:vimsyn_folding =~# 't' : 折叠 Tcl 嵌入文档 该变量缺省未设置。可拼接相应字符,同时支持多种语法构造的折叠 (例如, `g:vimsyn_folding = "fh"` 同时开启函数及嵌入文档折叠)。 g:vimsyn_comment_strings 缺省高亮注释内部的字符串。可将 g:vimsyn_comment_strings 设为 false 关闭该行 为。 g:vimsyn_noerror Vim 脚本语法复杂,高亮要完全正确难度很高。错误高亮可能存在误报。要关闭全部错误 高亮,可在 vimrc 里加入: let g:vimsyn_noerror = 1 要仅屏蔽特定类型的错误,可定义以下变量: g:vimsyn_nobehaveerror = 1 " :behave 错误 g:vimsyn_vimFTError = 1 " :filetype 错误 g:vimsyn_noaugrouperror = 1 " :augroup 错误 g:vimsyn_noopererror = 1 " operator 错误 g:vimsyn_notypealiaserror = 1 " Vim9 type alias 错误 g:vimsyn_novimfunctionerror = 1 " Vim9 method 错误 g:vimsyn_nousercmderror = 1 " :com 错误 g:vimsyn_novimsynerror = 1 " :syn 错误 g:vimsyn_novimsyncaseerror = 1 " :syn case 错误 g:vimsyn_novimsynconcealerror = 1 " :syn conceal 错误 g:vimsyn_novimsynfoldlevelerror = 1 " :syn foldlevel 错误 g:vimsyn_novimsynspellerror = 1 " :syn spell 错误 g:vimsyn_novimsyncerror = 1 " :syn sync 错误 g:vimsyn_novimhictermerror = 1 " :hi 错误 g:vimsyn_vimhikeyerror = 1 " :hi key=arg 错误 要强制启用 Neovim 专属 Vim 脚本元素高亮 (即使用于非 Neovim 环境),可设置 let g:vimsyn_vim_features = ['nvim'] WDL wdl.vim wdl-syntax WDL 代表工作流描述语言,面向生物信息学,用于定义数据处理工作流,语法易读易写。 规格详见: https://github.com/openwdl/wdl XF86CONFIG xf86conf.vim ft-xf86conf-syntax XFree86 v3.x 和 v4.x 版本的 XF86Config 文件语法有所不同。两种变体都支持,且提 供自动检测,但尚不完善。要手动指定版本,可在 .vimrc 里加入: :let g:xf86conf_xfree86_version=3 可用值为 3 或 4。要混合使用多种版本,可按缓冲区设置 b:xf86conf_xfree86_version 变量。 注意 选项名不支持空格和下划线。要正确高亮选项名,请使用 "SyncOnGreen" 这类规范 写法、而非 "__s yn con gr_e_e_n"。 XML xml.vim ft-xml-syntax 缺省高亮 Xml 命名空间。要关闭之: :let g:xml_namespace_transparent=1 xml-folding 要开启起始标签和闭合标签之间的语法折叠 folding (见 :syn-fold )。可用: :let g:xml_syntax_folding = 1 :set foldmethod=syntax 注意: 语法折叠会显著减慢语法高亮。大文件尤其如此。 X Pixmaps (XPM) xpm.vim ft-xpm-syntax 语法脚本会根据 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 " 可以看到光标下的颜色 鼠标右键用作像素提取 (吸管) 工具,而鼠标左键用作画笔。仅适用于单字符像素的 XPM 文件,也无法在像素字符串之外点击。但欢迎自行改进。 推荐使用方形像素字体,效果会舒服很多。例如在 X 上可用: :set guifont=-*-clean-medium-r-*-*-8-*-*-*-*-80-* YAML yaml.vim ft-yaml-syntax g:yaml_schema b:yaml_schema YAML 模型是一组标签和用于解析非特定标签的机制的组合。对用户来说,这意味着 YAML 解析器可以根据普通标量内容,将其 (实际本身只能是字符串) 当作其他类型的值来处 理: null、布尔型、浮点数或整数。 g:yaml_schema 选项指定用于对值特殊高亮的模 型。支持的模型为 模型 描述 failsafe 不进行额外高亮。 json 支持 JSON 风格的数值、布尔型和 null。 core 支持更多形式的数值、布尔型和 null。 pyyaml 在 core 模型基础上,还支持时间戳高亮,但在数值识别方式和 core 模型有所区别,也支持更多 core 模型中没有的额外布尔值。 缺省模型为 core注意 模型实际不局限于普通标量,但这是 YAML 规格定义的模型间的唯一区别,也是语 法文件定义的模型间的唯一区别。 ZSH zsh.vim ft-zsh-syntax 要开启语法折叠: :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" 模式匹配应被跳过。 多个语法 项目 可归入同一语法 。然后为整个语法组设置高亮属性。例如,可分 别定义 "/* ... */" 和 "// ..." 两种注释语法项,然后将两者归入 "Comment" 组。此 时可一次将 "Comment" 组设为粗体字体和蓝色前景色。可以为每个语法项单独设置高亮 组,也可将所有语法项放入同一个组,具体选择取决于希望如何设置高亮属性。要为每个 语法项单独设置高亮组,会导致需要为大量组分别指定高亮。 注意 语法组与高亮组概念相近。高亮组指定高亮属性,而同名语法组会直接应用这些属 性。 同一位置匹配多个语法项时,*最后*定义的项目胜出。也就是说,在匹配相同文本的语法 项间,后定义的覆盖先前定义的。不过,关键字项总是优先于匹配项和区域项,而区分大 小写的关键字项又优先于忽略大小写的关键字项。 优 先 级 :syn-priority 多个语法项都可匹配时,优先级规则如下: 1. 多个匹配项或区域项在同一位置开始时,最后定义者优先。 2. 关键字项优先于匹配和区域项。 3. 起始位置更早的项目优先于起始位置靠后的项目。 定 义 大 小 写 敏 感 :syn-case E390 :sy[ntax] case [match | ignore] 决定后续 ":syntax" 命令在使用 "match" 时区分大小写,而在使用 "ignore" 时忽略大小写。注意,本命令不会影响之前定义的项目,作用范围会一直持续到 下一条 ":syntax case" 命令为止。 :sy[ntax] case 显示当前大小写匹配规则,"syntax case match" 或 "syntax case ignore"。 定 义 折 叠 级 别 :syn-foldlevel :sy[ntax] foldlevel start :sy[ntax] foldlevel minimum 决定使用 foldmethod=syntax 时,文本行折叠级别的计算方式 (见 fold-syntax:syn-fold ): start: 使用包含该行行首的语法项的折叠级别。 minimum: 使用该行上所有语法项局部最小折叠级别的最小值。 缺省是 "start"。选择 "minimum" 会水平扫描整行,寻找折叠级别先降后升的 点 (局部最小点) 的全局最小值。一行之内同时存在语法项的关闭与展开时,该 模式生成的折叠效果更加自然。 :sy[ntax] foldlevel 显示当前折叠级别计算方式,"syntax foldlevel start" 或 "syntax foldlevel minimum"。 {仅当 Vim 编译时加入 +folding 特性才有效} 拼 写 检 查 :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' 设置。 {option} 将语法特定关键字字符集设为 {option}。 示例: :syntax iskeyword @,48-57,192-255,$,_ 语法特定关键字将包含所有字母、数位、重音字符、以及 "_" 和 "$"。 参数省略时,显示当前设置。 本选项会影响语法模式中的 /\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] 切记关键字必须完全由关键字字符组成。否则,该关键字永远不会被识别。 多字节字符不受此限,无需在关键字字符集中列出。 :syn-iskeyword 说明语法专用关键字字符集设置。 关键字项优先于匹配和区域项。有多个项目匹配时,会优先使用关键字项。关键 字不支持嵌套,也不能包含其他语法项。 注意 禁止使用与选项同名的关键字 (即使本命令不支持的选项也不行)。可改用 匹配项代替。 关键字最大长度为 80 个字符。 根据其包含关系不同,同一关键字可定义多次。例如,可将该关键字定义一次为 不包含于其他语法项,并使用一种高亮组。再定义一次为包含于其他语法项,并 使用另一种高亮组。例如: :syn keyword vimCommand tag :syn keyword vimSetting contained tag 当 "tag" 不在任何语法项内部时,使用 "vimCommand" 高亮组。而当 "tag" 出 现在包含 "vimSetting" 的父语法项内部时,则使用 "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注意 模式可以跨行匹配,多行匹配结果受语法同步 起始位置影响。必需配置同步规则保证正确性。 示例 (匹配单字符常量): :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" 约束。 见 :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=+"+ 起始 / 跳过 / 结束模式和选项顺序任意。跳过模式可有零到一个。起始和结束 模式必须指定一个或更多。换而言之,跳过模式可省略,起始和结束模式不可省 略。等号前后可添加空白字符 (但不加空白通常更美观)。 给出多个起始模式时,只需匹配其中任意一个。起始模式之间是*或*关系。多个 模式同时匹配时,以最后一个模式为准。结束模式同理。 结束模式从起始模式匹配文本后方开始搜索,不应用偏移。因此结束模式永远不 会与起始模式的匹配文本重叠。 跳过和结束模式理论上可跨行匹配,但由于模式搜索可从任意行开始,通常无法 达到预期结果。跳过模式也无法跳过下一行里出现的结束模式。为避免问题,推 荐只使用单行模式。 注意: 区域的开启完全由有否起始模式匹配决定。并不检查是否存在结束模式的 匹配。下例 无法 达成预期效果: :syn region First start="(" end=":" :syn region Second start="(" end=";" Second 后定义,优先级高于 First,因此总在 First 之前匹配成功,区域会一 直延续到其后出现的 ';' 结束 (如有)。即使 ':' 在此之前出现,也不会影响 结果。要根据结束模式决定语法项,可改用匹配项: :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 "extend" 参数可改变外层 "keepend" 行为。内层语法项使用 "extend" 时,忽 略外层语法项的 "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>" 的子语法项只会影响其高亮。但该区域支持自嵌套 (自己包含自己),同 时带有的 "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 效果。 在使用 "matchgroup" 高亮的起止模式匹配文本上,不检查内层语法项,避免内 层项匹配起止模式的部分匹配文本,影响其高亮。使用 "transparent" 的内层 语法项不适用此条限制。 以下是使用不同颜色高亮三层括号的示例: :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 命令参数 :syn-arguments

定义语法项的 :syntax 命令接受多种参数。以下解释其中的通用参数。通用参数可与模 式按任意次序混用。 并非所有参数都适用于全部命令。下表列出仅有部分命令支持的参数: E395 contains oneline fold display extend concealends :syntax keyword - - - - - - :syntax match 是 - 是 是 是 - :syntax region 是 是 是 是 是 是 以下参数在所有三条命令里全部可用: conceal cchar contained containedin nextgroup transparent skipwhite skipnl skipempty conceal conceal :syn-conceal 给出 "conceal" 参数时,语法项被标记为可隐藏。实际隐藏与否由 'conceallevel' 选 项控制。'concealcursor' 选项决定当前行的可隐藏项是否展开显示,方便编辑。 隐藏文本的另一种办法是通过 matchadd() ,但二者使用不同的内部机制 syntax-vs-match 。 concealends :syn-concealends 给出 "concealends" 参数时,区域项的起止匹配文本 (不含区域内容本身) 被标为可隐 藏,实际隐藏与否由 'conceallevel' 选项控制。仅当通过 "matchgroup" 使用独立高亮 时,区域项的起止匹配文本才能以这种方式隐藏。 synconcealed() 函数可查询可隐藏 项相关信息。 cchar :syn-cchar E844 "cchar" 参数定义文本隐藏后用来替代显示的字符 (仅搭配 conceal 参数才有意义)。 "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" (透明) 参数时,语法项自身不应用独立高亮,而是继承外层语法项 的高亮属性。适用仅用来跳过一段文本,本身不需要独立高亮的语法项。 带 "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",因而使之被高亮为 Comment。注意虽然也可包含 "myVim" 自身,但 语法项不接受在相同位置在其内层再次匹配自身,因此在最内层,"myVim" 虽然优先级更 高,但不会覆盖 "myWord" 匹配。 着色文本实际由多层语法项组成。内层项目在外层项目之上,因此通常采用内层项目的颜 色。但内层项目透明时,视线会穿透,显示外层项目的颜色。以图示之: 从这里看 | | | | | | V V V V V V xxxx yyy 再内层项目 .................... 内层项目 (透明) ============================= 顶层项目 'x'、'y' 和 '=' 分别代表使用不同高亮的语法项。'.' 代表透明组。 最终视觉效果是: =======xxxx=======yyy======== 也就是说,视线 "穿透" 了透明层 "...."。 oneline :syn-oneline "oneline" 参数指示区域项不能跨行,必须在当前行内完整匹配。但内层包含跨行语法项 时,本区域仍会延续到下一行。内层语法项可用于识别续行模式。不过,结束模式仍然必 须在首行上匹配,否则整个区域不会启动。 起始模式包含 "\n" 匹配换行符时,结束模式必须出现在起始模式结束位置所在行。结束 模式本身也可匹配换行符。换而言之,"oneline" 参数只是约束起始模式的终点和结束模 式的起点必须位于同一行。匹配换行符的跳过模式同样不能突破此限制。 fold :syn-fold "fold" 参数使得语法项的折叠级别加 1。示例: :syn region myFold start="{" end="}" transparent fold :syn sync fromstart :set foldmethod=syntax 每个 {} 代码块生成一层折叠。 折叠从语法项起始行开始,语法项结束行结束。起止位于同一行时,不生成折叠。 'foldnestmax' 选项限制语法折叠的最大嵌套深度。 :syn-foldlevel 控制由一行的语法项计算其折叠级别的规则。 {仅当 Vim 编译时加入 +folding 特性才有效} :syn-contains E405 E406 E407 E408 E409 contains={group-name},... "contains" 参数后跟一组语法组名列表。这些语法组可从当前项内部开始匹配 (但可延 伸超出当前项的结束位置)。从而实现匹配项和区域项的递归嵌套。未给出 "contains" 参数时,当前项不允许包含任何组。组名可先引用,后定义。 contains=ALL 唯一列表项为 "ALL" 时,当前项可包含所有语法组。 contains=ALLBUT,{group-name},... 列表以 "ALLBUT" 开头时,当前项可包含除所列组名外的所有其他语法 项。示例: :syntax region Block start="{" end="}" ... contains=ALLBUT,Function contains=TOP 唯一列表项为 "TOP" 时,当前项可包含所有不带 "contained" 参数的 顶层语法组。 contains=TOP,{group-name},... 类似 "TOP",但排除所列组名。 contains=CONTAINED 唯一列表项为 "CONTAINED" 时,当前项可包含所有带 "contained" 参 数的非顶层语法组。 contains=CONTAINED,{group-name},... 类似 "CONTAINED",但排除所列组名。 "contains" 列表中的组名 {group-name} 支持模式匹配。所有匹配的组名都会被包含 (使用 "ALLBUT" 等则为排除)。模式不能包含空白或 ','。例如: ... contains=Comment.*,Keyw[0-3] 模式匹配在执行此 syntax 命令时完成。其后定义的组不会再参与匹配。另外,当前 syntax 命令如果新建了语法组,该组本身不参与匹配。小心: 语法脚本可能被重复加 载,而 ":syn clear" 也不会清除组名,因此,不要依赖于特定组 尚未 被定义。 内层语法组缺省也会在区域项的起止模式匹配文本中匹配。如果不想如此,可用 "matchgroup" 参数 :syn-matchgroup 。内层语法组确已匹配时,可用 "ms=" 和 "me=" 偏移调整其生效范围。目能够匹配的区域。注意 这可能同时影响了当前组的高亮区域。 containedin={group-name},... :syn-containedin "containedin" 参数后跟一组语法组名列表。当前项可包含在所列组内,效果相当于该组 "contains=" 参数显式包含当前项。 仅考虑直接包含当前项的项目 (位于当前语法栈的栈顶)。Vim 不会向上搜索更远的祖 先。直接外层语法项未通过 :syn-contains 包含当前项、也未在当前项的 "containedin=" 里列出时,即使更外层的祖先可包含当前项,也不会启动当前项的匹 配。 注意 :syn-transparent 区域会执行其自身特有的 :syn-contains 规则。 {group-name},... 的用法和上述的 "contains" 完全一致。 本参数适合后期追加的语法项。新增语法项可嵌入已有项目,而无需修改后者的定义。 在已加载 C 语法后,要高亮 C 注释内部单词的示例: :syn keyword myword HELP containedin=cComment contained 注意 此处同时使用 "contained" 参数,确保当前项不会在顶层被匹配。 "containedin" 只是额外增加一处可匹配的位置。可如常使用 "contains" 参数。要谨记 关键字项不能包含其他语法项。将其加入 "containedin" 列表不会起作用。 另见: :syn-contains:syn-transparent 。 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。如 果使用了贪婪版本的 ".*",该行首个 "Foo" 和最后一个 "Bar" 之间的全部内容都会匹 配 ccBar,从而导致 "Bar" 和 "Foo" 之间的 "asdf" 会误用 "ccFoobar" 高亮 (见 pattern )。 skipwhite :syn-skipwhite skipnl :syn-skipnl skipempty :syn-skipempty 这些参数仅能配合 "nextgroup" 使用。用于跳过一段文本后再尝试匹配后续语法组: skipwhite 跳过空格和制表字符 skipnl 跳过换行符 skipempty 跳过空行 (隐含 "skipnl") 给出 "skipwhite" 时且没有匹配空白的后续语法组时,可跳过空白字符。 给出 "skipnl" 且当前项在本行末尾结束时,可在下一行内匹配后续语法组。未给出 "skipnl" 时,仅在当前项结束位置之后、同一行内匹配。 查找后续语法组并跳过文本期间,忽略其余组的匹配。仅当无后续语法组可匹配时,才恢 复正常流程,尝试匹配其余项。也就是说,跳过空白和 <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" 参数 (本例为简化演示予以省 略)。 隐 含 隐 藏 :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

syntax 命令中使用模式必须用一对相同的字符包围。和 :s 命令用法相同。双引号最 常用。但模式本身包含双引号时,可改用其他模式中不出现的字符。例如: :syntax region Comment start="/\*" end="\*/" :syntax region String start=+"+ end=+"+ skip=+\\"+ 正则模式语法见 pattern 。语法模式总是假定 'magic' 选项开启,同时假定 'cpoptions' 里不含 'l' 标志位 cpo-l 。这些设置确保语法文件可移植,不受用户 'compatible''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 匹配项 是 是 是 是 - - 是 区域项起始模式 是 - 是 - 是 - 是 区域项跳过模式 - 是 - - - - 是 区域项结束模式 - 是 - 是 - 是 是 可用 ',' 连接多个偏移。例如: :syn match String /"[^"]*"/hs=s+1,he=e-1 一些 "字符串" 文本 ^^^^^^ 高亮部分 注意: - 模式和字符偏移之间不能添加空白。 - 高亮区域永远不会超出匹配文本的范围。 - 结束模式的负偏移未必总可用,有可能在高亮本应已终止的位置之后才能检测到结束模 式。 - Vim 7.2 之前,偏移量按字节计数。这不适配多字节字符,因此 Vim 7.2 版本开始改 为按字符计数。 - 匹配文本起点不能超出实际匹配所在行。以下无效: "a\nb"ms=e。但高亮起点不受此限 制,以下可行: "a\nb"hs=e。 示例 (匹配注释,但不高亮 /* 和 */): :syntax region Comment start="/\*"hs=e+1 end="\*/"he=s-1 /* 这是一个注释 */ ^^^^^^^^^^^^^^ 高亮部分 更复杂的示例: :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 匹配文本 ssrrrreee 起始 (s)/区域本体 (r)/结束 (e) 对应高亮 (分别为 "Foo"、"Exa" 和 "Bar") 引导上下文 :syn-lc :syn-leading :syn-context 注意: 该功能已废弃,仅为后向兼容旧版 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 外壳里的嵌入 ("here") 文档。可通过 "\z" 特殊模式项完成。该项标记 "外部" 子表达式,即可从定义所在模式之外引用捕获结果。嵌入文档示例: :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 " 现在可在 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 " 无效,因为 B 并不直接属于 BigGroup :syntax cluster SmallGroup remove=B " 现在 Stuff 内不再匹配 bbb E848 语法簇的数量上限是 9767。

10. 内嵌语法文件 :syn-include E397

一种语言的语法文件经常需要嵌入另一种相关语言的语法文件。取决于两者关系,有两种 不同的嵌入方式: - 被包含语法文件中的顶层语法项,也应出现在宿主语法顶层中时,可直接使用 :runtime 命令: " cpp.vim 脚本内: :runtime! syntax/c.vim :unlet b:current_syntax - 被包含语法文件中的顶层语法项,只应嵌入在宿主语法特定区域内使用,则可 用 ":syntax include" 命令: :sy[ntax] include [@{grouplist-name}] {file-name} 内嵌文件里定义所有的语法项会自动加上 "contained" 标志位。给出组群 (簇) 时,内嵌文件的顶层语法项会自动加入该簇。 " 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}" 参数时,解析时会至少回溯 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" 的最后一个区 域项。这要求存在相应区域项!也可指定替代组名,例如: :syntax sync ccomment javaComment 其作用是对于检测到的 C 风格注释块,使用最后一个通过 "syn region javaComment" 定义的区域项。仅当该区域使用起始模式 "\/*" 和结束模式 "*\/" 时才可正常工作。 可搭配 "maxlines" 参数限制搜索行数。"minlines" 设置最小回溯行数 (例如,可用于 处理某些只占几行,但很难通过同步机制定位的结构)。 注意: 跨行字符串内部包含 "*/" 时,C 注释同步方法可能会出错。但跨行字符串本身不 是良好编程习惯 (许多编译器都会给出警告),且注释 (译者注: 应为字符串) 中出现 "*/" 的机率又相当小,因此该漏洞几乎无法觉察。 第三种同步方法: :syn-sync-third 第三种同步方法仅需给出 "minlines={N}" 参数。Vim 会从重绘起始行回溯 {N} 行,作 为解析起始行。需要额外解析 {N} 行内容,速度会因此较慢。示例: :syntax sync minlines=50 "lines" 是 "minlines" 旧名 (兼容旧版)。 第四种同步方法: :syn-sync-fourth 这种同步方法的基本思路是,以若干特定区域的一端 (起始或结束位置) 作为同步点,并 通过一种称为同步模式的语法项定位同步点。因为只有区域项可跨行,所以找到区域项的 一端后,可据此推断当前所处的语法上下文。同步模式的搜索从重绘起始行的上一行开 始,并在文件中反向进行。 同步语法项和非同步项的用法大体一致,也可用 contained、nextgroup 等,但存在若干 区别: - 不能使用关键字项。 - 带 "sync" 关键字的语法项构成一套完全独立的语法项目组。不能混用同步组和非同步 组。 - 匹配方向为 (逐行) 反向扫描缓冲区,而非正向。 - 可指定续行符模式,带续行符的多行在搜索时被视作一整行。也就是说,对指定项目的 搜索会从这组包含续行符的连续多行的首行开始。 - "nextgroup" 或 "contains" 仅适用于单行 (包括续行)。 - 使用区域项时,起止必须位于同一行 (包括续行)。否则会判定该行 (包括续行) 的行 尾自动结束该项。 - 找到同步模式的匹配时,在该行 (包括续行) 会继续搜索其余同步模式,以最后找到的 匹配为同步点。可用于同时包括区域起止模式的行 (例如 C 风格注释 /* this */ 在 一行出现时,使用该行最后找到的 "*/")。 同步模式匹配后,有两种解析策略: 1. 高亮解析仍然从重绘起点开始 (也就是同步模式的搜索起点)。必须指定该位置所属的 语法组。如果是跨行区域项,仅当其中不包含其他区域项时有效 (对应下述的 syn-sync-groupthere )。 2. 高亮解析从同步匹配点之后继续。必须指定匹配结束之后所处的语法组。适合上一种 策略失效的场景;缺点是需要解析更多文本,因此速度较慢 (对应下述的 syn-sync-grouphere )。 两种同步策略可同时启用。 除了指定同步模式外,还可额外定义若干匹配项和区域项,用于避免匹配到不需要的同步 模式。 [之所以单独给出同步模式,是因为同步点搜索模式通常远比完整的高亮模式简单。而减 少模式数目可大幅提升效率。] syn-sync-grouphere E393 E394 :syntax sync match {sync-group-name} grouphere {group-name} "pattern" ... 定义一条同步匹配规则。{group-name} 指定匹配项之后所处的语法组名 (译者注: 但无需从该处开始,尤其是同步模式本身就可以属于该组)。文本的高 亮解析从匹配结束位置之后开始进行。{group-name} 必须指定区域项,有多个 项目时取最先定义的那一条。可用 "NONE" 代表匹配结束后不处于任何语法组 (译者注: grouphere 可解释为同步匹配结束位置后 (这里) 所在的组)。 syn-sync-groupthere :syntax sync match {sync-group-name} groupthere {group-name} "pattern" ... 定义一条同步匹配规则。类似 "grouphere",但 {group-name} 指定同步模式的 搜索起点 (即重绘起点) 所在行开头所处的语法组名。假定匹配项到重绘起点之 间的文本不会改变语法高亮。高亮解析仍然从重绘起点开始。 例如,在 C 语言中可反向搜索 "/*" 和 "*/"。先找到 "/*" 时,可确定当前位 于注释内部,因此 "groupthere" 应为 "cComment"。而先找到 "*/" 时,可确 定当前不在注释中,因此 "groupthere" 应为 "NONE"。(实际因为 "/*" 和 "*/" 可出现在字符串中。会更复杂一些。留给读者作为练习…) (译者注: groupthere 可解释为同步模式的搜索起点 (那里) 所在的组)。 :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. 色彩方案 color-schemes

下一节将介绍各个高亮组,以及如何为它们指定颜色。但通常更常用的是通过 :colorscheme 命令选择一套色彩方案,例如: colorscheme pablo :colo :colorscheme E185 :colo[rscheme] 显示当前激活的色彩方案名。基本上等同于 :echo g:colors_name g:colors_name 未定义时,则会显示 "default"。其色彩方 案由 "$VIMRUNTIME/syntax/syncolor.vim" 定义,基于旧版 的 peachbuff 和 dersert 色彩方案。 编译时未加入 +eval 特性时,显示 "unknown"。 :colo[rscheme] {name} 加载色彩方案 {name}。在 'runtimepath' 里搜索 "colors/{name}.vim",加载首个找到的脚本。 要加载缺省色彩方案,可用 `:colo default`。 还会在 'packpath' 中的所有插件里寻找,先搜索 "start" 目录下的插件,然后搜索 "opt" 目录下的插件。 不能递归加载,色彩方案脚本中不能使用 :colorscheme 。 要自定义色彩方案,有两种方式。可在加载方案前重新定义颜色名,修改该颜色名的实际 外观。desert 方案中,使用 khaki 作为光标颜色。要使用同一颜色的更深版本: let v:colornames['khaki'] = '#bdb76b' colorscheme desert 要进一步自定义,如修改 :highlight-link 的关联关系,可以创建新色彩方案名,如 "~/.vim/colors/mine.vim",在其中用 :runtime 加载原始色彩方案: runtime colors/evening.vim hi Statement ctermfg=Blue guifg=Blue 色彩方案加载前,会先执行所有缺省色彩列表脚本 ( colors/lists/default.vim ),然 后触发 ColorSchemePre 自动命令事件。色彩方案加载完成后,会触发 ColorScheme 自动命令事件。 colorscheme-override 如果对色彩方案基本满意,可用 ColorScheme 自动命令在其上做少量修改。例如,要 删除背景色 (部分终端下可实现透明背景): augroup my_colorschemes au! au Colorscheme pablo hi Normal ctermbg=NONE augroup END 修改更多高亮颜色: augroup my_colorschemes au! au Colorscheme pablo hi Normal ctermbg=NONE \ | highlight Special ctermfg=63 \ | highlight Identifier ctermfg=44 augroup END 如果需要做大量修改,更推荐将官方色彩方案复制到用户目录再修改: :!cp $VIMRUNTIME/colors/pablo.vim ~/.vim/colors :edit ~/.vim/colors/pablo.vim Vim 9.0 更新了内置色彩方案,使之可适配更多终端环境。其中一个常见改动是重定义 Normal 高亮组,确保颜色完美。如果更偏好旧版本,可从此处下载: https://github.com/vim/colorschemes/blob/master/legacy_colors/ 编写色彩方案文件的参考文档,可见: :edit $VIMRUNTIME/colors/README.txt

14. Highlight 命令 :highlight :hi E28 E411 E415

高亮组分为三类: - 特定语言专用。组名以语言名开头。多数不直接设置属性,而是链接到第二类高亮组。 - 适用于所有语法语言。 - 适用于 'highlight' 场景。 hitest.vim 要预览当前激活的所有高亮组,可用: >vim :so $VIMRUNTIME/syntax/hitest.vim 该命令会打开新窗口,显示所有高亮组名,并以其自身颜色显示。 :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} ... 新增或修改高亮组。指定的颜色名尚未被识别时,会加载 'runtimepath' 里所有的 colors/lists/default.vim 脚 本,以尝试识别该颜色名。 {key}={arg} 参数参见 highlight-args 。 可选 [default] 参数参见 :highlight-default 。 :hi[ghlight][!] [default] link {from-group} {to-group} :hi[ghlight][!] [default] link {from-group} NONE 见 :hi-link 。 高亮组一般在启动阶段一次性加入。完成缺省设置。后续的 highlight 命令可用于指定 新值,覆盖缺省值。可用 "NONE" 关闭高亮或恢复缺省值。 修改配色的简便方式是使用 :colorscheme 命令。该命令加载的色彩方案文件就是由一 系列 :highlight 命令组成,例如: :hi Comment gui=bold 注意 未列出的字段保持原值,新字段会与旧设置进行合并。上例的实际效果相当于: :hi Comment term=bold ctermfg=Cyan guifg=#80a0ff gui=bold :highlight-verbose 列出高亮组时如果 'verbose' 非零,会同时列出最近一次设置该高亮组的所在位置。示 例: :verbose hi Comment Comment xxx term=bold ctermfg=4 guifg=Blue 最近修改于 /home/mool/vim/vim7/runtime/syntax/syncolor.vim 使用 ":hi clear" 时,会记录其所在脚本作为缺省值的设置来源。详见 :verbose-cmd highlight-args E416 E417 E423 高亮支持三种终端类型: term 普通终端 (vt100、xterm) cterm 彩色终端 (MS-Windows 控制台、color-xterm,支持 "Co" 终端功能库 (termcap) 条目的终端) gui GUI 可分别为每种类型设置独立高亮属性。实现单个语法文件跨终端使用最优高亮设置。 1. 普通终端的高亮参数 bold underline undercurl underdouble underdotted underdashed inverse italic standout nocombine strikethrough term={attr-list} attr-list highlight-term E418 attr-list 为逗号分隔的列表 (不支持空白),支持以下项目 (顺序不限): bold underline undercurl 并非所有终端支持 underdouble 并非所有终端支持 underdotted 并非所有终端支持 underdashed 并非所有终端支持 strikethrough 并非所有终端支持 reverse inverse 同 reverse italic standout nocombine 覆盖原有属性,而非与之合并 NONE 无任何属性 (用于复位) 注意 此处指定 "bold" 和使用粗体字体的效果相同。 underline-codes "undercurl" 代表波浪下划线 (下曲线)。如果终端不支持,会用 "underline" 替代。"undercurl" 和 "strikethrough" 一般仅有 GUI 和部分终端支持,可通 过 highlight-guisphighlight-ctermul 设置下划线颜色。可尝试设置 以下终端功能库条目,开启终端的下曲线支持: let &t_Cs = "\e[4:3m" let &t_Ce = "\e[4:0m" "underdouble" 代表双下划线,"underdotted" 代表点状下划线,而 "underdashed" 代表虚线下划线。仅有部分终端支持此类属性。对支持的终端, 可手动设置以下终端码: let &t_Us = "\e[4:2m" let &t_ds = "\e[4:4m" let &t_Ds = "\e[4:5m" t_Ce 可用于重设以上所有属性,也包括下曲线。 如果未设置 t_Ust_dst_Ds ,同样会用 "underline" 作为后备。 start={term-list} highlight-start E422 stop={term-list} term-list highlight-stop 通过指定的终端代码列表,获取终端的非标准属性。 在高亮文本前,写入 "start" 转义序列,可为打开终端区域高亮的任意代码。 在高亮文本后,写入 stop" 转义序列,用于撤销 "start" 的效果。不设置会造 成显示错乱。 {term-list} 支持两种格式: 1. 转义序列字符串。 字符串不能以 "t_" 开头,也不能包含空白,但支持 <> 记法,例如可用 "<Esc>" 和 "<Space>"。示例: start=<Esc>[27h;<Esc>[<Space>r; 2. 终端代码组成的列表。 终端代码的格式为 "t_xx",其中 "xx" 是终端功能库条目名。代码间必须以 逗号分隔,也不能包含空白。示例: start=t_C1,t_BL 对应的终端代码必须存在才可生效。 2. 彩色终端的高亮参数 cterm={attr-list} highlight-cterm {attr-list} 参见上文 attr-list 。开启颜色时,"cterm" 参数效果通常会和 "term" 有所差异,例如,普通终端注释用下划线,彩色终端则可用蓝色。 注意: 部分终端 (如 DOS 控制台) 属性与颜色不同混用。为保持可移植性,建 议只使用 "cterm=" 或 "ctermfg=" 以及 "ctermbg=" 中的一个。 ctermfg={color-nr} highlight-ctermfg E421 ctermbg={color-nr} highlight-ctermbg ctermul={color-nr} highlight-ctermul 分别设置彩色终端的前景 (ctermfg)、背景 (ctermbg) 和下划线 (ctermul) 颜 色。 {color-nr} 参数指定色号。范围从零到终端功能库条目 "Co" 值 (不含)。色号 对应实际颜色取决于终端的类型和终端设置。部分场景也受 "cterm" 设置影 响。例如,部分系统上 "cterm=bold ctermfg=3" 会显示其他颜色,而在其他系 统上则只显示 3 号色 (译者注: 此参数也可指定颜色名,见下)。 xterm 的颜色取决于资源配置,具体效果不易预测。缺省值详见 xterm 文档。 color-xterm 可通过 .Xdefaults 文件修改颜色。不幸的是,这代表用户体验将 因环境而异。彩色 xterm 文档详见 xterm-color tmux tmux 环境建议在 tmux 配置中加入: # tmux 使用色彩 set -s default-terminal "tmux-256color" set -as terminal-overrides ",*-256color:Tc" 详见: https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-a-256-colour-terminal https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-rgb-colour MS-Windows 控制台窗口中的标准颜色固定,因此采用这些颜色来定义颜色名。 而在 X11 中颜色名对应的实际颜色也是固定的,因此为使高亮设置具有可移植 性,又采用了 X11 的这些颜色定义 (是不是很复杂?)。以下列出可识别的颜色 名及其对应的色号: cterm-colors NR-16 NR-8 颜色名 中文名 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=" 参数。 直接使用数值而非颜色名,可避免粗体自动设置机制。 使用颜色名时,忽略大小写,不过 Vim 在读取 v:colornames 字典时,统一 使用小写颜色名。 注意 ANSI 风格的 16 色终端 (含 xterm) 实际使用 NR-8 列的色号。这里 '*' 等价于 '加 8',所以 Blue 对应色号为 12,DarkGray 则为 8,依此类推。 注意 对部分彩色终端,使用颜色名可能出现色彩错乱! 除色号和颜色名外,还可指定 "NONE" 以清除现有颜色设置。 :hi-normal-cterm 为 Normal 高亮组设置的 "ctermfg" 或 "ctermbg" 会成为所有非高亮文本使用 的颜色。示例: >vim :highlight Normal ctermfg=grey ctermbg=darkblue < 设置 Normal 组 "ctermbg" 色时,假定此颜色有效且 'background' 选项未被 手动设置,该选项会被自动调整。所有依赖 'background' 的高亮组都会随之变 化!因此应当最先设置 Normal 颜色,再设置其他组。 启用色彩方案后,修改 'background' 会触发色彩方案重新加载,导致所有颜色 (包括 Normal) 可能被重新计算。要避免此情况,修改 'background' 前应先删 除 g:colors_name 变量。 一旦更改了 Normal 组的 "ctermfg" 或 "ctermbg",Vim 在退出时就必须恢复 终端的原有颜色,这是通过终端功能库 "op" 条目 t_op 完成的。如果恢复不 正常,可在 .vimrc 中手动调整 't_op' 选项。 E419 E420 E453 Vim 获取 Normal 组的前景、背景和下划线颜色后,可用 "fg"、"bg" 和 "ul" 作为对应的颜色别名。仅当 Normal 组颜色设置完成后、和 (译者注: 或) 在 MS-Windows 控制台上才支持。例如,要反显选中文本: :highlight Visual ctermfg=bg ctermbg=fg 注意 引用的颜色是命令执行时的颜色快照。后续对 Normal 组的颜色改动不会 自动更新之前的引用。 ctermfont={font-nr} highlight-ctermfont 给出终端备选字体号。可用字体取决于终端,如果终端未设置备选字体,则无任 何效果。{font-nr} 可选范围是 0-10,0 恢复缺省字体,1-9 选择 9 种备选字 体之一,10 选择德文尖角体 (Fraktur) 字体。详见所用终端 SGR 10-20 参数 处理的相关文档。 t_CF 3. GUI 的高亮参数 gui={attr-list} highlight-gui 设置 GUI 模式所用属性。属性列表详见 attr-list注意 此处指定 "bold" 和使用粗体字体的效果相同。 注意 "Normal" 高亮组忽略本属性。 font={font-name} highlight-font 指定字体名,可选名称根据 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 外,其余字体的字符大小必须和 缺省字体相同,否则会出现重绘异常。 字体名包含内嵌空格或其他特殊字符时,可用单引号包围。字体名因而不能使用 单引号本身。示例: >vim :hi comment font='Monospace 10' guifg={color-name} highlight-guifg guibg={color-name} highlight-guibg guisp={color-name} highlight-guisp 分别设置 GUI 的前景 (guifg)、背景 (guibg) 和特殊 (guisp) 颜色。 "guisp" 用于下曲线 (undercurl) 和 删除线 (strikethrough)。 还可用以下特殊颜色名: NONE 无颜色 (透明) E1361 bg 引用 Normal 组背景色 background 引用 Normal 组背景色 fg 引用 Normal 组前景色 foreground 引用 Normal 组前景色 颜色名包含内嵌空格或其他特殊字符时,可用单引号包围。颜色名因而不能使用 单引号本身。示例: >vim :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 Win32 GUI 版本额外支持更多的系统颜色。见 win32-colors 。 可直接用红、绿、蓝三色值指定颜色。格式为 "#rrggbb",其中 "rr" 为红色分量 "bb" 为蓝色分量 "gg" 为绿色分量 所有值均以十六进制表示,可选范围是 "00" 到 "ff"。示例: >vim :highlight Comment guifg=#11f0c3 guibg=#ff00ff < 编写色彩方案需要频繁使用相同的十六进制颜色值时,可在 v:colornames 中 自定义 (必须是小写) 颜色名。示例: # 提供此颜色的缺省值,不覆盖用户自定义值。 :call extend(v:colornames, {'alt_turquoise': '#11f0c3'}, 'keep') :highlight Comment guifg=alt_turquoise guibg=magenta 使用第三方色彩方案,但想要微调其中使用的命名颜色时,可在加载前先覆盖 v:colornames 中的对应颜色值: >vim let v:colornames['alt_turquoise'] = '#22f0d3' colorscheme alt < 开发供他人使用的颜色列表时,建议给自定义颜色名添加前缀。惯例是将颜色列 表放入 colors/lists 目录。"$VIMRUNTIME/colors/lists/csscolors.vim" 可 作为范例参考。色彩方案加载颜色列表的示例: >vim :runtime colors/lists/csscolors.vim :highlight Comment guifg=css_turquoise < highlight-groups highlight-default 以下为缺省高亮组。'highlight' 选项缺省使用。注意 高亮效果受 'background' 值影 响。执行 ":highlight" 命令可查看到当前全部设置。 条件允许时,下表中的组名会使用其本身颜色高亮。如果文字不可读,通过可视选中文本 可查看内容。 hl-ColorColumn ColorColumn 'colorcolumn' 指定列。 hl-Conceal Conceal 隐藏文本的替代占位字符 (见 'conceallevel')。 hl-Cursor hl-lCursor Cursor 光标所在字符。 lCursor 启用 language-mapping 时的光标所在字符 (见 'guicursor')。 hl-CursorIM CursorIM 启用 IME 模式时的光标所在字符。 CursorIM hl-CursorColumn CursorColumn 置位 'cursorcolumn' 时的光标所在屏幕列。 hl-CursorLine CursorLine 置位 'cursorline' 时的光标所在屏幕行。 hl-Directory Directory 目录名 (以及列表中的其他特殊条目)。 hl-DiffAdd DiffAdd 比较模式: 新增行。 diff.txt hl-DiffChange DiffChange 比较模式: 改动行。 diff.txt hl-DiffDelete DiffDelete 比较模式: 删除行。 diff.txt hl-DiffText DiffText 比较模式: 改动行内的差异文本。 diff.txt hl-DiffTextAdd DiffTextAdd 比较模式: 改动行内的新增文本。缺省链接到 hl-DiffTextdiff.txt hl-EndOfBuffer EndOfBuffer 缓冲区末行之后的填充行 (~)。缺省使用 hl-NonText 高亮。 hl-ErrorMsg ErrorMsg 命令行输出的错误信息。 hl-VertSplit VertSplit 当前窗口与其相邻垂直分割窗口之间的分隔列。绘制字符使用 'fillchars' 中的 "vert" 字符。 hl-VertSplitNC VertSplitNC 两个垂直分割的非当前窗口之间的分隔列。绘制字符使用 'fillchars' 中的 "vert" 字符。 缺省使用 hl-VertSplit 高亮。 hl-Folded Folded 已关闭折叠的显示行。 hl-FoldColumn FoldColumn 'foldcolumn' 折叠栏。 hl-SignColumn SignColumn signs 标号栏。 hl-IncSearch IncSearch 'incsearch' 高亮;也用于 ":s///c" 交互替代的文本 :s_c hl-LineNr LineNr :number:# 命令与 'number''relativenumber' 选项置位 时显示的行号。 hl-LineNrAbove LineNrAbove 'relativenumber' 选项置位时,光标行上方各行的行号。 hl-LineNrBelow LineNrBelow 'relativenumber' 选项置位时,光标行下方各行的行号。 hl-CursorLineNr CursorLineNr 'cursorline' 置位且 'cursorlineopt' 为 "number" 或 "both" 时, 光标行在行号栏中显示的行号。 hl-CursorLineFold CursorLineFold 'cursorline' 置位时,光标行显示的 'foldcolumn' 折叠栏。 hl-CursorLineSign CursorLineSign 'cursorline' 置位时,光标行显示的 signs 标号栏。 hl-MatchParen MatchParen 光标处或光标前一列的括号及其匹配括号。 pi_paren.txt hl-MessageWindow MessageWindow :echowindow 弹出的消息窗口。缺省链接到 hl-WarningMsg hl-ModeMsg ModeMsg 'showmode' 显示的模式提示消息 (例如,"-- 插入 --")。 hl-MsgArea MsgArea 命令行区域,同时用于消息输出,另见 'cmdheight' hl-MoreMsg MoreMsg more-prompt 分页提示符。 hl-NonText NonText 窗口末尾的 '@'、开启 'smoothscroll' 后窗口开头的 "<<<"、 'showbreak' 回绕行标识以及双宽字符在行尾放不下时显示的 ">" 等 其他原文中实际不存在的占位字符。 hl-Normal Normal 普通文本。 hl-Pmenu Pmenu 弹出菜单: 普通项目。 hl-PmenuSel PmenuSel 弹出菜单: 选中项目。 hl-PmenuKind PmenuKind 弹出菜单: 普通项目 "kind" (补全类型)。 hl-PmenuKindSel PmenuKindSel 弹出菜单: 选中项目 "kind" (补全类型)。 hl-PmenuExtra PmenuExtra 弹出菜单: 普通项目 "extra text" (补充文本)。 hl-PmenuExtraSel PmenuExtraSel 弹出菜单: 选中项目 "extra text" (补充文本)。 hl-PmenuSbar PmenuSbar 弹出菜单: 滚动条。 hl-PmenuThumb PmenuThumb 弹出菜单: 滚动条拇指 (thumb)。 hl-PmenuMatch PmenuMatch 弹出菜单: 普通项目的匹配文本。和 hl-Pmenu 叠加生效。 hl-PmenuMatchSel PmenuMatchSel 弹出菜单: 选中项目的匹配文本。和 hl-PmenuSel 叠加生效。 hl-PmenuBorder PmenuBorder 弹出菜单: 边框字符。缺省链接到 hl-Pmenu hl-PmenuShadow PmenuShadow 弹出菜单: 菜单阴影。 hl-ComplMatchIns ComplMatchIns 当前正在插入的补全项中的已匹配文本。 hl-PreInsert PreInsert 'completeopt' 里包含 "preinsert" 时,预插入文本。 hl-Popup Popup 弹出窗口主体,仅当弹窗未设置 'wincolor' 且未显式给出 "highlight" 参数时使用。缺省链接到 hl-Pmenu hl-PopupBorder PopupBorder 弹出窗口边框字符。仅当弹窗未设置 'wincolor' 且未给出 "borderhighlight" 参数时使用。缺省链接到 hl-Pmenu hl-PopupTitle PopupTitle 弹出窗口标题。仅当弹窗未设置 'wincolor' 且未给出 "borderhighlight" 参数时使用。缺省链接到 hl-Pmenu hl-PopupSelected PopupSelected popup_menu() 创建弹窗里的选中项。缺省链接到 hl-PmenuSel hl-PopupNotification PopupNotification popup_notification() 创建的通知弹窗消息。缺省链接到 hl-WarningMsg hl-Question Question hit-enter 请按 ENTER 提示以及 yes/no 询问提示。 hl-QuickFixLine QuickFixLine 快速修复窗口中当前选中 quickfix 项目。 hl-Search Search 最近搜索模式 (见 'hlsearch')。也用于其他需要突出显示的项目。 hl-CurSearch CurSearch 最近搜索模式的当前匹配项 (见 'hlsearch')。 备注: 仅当搜索刚完成时准确,编辑文本或屏幕重绘后该高亮可能会过 期。 hl-SpecialKey SpecialKey :map 列出的元键和特殊键、文本中的不可显示字符、以及 'listchars' 展示字符。一般而言,显示上和实际内容有差异的文本。 hl-SpellBad SpellBad 拼写检查器无法识别的单词。 spell 会叠加在原有文本高亮之上。 hl-SpellCap SpellCap 首字母应大写却未大写的单词。 spell 会叠加在原有文本高亮之上。 hl-SpellLocal SpellLocal 拼写检查器能识别,但只应在其他地区使用的单词。 spell 会叠加在原有文本高亮之上。 hl-SpellRare SpellRare 拼写检查器能识别的生僻词。 spell 会叠加在原有文本高亮之上。 hl-StatusLine StatusLine 当前窗口状态行。状态行边缘高亮 (StatusLine 或 'statusline' 中任意 %#... / %N* 指定的高亮组) 会延伸到紧邻的垂直分隔列单元 格,使得相邻窗口的状态行连成一体 (此处不绘制 'fillchars' 的 "vert" 字符)。 hl-StatusLineNC StatusLineNC 非当前窗口的状态行。类似 hl-StatusLine ,边缘高亮也会延伸到 紧邻的垂直分隔列单元格。 注意: 如果本高亮和 "StatusLine" 一致,Vim 会使用 "^^^" 指示当 前窗口状态行,以示区分。 hl-StatusLineTerm StatusLineTerm 当前窗口为 terminal 窗口时的状态行。 hl-StatusLineTermNC StatusLineTermNC 非当前 terminal 窗口的状态行。 hl-TabLine TabLine 标签页行,非当前标签页标签。 hl-TabLineFill TabLineFill 标签页行,无标签的空白填充区域。 hl-TabLineSel TabLineSel 标签页行,当前标签页标签。 hl-TabPanel TabPanel 标签页面板,非当前标签页标签。 hl-TabPanelFill TabPanelFill 标签页面板,无标签的空白填充区域。 hl-TabPanelSel TabPanelSel 标签页面板,当前标签页标签。 hl-Terminal Terminal terminal 终端窗口 (见 terminal-size-color )。 hl-Title Title `:set all`、 :autocmd 等命令输出结果中的标题。 hl-TitleBar TitleBar GUI 激活窗口的标题栏。{仅 MS-Windows GUI 支持} 详见 gui-w32-title-bar 。 仅 guibgguifg 高亮参数生效。 hl-TitleBarNC TitleBarNC GUI 非激活窗口的标题栏。{仅 MS-Windows GUI 支持} 详见 gui-w32-title-bar 。 仅 guibgguifg 高亮参数生效。 hl-Visual Visual 可视模式下的选中区域。 hl-VisualNOS VisualNOS Vim 是 "选择区的非拥有者" 时,可视模式下的选中区域。 {仅 X11 GUI 上的 gui-x11xterm-clipboardwayland-selections 支持} hl-WarningMsg WarningMsg 命令行警告消息。 hl-WildMenu WildMenu 'wildmenu' 补全菜单中,当前选中的候选项。 hl-User1 hl-User1..9 hl-User9 'statusline' 语法可在状态行和标尺 (通过 'rulerformat') 上使用 9 组自定义高亮。 高亮组名为 User1 到 User9。 GUI 上,可用以下高亮组分别设置菜单、滚动条和工具提示的颜色。不提供缺省值。 Win32 GUI 不生效。仅支持三项高亮参数: font、guibg 和 guifg。 hl-Menu Menu 菜单以及工具栏的当前字体、背景色和前景色。 可用参数: font、guibg、guifg。 注意: Motif 上,font 参数实际总是指定字体集 (fontset),即使 'guifontset' 为空也是如此。因此,选用字体与 :language 相关。 hl-Scrollbar Scrollbar 主窗口滚动条的当前背景和前景色。 可用参数: guibg、guifg。 hl-Tooltip Tooltip 工具提示的当前字体、背景色和前景色。 可用参数: font、guibg、guifg。 注意: Motif 上,font 参数实际总是指定字体集 (fontset),即使 'guifontset' 为空也是如此。因此,选用字体与 :language 相关。

15. 高亮组链接 :hi-link :highlight-link E412 E413

要使多个语法组共享相同高亮效果,可以更方便地将这些组链接到一个公共高亮组,只需 为该组指定颜色属性即可。 要创建链接: :hi[ghlight][!] [default] link {from-group} {to-group} 要删除链接: :hi[ghlight][!] [default] link {from-group} NONE 注意: E414 - {from-group} 和/或 {to-group} 尚不存在时,会先自动创建目标组,不会报错。 - 一旦对已建立链接的组使用 :highlight 命令设置高亮,链接关系即时解除。 - {from-group} 已存在高亮设置时,缺省不创建链接,但可给出 '!' 强制覆盖。如果在 脚本中执行,这种情况不会报错。可用于静默跳过对已有设置组的链接。 :hi-default :highlight-default 可用 [default] 参数设置高亮组的缺省高亮。该组已存在高亮设置或已有链接时,忽略 本命令。 该参数用于改写特定语法文件的高亮。例如,C 语法文件包含以下语句: :highlight default link cComment Comment 要使 C 注释改用 hl-Question 高亮,可在 vimrc 文件里加入: :highlight link cComment Question 假定 C 语法文件中不带 "default" 关键字,加载 C 语法文件时就会覆盖用户设置。 要使链接不受 `:highlight clear` 影响 (可用于在切换色彩方案时,仍然保留特定文件 类型的专属高亮),可在 "after/syntax/{filetype}.vim" 文件中放入命令: highlight! default link cComment Question (译者注: 以下信息可从原文推出,仅补充明确 - 普通链接可相互覆盖,无需 '!' - 缺省链接缺省不覆盖已有缺省链接,但可给出 '!' 强制覆盖,但始终不会覆盖普通链接 - `:highlight clear` 会将所有或指定高亮组恢复为缺省链接 - 缺省高亮 (非链接) 的唯一作用是已有高亮或链接时不覆盖。 :hi-clear 不使用 )

16. 清理语法 :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 这个名字起的不太好,因为它并不复位任何语法项目,而只复位高亮设置。 不会修改 'highlight' 选项所用颜色值。 注意 vimrc 文件中手动设定的语法颜色也会被复位为 Vim 缺省值。 注意 使用色彩方案时,其中语法部分的高亮颜色将会丢失。 该命令实际执行的是: let g:syntax_cmd = "reset" runtime! syntax/syncolor.vim 注意 这里需要使用 'runtimepath' 选项。 syncolor 要自定义语法高亮配色,可新建专用于颜色设置的 Vim 脚本,放入 'runtimepath' 中 出现在 $VIMRUNTIME 之后的某个目录,使用户设置覆盖缺省颜色。在 `:syntax reset` 命令执行后,这些设置依然生效。 Unix 示例文件路径 ~/.vim/after/syntax/syncolor.vim。示例内容: if &background == "light" highlight comment ctermfg=darkgreen guifg=darkgreen else highlight comment ctermfg=green guifg=green endif E679 用户 syncolor.vim 脚本禁止执行 `syntax on` 命令、修改 'background' 选项或调用 :colorscheme 命令,否则会触发无限循环。 注意 使用色彩方案时,自定义颜色优先还是色彩方案定义优先,取决于色彩方案的具体 实现 (译者注: 如是否使用 default、是否显式清除已有高亮等)。见 :colorscheme syntax_cmd 加载 syntax/syncolor.vim 文件前, g:syntax_cmd 变量会被设为以下各值之一: "on" 用于 `:syntax on` 命令。覆盖高亮颜色和链接,但已有高亮设置时不 会用链接覆盖 (译者注: 原文是 "links are kept",恐不确) "enable" 用于 `:syntax enable` 命令。通过 `:highlight default`,仅为未 设置过高亮的组定义颜色和链接 "reset" 用于 `:syntax reset` 命令或色彩方案加载。覆盖全部颜色和链接。 "skip" 用于 'runtimepath' 里较早出现的 syncolor.vim 已经设置过缺省设 置时,跳过全部高亮设置,不定义任何颜色或链接。

17. 标签高亮 tag-highlight

要高亮文件里的全部标签,可用以下映射。 <F11> -- 根据 tags 文件生成 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 (从 http://ctags.sf.net 获取)。 将以下内容放入 Makefile: # 生成指定类型的高亮脚本。需要 Universal/Exuberant ctags 和 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 里放入: " 加载 types.vim 高亮脚本 (如果可用) 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

18. 窗口局部语法 :ownsyntax

同一缓冲区的所有窗口缺省共用相同语法设置。但可为某个窗口单独设置私有语法设置。 示例场景,在一个窗口用普通高亮编辑 LaTeX 源代码,在另一个窗口用特殊高亮 (例如 隐藏控制序列,对文本加粗,加斜体等)。'scrollbind' 同步滚动选项在此处很实用。 要使当前窗口使用语法 "foo",而不影响同一缓冲区的其他窗口,可用: :ownsyntax foo w:current_syntax 命令会将窗口变量 w:current_syntax 设为 "foo"。缓冲区变量 b:current_syntax 会保持不变。这实际上是通过保存和恢复 b:current_syntax 来实现的。语法文件仍会 设置 b:current_syntax ,但新值会被转存入窗口变量,然后原有缓冲区变量被恢复。 备注: 该命令同时会复位 'spell''spellcapcheck''spellfile''spelloptions' 选项。 窗口启用私有语法后,同一缓冲区其他窗口执行的语法命令 (包含 `:syntax clear`) 不 会影响本窗口。反之亦然,此窗口执行的语法命令也不会影响同一缓冲区的其他窗口。 启用私有语法的窗口加载其他缓冲区、或重载文件后,恢复普通行为,私有语法失效。 分割窗口时,新窗口继承公共语法。

19. 彩色 xterm xterm-color color-xterm

多数彩色 xterm 仅支持八色。如果缺省设置下颜色不生效,可在 .vimrc 里加入: :if &term =~ "xterm" : if has("terminfo") : set t_Co=8 : set t_Sf=<Esc>[3%p1%dm : set t_Sb=<Esc>[4%p1%dm : else : set t_Co=8 : set t_Sf=<Esc>[3%dm : set t_Sb=<Esc>[4%dm : endif :endif [<Esc> 代表真正 ESC 字符,输入方式是 CTRL-V <Esc>] 可修改首个 "if" 来匹配字符串以适配实际终端名。如用 "dtterm" 替换 "xterm"。 注意: 必须在 `:syntax on` 执行 执行相关设置。否则颜色显示可能会异常。 xiterm rxvt 上述设置同样适用于 xiterm 和 rxvt。rxvt 想要启用 16 色,可借助 terminfo 表达式 机制: :set t_AB=<Esc>[%?%p1%{8}%<%t25;%p1%{40}%+%e5;%p1%{32}%+%;%dm :set t_AF=<Esc>[%?%p1%{8}%<%t22;%p1%{30}%+%e1;%p1%{22}%+%;%dm colortest.vim Vim 发布版本自带颜色测试脚本。可执行以下命令: :runtime syntax/colortest.vim 部分 xterm 版本 (以及 Linux 控制台等其他终端) 即使颜色总数定义为 8,仍然可以输 出更亮的前景色。't_Co' 为 8 时,Vim 通过设置 "cterm=bold" 属性实现亮色前景。 xfree-xterm 要获取 16 色或更多颜色,需要新版 xterm 版本 (XFree86 3.3 或更新版本)。最新版本 也可在此获取: http://invisible-island.net/xterm/xterm.html 推荐 configure 配置如下。启用 88 色。打开终端功能库查询特性,允许 Vim 查询 xterm 实际支持的颜色总数。 ./configure --disable-bold-color --enable-88-color --enable-tcap-query 如果仅有 8 色可用,请检查 xterm 的编译设置。 (要使 xterm 采用 UTF-8 字符编码,另见 UTF8-xterm )。 支持 xterm 16 色 的 .vimrc 设置: :if has("terminfo") : set t_Co=16 : set t_AB=<Esc>[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm : set t_AF=<Esc>[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm :else : set t_Co=16 : set t_Sf=<Esc>[3%dm : set t_Sb=<Esc>[4%dm :endif [<Esc> 代表真正 ESC 字符,输入方式是 CTRL-V <Esc>] 无 +terminfo 时,Vim 会识别以上设置,并自动将 cterm 8 - 15 号色的前景色与背 景色终端码转换成 "<Esc>[9%dm" 和 "<Esc>[10%dm" (%d 替换为 色号 - 8)。 16 号或更高号色同样会自动转换 (译者注: "<Esc>[38;5;%dm" 和 "<Esc>[48;5;%dm")。 要启用 256 色,可用以下设置: :set t_AB=<Esc>[48;5;%dm :set t_AF=<Esc>[38;5;%dm 也可直接设置环境变量 TERM 为 "xterm-color" 或 "xterm-16color",测试是否可用。 可用以下 X 资源设置 xterm 颜色 (放入 ~/.Xdefaults 文件): XTerm*color0: #000000 XTerm*color1: #c00000 XTerm*color2: #008000 XTerm*color3: #808000 XTerm*color4: #0000c0 XTerm*color5: #c000c0 XTerm*color6: #008080 XTerm*color7: #c0c0c0 XTerm*color8: #808080 XTerm*color9: #ff6060 XTerm*color10: #00ff00 XTerm*color11: #ffff00 XTerm*color12: #8080ff XTerm*color13: #ff40ff XTerm*color14: #00ffff XTerm*color15: #ffffff Xterm*cursorColor: Black [注意: cursorColor 资源用于绕过一个将光标颜色设为最后绘制文本的颜色的旧漏洞。 新版已修正,但并非所有人都使用新版。] 修改完毕后,可执行以下命令,将新配置即时重新载入 X 资源数据库管理器: xrdb -merge ~/.Xdefaults xterm-blink xterm-blinking-cursor 要实现 xterm 上的光标闪烁,可编译 tools/blink.c。也可使用 Thomas Dickey 的 xterm 补丁号 107 及以上版本 (获取方式见上),添加以下 X 资源: XTerm*cursorBlink: on XTerm*cursorOnTime: 400 XTerm*cursorOffTime: 250 XTerm*cursorColor: White hpterm-color hpterm 仅支持 8 种前景色,以下设置基本有效: :if has("terminfo") : set t_Co=8 : set t_Sf=<Esc>[&v%p1%dS : set t_Sb=<Esc>[&v7S :else : set t_Co=8 : set t_Sf=<Esc>[&v%dS : set t_Sb=<Esc>[&v7S :endif [<Esc> 代表真正 ESC 字符,输入方式是 CTRL-V <Esc>] Eterm enlightened-terminal Enlightened 终端模拟器 (或 Eterm) 可用以下设置。也可能适用于所有依靠 bold 属性 实现亮色的类 xterm 终端。有必要时可添加上例中的 ":if" 结构。 :set t_Co=16 :set t_AF=^[[%?%p1%{8}%<%t3%p1%d%e%p1%{22}%+%d;1%;m :set t_AB=^[[%?%p1%{8}%<%t4%p1%d%e%p1%{32}%+%d;1%;m TTpro-telnet Tera Term Pro (TTpro) telnet 可用以下设置。这是 MS-Windows 上一款自由软件 / 开 源程序。 set t_Co=16 set t_AB=^[[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{32}%+5;%;%dm set t_AF=^[[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{22}%+1;%;%dm 请打开 TTpro 的 Setup / Window / Full Color 设置, 关闭 Setup / Font / Enable Bold 设置。 (信息来源: John Love-Jensen <eljay@Adobe.COM>)

20. 语法高亮性能排查 :synti :syntime

本节主要面向语法文件开发者。 如果语法高亮导致重绘卡顿,下面给出优化提示。要复现问题,可开启通常会有干扰的特 性 (如 'relativenumber'folding ) 进行观察。 注意: {仅当编译时加入 +profile 特性才可用}。通常需编译带 "huge" 特性包的 Vim 版本。 要定位耗时最多的匹配模式,执行以下流程: :syntime on [ 使用 CTRL-L 至少触发一次文本重绘 ] :syntime report 列出实际使用的所有语法模式,按匹配耗时降序排列。 :synti[me] on 开启语法耗时统计。统计本身会带来若干性能开销。 :synti[me] off 停止语法耗时统计。 :synti[me] clear 将所有计数清零,重新开始统计。 :synti[me] report 展示当前窗口自 ":syntime on" 开始的语法统计报告。建议 调宽窗口,完整查看输出。 列表按总耗时排序。显示以下各列: TOTAL 模式匹配以秒为单位的总耗时。 COUNT 模式尝试匹配的总次数。 MATCH 模式实际匹配成功次数。 SLOWEST 单次匹配最大耗时。 AVERAGE 单次匹配平均耗时。 NAME 语法项名。注意 该字段未必唯一。 PATTERN 模式本身。 模式存在大量分支会导致效率变低。建议多使用按本义出现的文本,减少匹配 失败 时的 可能回溯路径。 使用 \@<=\@<! 零宽反向断言时,建议限定最大回溯长度,避免在当前行和上一 行所有可能的位置上反复尝试。例如,对按本义出现的文本,可指定字节长度: "<\@<=span" 匹配 "<span" 中的 "span"。但会试图在大量位置上尝试匹配 "<"。 "<\@1<=span" 匹配效果相同,但在 "span" 之前仅回溯一个字节。 vim:tw=78:sw=4:ts=8:noet:ft=help:norl: