filetype

filetype.txt 适用于 Vim 9.1 版本。 最近更新: 2025年3月 VIM 参考手册 by Bram Moolenaar 译者: Willis、tocer 文件类型 filetype file-type 1. 文件类型 filetypes 2. 文件类型插件 filetype-plugins 3. 缺省文件类型插件的文档 ftplugin-docs 另见 autocmd.txt

1. 文件类型 filetypes file-types

Vim 可以检测要编辑的文件类型。这是通过检查文件名完成的,有的时候也检查文本里是 否包含特定的文本。 :filetype :filet 要打开文件类型的检测,在你的 vimrc 里加入以下命令: :filetype on 每次一个新的或者已经存在的文件被编辑时,Vim 会试图识别文件的类型,并设置 'filetype' 选项。同时,也触发 FileType 事件。该事件可以设置语法高亮,特定选 项,等等。 注意: 文件类型和 'compatible' 不能很好的一起工作。因为 Vi 兼容意味着所有的选项 都是全局的。如果你还那么做,建议复位 'compatible' 选项。 详情: ":filetype on" 命令会加载以下文件中的一个: Amiga $VIMRUNTIME/filetype.vim Mac $VIMRUNTIME:filetype.vim MS-Windows $VIMRUNTIME\filetype.vim Unix $VIMRUNTIME/filetype.vim VMS $VIMRUNTIME/filetype.vim 该文件是一个 Vim 脚本,其中定义了 BufNewFile 和 BufRead 事件的自动命 令。如果根据文件名不能检测到文件类型,则使用 $VIMRUNTIME/scripts.vim 来根据文件内容检测之。 正在或即将启动 GUI 时,同时也会执行 menu.vim 脚本。如果不想要,参见 'go-M' 。 要加入你自己的文件类型,见下面的 new-filetype 。要查找一种文件类型的帮助,加 上 "ft-" 前缀和可选的 "-syntax"、"-indent" 或者 "-plugin" 后缀。例如: :help ft-vim-indent :help ft-vim-syntax :help ft-man-plugin 如果文件类型没有被自动识别,或者找到的是错误的类型,你可以手动设置 'filetype' 选项,或者在文件里加入模式行。例如,对于 IDL 文件,可以使用 :set filetype=idl 或者在文件中加入模式行 modeline : /* vim: set filetype=idl : */ :filetype-plugin-on 你可以为特定的文件类型允许插件文件的载入: :filetype plugin on 如果文件类型检测以前尚未打开,载入该文件后就被打开了。该命令实际上载入了 'runtimepath' 里的 "ftplugin.vim" 文件。其结果是,在文件编辑时,相应的插件文件 也会载入 (如果文件类型能检测到)。 filetype-plugin :filetype-plugin-off 你可以如此关闭之: :filetype plugin off 文件类型检测此时没有关闭。但如果你关闭了,相应的插件就不会被自动载入。该命令实 际上载入了 'runtimepath' 里的 "ftplugof.vim" 文件。 :filetype-indent-on 你可以为特定的文件类型载入缩进文件: :filetype indent on 如果文件类型检测以前尚未打开,载入该文件后就被打开了。该命令实际上载入了 'runtimepath' 里的 "indent.vim" 文件。其结果是,在文件编辑时,相应的缩进文件 也会载入 (如果文件类型能检测到)。 indent-expression :filetype-indent-off 你可以如此关闭之: :filetype indent off 文件类型检测此时没有关闭。但如果你关闭了,相应的缩进文件就不会被自动载入。该命 令实际上载入了 'runtimepath' 里的 "indoff.vim" 文件。 这会关闭你后面所打开的文件中的自动缩进。在已经打开的文件中,自动缩进还依然有 效。要在已打开的文件中关闭缩进,复位 'autoindent''cindent''smartindent' 和/或 'indentexpr' :filetype-off 要关闭文件类型检测,使用如下命令: :filetype off "plugin" 和 "indent" 的标志位还会保持,但是因为没有文件类型被检测到,直到下次 ":filetype on" 为止,它们不会真的工作。 总览: :filetype-overview 命令 检测 plugin indent :filetype on 打开 未改变 未改变 :filetype off 关闭 未改变 未改变 :filetype plugin on 打开 打开 未改变 :filetype plugin off 未改变 关闭 未改变 :filetype indent on 打开 未改变 打开 :filetype indent off 未改变 未改变 关闭 :filetype plugin indent on 打开 打开 打开 :filetype plugin indent off 未改变 关闭 关闭 要查看当前的状态,只需输入: :filetype 输出结果看起来大概如此: filetype detection:ON plugin:ON indent:OFF 文件类型也用于语法高亮。如果使用 ":syntax on" 命令,文件类型检测也被安装。所 以,没有必要在 ":syntax on" 之后再执行 ":filetype on"。 要关闭某种文件类型,在你的文件类型文件里加入一行。见 remove-filetype filetype-detect 要再次检测文件类型: :filetype detect 使用这个命令可以使你先编辑一个空白文件,任何输入足够的文本,使得文件类型能够被 识别。例如,你以此开始输入一个新的外壳脚本: "#!/bin/csh"。 如果文件类型检测被关闭,它会先被打开。就像用了 "on" 参数那样。 filetype-overrule 如果多个不同的文件类型使用了相同的扩展名,Vim 试图猜测到底该文件属于哪个类型。 这并不总行。一些全局变量可以用来为某些特定的扩展名决定具体的文件类型: 文件名 变量 *.asa g:filetype_asa ft-aspperl-syntax ft-aspvbs-syntax *.asm g:asmsyntax ft-asm-syntax *.asp g:filetype_asp ft-aspperl-syntax ft-aspvbs-syntax *.bas g:filetype_bas ft-basic-syntax *.cfg g:filetype_cfg *.cls g:filetype_cls *.csh g:filetype_csh ft-csh-syntax *.dat g:filetype_dat *.def g:filetype_def *.dsp g:filetype_dsp *.f g:filetype_f ft-forth-syntax *.frm g:filetype_frm ft-form-syntax *.fs g:filetype_fs ft-forth-syntax *.h g:c_syntax_for_h ft-c-syntax *.i g:filetype_i ft-progress-syntax *.inc g:filetype_inc *.lsl g:filetype_lsl *.m g:filetype_m ft-mathematica-syntax *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md g:filetype_md ft-pandoc-syntax *.mod g:filetype_mod *.p g:filetype_p ft-pascal-syntax *.pl g:filetype_pl *.pp g:filetype_pp ft-pascal-syntax *.prg g:filetype_prg *.r g:filetype_r *.sig g:filetype_sig *.sql g:filetype_sql ft-sql-syntax *.src g:filetype_src *.sys g:filetype_sys *.sh g:bash_is_sh ft-sh-syntax *.tex g:tex_flavor ft-tex-plugin *.typ g:filetype_typ *.v g:filetype_v *.w g:filetype_w ft-cweb-syntax 对一些文件类型而言,全局变量只用于文件类型无法检测的场合: *.r g:filetype_r ft-rexx-syntax filetype-ignore 要避免检测某些文件,用 g:ft_ignore_pat 变量。缺省值是: :let g:ft_ignore_pat = '\.\(Z\|gz\|bz2\|zip\|tgz\)$' 这意味着压缩文件的内容不会被检测。 new-filetype 如果你想使用的文件没检测到文件类型,有四种方法。不管如何,最好不要修改 $VIMRUNTIME/filetype.vim 文件。再安装新的 Vim 版本的时候它会被覆盖。 A. 如果你想否决所有的缺省文件类型检查。 这里,每种文件类型需要写一个文件。缺点就是,你需要很多文件。优点就是,你只 需要把文件放到合适的目录就可以了。 ftdetect 1. 建立你自己的运行时目录。通常,你会用 'runtimepath' 选项的第一项。然后, 在其中建立 "ftdetect" 目录。Unix 上的例子: :!mkdir ~/.vim :!mkdir ~/.vim/ftdetect 2. 建立包含检测文件类型的自动命令的文件。例如: au BufRead,BufNewFile *.mine set filetype=mine 注意 这里没有 "augroup" 命令。在执行你的文件的时候这点已经做好了。你可以 使用 "*" 模式,然后分析文件内容来检测其类型。 把该文件叫做 "mine.vim",并把它放在用户运行时目录的 "ftdetect" 目录里。 例如,在 Unix 上: :w ~/.vim/ftdetect/mine.vim 3. 要使用新的文件类型检测,你需要重新启动 Vim。 "ftdetect" 目录的文件在所有的缺省检查之后进行,这样它们就能否决之前进行的文 件类型检测。但是你还可以用 :setfiletype 保持前一个检测到的文件类型。 B. 如果你想在缺省文件类型检查之后检测自己的文件。 和上述的 A 类似。但不是无条件的设置 'filetype',而是使用 ":setfiletype"。该 命令只有在没有文件类型被监测到的前提下才会设置 'filetype'。例如: au BufRead,BufNewFile *.txt setfiletype text 在你的命令里,你可以使用已经检测到的文件类型。例如,在 "pascal" 类型已经被 检测到的前提下,要使用文件类型 "mypascal": au BufRead,BufNewFile * if &ft == 'pascal' | set ft=mypascal | endif C. 如果你的文件类型可以通过文件名检测。 1. 建立你自己的运行时目录。通常,你会用 'runtimepath' 选项的第一项。Unix 上 的例子: :!mkdir ~/.vim 2. 创建包含自动命令的文件用于检测文件类型。示例: " my filetype file if exists("did_load_filetypes") finish endif augroup filetypedetect au! BufRead,BufNewFile *.mine setfiletype mine au! BufRead,BufNewFile *.xyz setfiletype drawing augroup END 在用户运行时目录下,把该文件存为 "filetype.vim"。例如,在 Unix 上: :w ~/.vim/filetype.vim 3. 要使用新的文件类型检测,你需要重新启动 Vim。 这里,你的 filetype.vim 会在缺省的 FileType 自动命令安装前被执行。所以,你 的自动命令会先被匹配,而 ":setfiletype" 命令的时候保证了其后没有其他的自动 命令会改变 'filetype' new-filetype-scripts D. 如果你的文件类型只能通过分析文件内容来检测。 1. 建立你的用户运行时目录。通常,你会用 'runtimepath' 选项的第一项。Unix 上 的例子: :!mkdir ~/.vim 2. 创立一个 vim 脚本,来实现需要的功能。示例: if did_filetype() " filetype 已经设立.. finish " ..不需要这些检测 endif if getline(1) =~ '^#!.*\<mine\>' setfiletype mine elseif getline(1) =~? '\<drawing\>' setfiletype drawing endif 更多的例子可以参见 $VIMRUNTIME/scripts.vim。 把该文件命名为 "scripts.vim",并保存在你的用户运行时目录。例如,在 Unix 上: :w ~/.vim/scripts.vim 3. 检测会立即生效,无须重新启动 Vim。 你的 scripts.vim 在文件类型的缺省之前被载入,这意味着你的规则会覆盖 $VIMRUNTIME/scripts.vim 的缺省规则。 remove-filetype 如果某个文件类型检测有问题,安装一个 filetype.vim 或者 scripts.vim 去捕获这个 问题 (见上)。你可以把 'filetype' 设成一个不存在的名字,使得以后不会被设置: :set filetype=ignored 如果你为许多用户设置系统,而不想为每个用户分别增加/删除相同的为件类型,考虑把 filetype.vim 和 scripts.vim 写到一个大家都能用的运行时目录里。查看 'runtimepath' 里有没有能用的目录。如果没有,在 system-vimrc 里设置 'runtimepath'。切记要保存缺省的目录。 autocmd-osfiletypes 备注: 现在此段代码已不再用,因为我们已移除了 RISC OS 实现。将来就用 'filetype' 选项便可。 如果操作系统支持在文件里存储文件类型,你可以指定某一文件类型专用的自动命令。 实际的类型检查决定于你运行 Vim 所处的平台;详情参见你的系统文档。 要在自动命令里使用 osfiletype 检查,你应该把待匹配类型的模式串用尖括号括起来, 就像这样: :au BufRead *.html,<&faf;HTML> runtime! syntax/html.vim 这会匹配: - 任何名字以 ".html" 结尾的文件 - 任何类型为 "&faf" 或者 "HTML" 的文件,这些类型的具体含义取决于你使用的 Vim 的版本。 未知的类型被认为是 匹配。 你可以同时自动指定类型和模式 (这时两者必须都匹配): :au BufRead <&fff>diff* 这个例子会匹配类型为 "&fff" 而且文件名以 "diff" 开始的文件。 plugin-details "plugin" 目录可以在 'runtimepath' 选项里的任何一个目录里。所有这些目录都会被搜 索,查找到的插件会被全部调入。例如,如果命令: set runtimepath 产生这样的输出: runtimepath=/etc/vim,~/.vim,/usr/local/share/vim/vim82 那么 Vim 会调入以下目录及其下的所有插件: /etc/vim/plugin/ ~/.vim/plugin/ /usr/local/share/vim/vim82/plugin/ 注意 最后一项是 $VIMRUNTIME 被扩展的值。 备注 使用插件管理器或 packages 时,会在 'runtimepath' 中加入很多目录。这些插 件每个需要自己的目录,请不要把它们直接加进 ~/.vim/plugin。 有没有可能你的插件好像没有被调入呢?通过 -V 参数,你可以看看 Vim 启动的时候 发生了什么: vim -V2 你会看到很多信息。其中有关于调入插件的一行注释。它这样开始: Searching for "plugin/**/*.vim" in 这样,你就能看到 Vim 在哪里查找你的插件脚本了。

2. 文件类型插件 filetype-plugins

如果允许载入文件类型插件 :filetype-plugin-on ,相应的选项会被设置,映射会被定 义。它们都局部于缓冲区,不会影响其他的文件。 定义文件类型的映射可能会影响你自己定义的映射。有一些方法可以避免这一点: 1. 设置 "maplocalleader" 变量为你想映射开始的键序列。例如: :let maplocalleader = "," 所有的映射现在都以逗号开始,而不是缺省的反斜杠。另见 <LocalLeader> 。 2. 定义你自己的映射。例如: :map ,p <Plug>MailQuote 你需要检查下面给出的插件文件的描述,以了解它们的功能和映射到的字符串。 你需要在插件载入之前定义自己的映射。(在编辑该类型的文件之前)。该插件就可以 跳过缺省映射的安装了。 no_mail_maps g:no_mail_maps 3. 屏蔽特定文件类型的映射可以通过设置一个变量进行。该变量包含文件类型的名字。 对于 "mail" 文件类型它可能是: :let no_mail_maps = 1 no_plugin_maps g:no_plugin_maps 4. 通过设置变量屏蔽所有文件类型的映射: :let no_plugin_maps = 1 ftplugin-overrule 如果某个全局文件类型插件不完全符合你的期待,有三个办法可以改变: 1. 增加一些设置。 你必须在 'runtimepath' 靠前的一个目录里建立一个新的文件类型插件。Unix 上, 你可以使用这个文件: vim ~/.vim/ftplugin/fortran.vim 你可以设置你希望有的选项和映射。注意,全局插件会在其后进行。它可能会否决你 做的那些设置。如果发生了,你有以下两种方法。 2. 建立一个插件的备份,并改变之。 你需要把该备份放在 'runtimepath' 靠前的位置。Unix 上,你可以这么做: cp $VIMRUNTIME/ftplugin/fortran.vim ~/.vim/ftplugin/fortran.vim 这样你可以自由的编辑你的备份文件。因为 b:did_ftplugin 会被设置,全局的插件 就不会载入自身。这样做的一个缺点是,如果发行的插件版本更新,你需要重新复制 并再次进行修改。 3. 在载入全局插件以后否决一些设置。 你需要在 'runtimepath' 的尾部建立一个新的文件类型插件。Unix 上,你可以使用 这个文件: vim ~/.vim/after/ftplugin/fortran.vim 在这个文件里,你可以对需要的设置进行改变。

3. 缺省文件类型插件的文档 ftplugin-docs

plugin_exec g:plugin_exec 许可执行外部命令。它的引入是由于历史原因,如 perl 文件类型插件 (还有其他一些) 用于设置搜索路径。 出于安全考虑,缺省关闭: :let g:plugin_exec = 1 可只为特定文件类型打开: :let g:<filetype>_exec = 1 所以要只为 ruby 打开,如此设置: :let g:ruby_exec = 1 如果同时设置全局 plugin_exec<filetype>_exec 特定变量,文件类型特定变量 优先。 ASCIIDOC ft-asciidoc-plugin 要打开 folding : let g:asciidoc_folding = 1 要关闭标头折叠的嵌套: let g:asciidoc_foldnested = 0 要关闭标题下所有内容的折叠: let asciidoc_fold_under_title = 0 ARDUINO ft-arduino-plugin 缺省根据 Arduino IDE 的缺省设置来设置以下选项: setlocal expandtab tabstop=2 softtabstop=2 shiftwidth=2 要关闭此行为,在 vimrc 里设置以下变量: let g:arduino_recommended_style = 0 AWK ft-awk-plugin GNU Awk 的特定功能,如 @include,的支持,可以这样打开: :let g:awk_is_gawk = 1 CHANGELOG ft-changelog-plugin 允许方便的输入 Changlog 文件的 Changelog 段 (entry)。有些命令,映射和变量值得 探索一下: 选项: 'comments' 置为空,以免影响排版。 'textwidth' 设为 78,这是标准。 'formatoptions' 增加 't' 标志位,使得插入文本时能进行回绕。 命令: NewChangelogEntry 智能地增加新的 Changelog 段 (见下)。 局部映射: <Leader>o 同样智能地开始一个新的 Changlog 段 (见下)。 全局映射: 注意: 全局设置是通过先执行 ftplugin/changelog.vim 文件 设置的。例如在你的 .vimrc 里加上: runtime ftplugin/changelog.vim <Leader>o 切换到为当前目录打开的 ChangeLog 缓冲区。如果当前目录 已存在该文件,在新的缓冲区打开之。然后执行上述局部 <Leader>o 的功能。 变量: g:changelog_timeformat 已废弃;请用 g:changelog_dateformat 代替。 g:changelog_dateformat Changelog 段使用的日期 (和时间) 格式。该格式和 strftime() 函数使用的语法相同。 缺省值是 "%Y-%m-%d",这是许多 ChangeLog 排版所使用的标 准格式。 g:changelog_username 用户的名字和 email 地址。缺省值从环境变量和系统文件里 推得。它先搜索当前用户 /etc/passwd 的注释部分。非正式 地,该项在第一个分隔的逗号之前的部分包含了用户的实际名 字。然后它再检查 $NAME 环境变量,最后运行 `whoami' 和 `hostname' 来构造一个 email 地址。最终形式是 Full Name <user@host> g:changelog_new_date_format 建立新的日期项目时所用的格式。下表描述字符串中的特殊记 号: %% 插入单个 '%' 号 %d 插入上述的日期 %u 插入上述的用户 %p 插入 b:changelog_entry_prefix 的值 %c 完成时光标的位置 缺省值是 "%d %u\n\n\t* %p%c\n\n",它会产生如下的结果 (| 是光标键要到的位置,除非出现在行首。那里它就是意味 着一行的开始) |2003-01-14 Full Name <user@host> | | * prefix| g:changelog_new_entry_format 建立新段所用的格式。下表描述字符串里的特殊记号: %p 插入 b:changelog_entry_prefix 的值 %c 完成时光标的位置 缺省值是 "\t*%c",产生的结果如下 | * prefix| g:changelog_date_entry_search 搜索日期项所用的搜索模式。 g:changelog_new_date_format 所使用的特殊记号这里也可以 使用。 缺省值是 '^\s*%d\_s*%u',它能找到匹配如下形式的行 |2003-01-14 Full Name <user@host> 和一些类似的格式。 g:changelog_date_end_entry_search 搜索日期项结尾所用的搜索模式。 g:changelog_new_date_format 所使用的特殊记号这里也可以 使用。 缺省值是 '^\s*$',它匹配只包含空白或全空的行。 b:changelog_name b:changelog_name 寻找的 ChangeLog 文件名。缺省是 'ChangeLog'。 b:changelog_path 当前缓冲区使用的 ChangeLog 路径。缺省为空,也就是寻找 和当前缓冲区同一目录的名为 b:changelog_name 的文件。 如果没找到,搜索当前缓冲区的父目录,如此递归直到找到文 件或者没有更多的父目录可供搜索。 b:changelog_entry_prefix 函数名,用于生成新段的前缀。该函数没有参数,而应返回包 含前缀的字符串。 可以返回空前缀。 缺省生成 ChangeLog 的路径名和当前缓冲区路径名两者的较 短者。此变量将来应该可以使用其它变量上下文,例如 g:。 Changelog 段插入时,只需要输入最少量的文本。在确定当前日期和用户后,在该文件里 会搜索以当前日期和用户开头的一段,如果找到了,则在其后添加一个新项。如果没有, 则从 Changelog 文件开始处添加新的段和项目 (item)。 FORTRAN ft-fortran-plugin 选项: 'expandtab' 被打开,按照 Fortran 标准的要求,不应出现制表字符。用户在 .vimrc 文件里设置 fortran_have_tabs 除外。 'textwidth' 固定宽度源文件格式设为 80,自由格式的源代码设为 132。设置 fortran_extended_line_length 变量会把固定宽度源文件格式的宽度 设为 132。 'formatoptions' 设为能断开代码和注释行,并保留长行。你可以用 gq 排版注释。 更多的关于 fortran_have_tabs 和检测源代码格式的方法的讨论,可见 ft-fortran-syntax 。 FREEBASIC ft-freebasic-plugin 此插件用于把四种 FreeBASIC 方言,"fb"、"qb"、"fblite" 和 "deprecated" 当作不同 的语言。 方言根据 g:freebasic_forcelang、待编辑文件中的任何 #lang 指令 或 $lang 宏命 令、最后是 g:freebase_lang 中首个找到的名字。概念上,这些全局变量对应 fbc 选项 -forcelang 和 -lang。方言没有显式指定时,用 "fb"。 例如,要设置方言缺省为 "fblite",但允许 #lang 指令覆盖,可用: let g:freebasic_lang = "fblite" GDSCRIPT ft-gdscript-plugin 根据 Godot 官方文档,设置如下缺省值: setlocal noexpandtab softtabstop=0 shiftwidth=0 要关闭此行为,在 vimrc 里设置以下变量: let g:gdscript_recommended_style = 0 GIT COMMIT ft-gitcommit-plugin 提供了一个命令 :DiffGitCached 来在预览窗口中显示当前提交的差异部分。等价于 "git diff --cached" 加上此命令后面的参数。 GO ft-go-plugin 根据 Golang 官方文档,设置如下缺省值: setlocal noexpandtab softtabstop=0 shiftwidth=0 要关闭此行为,在 vimrc 里设置以下变量: let g:go_recommended_style = 0 GPROF ft-gprof-plugin gprof 文件类型插件定义了 <C-]>,从 gprof flat profile 或调用关系图 (call graph) 里的函数项目跳转到调用关系图里的函数细节。 可如此关闭此映射: let g:no_gprof_maps = 1 HARE ft-hare 因为这个插件的文本相当长,它被单独列出: ft_hare.txt . IDRIS2 ft-idris2-plugin 缺省使用以下选项: setlocal shiftwidth=2 tabstop=2 expandtab setlocal comments=s1:{-,mb:-,ex:-},:\|\|\|,:-- setlocal commentstring=--\ %s setlocal wildignore+=*.ibc 要缩进使用制表而不是空格,在 vimrc 里设置变量: let g:idris2#allow_tabchar = 1 JAVA ft-java-plugin 定义了变量 "g:ftplugin_java_source_path" 且值为扩展名为 ".jar" 或 ".zip" 的文 件名时,如: let g:ftplugin_java_source_path = '/path/to/src.jar' let g:ftplugin_java_source_path = '/path/to/src.zip' 此时如果已经载入过 zip 插件, gf 命令可用于打开归档文件, n 命令可用于寻找 选中的类型,而 <Return> 键可用于载入列出的文件。 注意 在 Zip 插件载入的缓冲区 "gf" 命令的效果取决于 Zip 插件的版本。不支持 Jar 类型的归档的 Zip 插件版本可以考虑为每个感兴趣的 Jar 归档创建带 ".zip" 扩展 名的符号链接,并从此后把这类文件赋给本变量。 否则 (译者注: 指此变量不是归档文件时),如果变量 "g:ftplugin_java_source_path" 有定义,'path' 选项的本地值会被进一步修改,加上变量值作为前缀,如: let g:ftplugin_java_source_path = $JDK_SRC_PATH let &l:path = g:ftplugin_java_source_path . ',' . &l:path 然后就可在完全限定类型上用 "gf" 命令,在 "path" 里寻找文件,并试图载入之。 记住每次给此变量赋新值时,要为载入 Java 文件的缓冲区手动触发 FileType 事件: doautocmd FileType markdown 文档注释为了美观,可能会在注释标记 ( /// ) 后用相同长度的垂直引导空白 串;但 markdown 里水平引导空白串有特别含义,因为它们代表代码块等。为便利起见, 给 gq 操作符提供了 'formatexpr' 函数。只要 "g:java_ignore_javadoc" 和 "g:java_ignore_markdown" 都没有定义,可按需打开 markdown 注释的重新排版: setlocal formatexpr=g:javaformat#RemoveCommonMarkdownWhitespace() 对低于 7.4.265 的 Vim 版本,可用: setlocal formatexpr=javaformat#RemoveCommonMarkdownWhitespace() 此函数接受行范围,删除相同长度的垂直引导空白串,并对此范围的行进行重写。取决于 作者的布局风格和注释内容,选择哪些行来重新排版差异很大,从整段注释到其中的一小 部分都无不可。 对高于 8.2.1397 的 Vim 版本,每次删除 "g:java_ignore_markdown" 或 "g:java_ignore_javadoc" 后如果要打开 markdown 注释的识别,记住要手动重新执行 "javaformat.vim": runtime autoload/javaformat.vim JSON-FORMAT ft-json-plugin 可扩展 JSON 文件类型,用 'formatexpr' 和 "json.FormatExpr()" 函数来进行 json 排版 (用 gq )。 在 $HOME/.vim/ftplugin/json.vim 里加上: vim9script import autoload 'dist/json.vim' setl formatexpr=json.FormatExpr() LUA ft-lua-plugin g:lua_folding 可打开使用 fold-expr 的 Lua 函数折叠: let g:lua_folding = 1 g:lua_version g:lua_subversion Lua 文件类型的 'includeexpr'ft-lua-syntax 高亮使用全局变量 "g:lua_version" 和 "g:lua_subversion" 来决定使用的 Lua 版本 (缺省为 5.3) 例如要用 Lua 5.1: let g:lua_version = 5 let g:lua_subversion = 1 MAIL ft-mail-plugin 选项: 'modeline' 被关闭,以防特洛伊木马。也防止含有 "Vim:" 字样的标题会引起错误 信息。 'textwidth' 设为 72。这是 e-mail 推荐的格式。 'formatoptions' 设为能断开文本行,并且在新行里重复注释的前导符,这样引用开头的 ">" 就可以重复了。你也可以用 gq 排版引用文本。 局部映射: <LocalLeader>q 或者 \MailQuote 引用可视模式下的选择文本,或者在普通模式下从光标位置到文件末的文本。这 意味着 "> " 会插到每行的开始。 MAN ft-man-plugin :Man man.vim 此插件以友好方式显示手册页。详情可见用户手册中的 find-manpage 。 要在调入任何手册页之前就能使用 :Man 命令,你需要在启动的 vimrc 文件里先执 行以下脚本: runtime ftplugin/man.vim 选项: 'iskeyword' 加入 '.' 字符,提供能在手册页名字上使用 CTRL-] 的支持。 命令: Man {name} 在窗口里显示 {name} 的手册页 Man {number} {name} 在第 {number} 节里显示 {name} 的手册页。 全局映射: <Leader>K 显示当前光标下的单词的相应手册页。 <Plug>ManPreGetPage 同上,可用于映射: nmap <F1> <Plug>ManPreGetPage<CR> 局部映射: <Plug>ManBS <LocalLeader>h 从缓冲区里清除退格符 <BS>CTRL-] 跳到当前光标下的单词的相应手册页。 CTRL-T 跳回前一次的手册页。 可以关闭这些映射: let g:no_man_maps = 1 要使用垂直映射而不是水平映射: let g:ft_man_open_mode = 'vert' 要用新标签页: let g:ft_man_open_mode = 'tab' 要打开折叠: let g:ft_man_folding_enable = 1 如果不喜欢缺省的折叠方式,使用 autocommand 加入你喜欢和折叠风格。例如: autocmd FileType man setlocal foldmethod=indent foldenable 如果你希望 :Man {number} {name} 像 man {number} {name} 那样,如果找不到页面就 不运行 man {name},可以这样用: let g:ft_man_no_sect_fallback = 1 你可能还想设置 'keywordprg',使 K 命令在 Vim 窗口打开手册页: set keywordprg=:Man MANPAGER manpager.vim :Man 命令把 Vim 变成手册浏览器 (语法高亮手册页,按 CTRL-] 时点击相连的手册 页)。 对 bash、zsh、ksh 或 dash,加入对应的配置文件 (.bashrc、.zshrc、...) export MANPAGER="vim +MANPAGER --not-a-term -" 对 (t)csh,加入配置文件 setenv MANPAGER "vim +MANPAGER --not-a-term -" 对 fish,加入配置文件 set -x MANPAGER "vim +MANPAGER --not-a-term -" MARKDOWN ft-markdown-plugin 要打开折叠,可用: let g:markdown_folding = 1 缺省置位 'expandtab'。如果不想如此: let g:markdown_recommended_style = 0 ORG ft-org-plugin 要打开折叠: let g:org_folding = 1 PDF ft-pdf-plugin 提供两个映射,<C-]> 和 <C-T>,来模拟用于 PDF 浏览的标签栈。以下内容视为标签: - "startxref" 后指向 xref 表的字节位移 - 文件尾部中 /Prev 键后指向以前 xref 表的字节位移 - xref 表中形如 "0123456789 00000 n" 的行 - PDF 任意位置上形如 "1 0 R" 的对象引用 可以关闭这些映射 :let g:no_pdf_maps = 1 PYTHON ft-python-plugin PEP8 缺省设置以下选项,根据 PEPB: setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8 要关闭此行为,在 vimrc 里设置变量: let g:python_recommended_style = 0 QF QUICKFIX qf.vim ft-qf-plugin "qf" 文件类型用于快速修复窗口,见 quickfix-window 。 快速修复文件类型插件包括在 status-line 中显示生成快速修复列表命令的配置。要 关闭此设置,可以这样配置: :let g:qf_disable_statusline = 1 R MARKDOWN ft-rmd-plugin 缺省不执行 ftplugin/html.vim。要执行之,在 vimrc 中加入: let rmd_include_html = 1 动态地设置 R 代码和 markdown 代码不同的 'formatexpr' 值。如果你宁可 'formatexpr' 不置位,在 vimrc 中加入: let rmd_dynamic_comments = 0 R RESTRUCTURED TEXT ft-rrst-plugin 动态地设置 R 代码和 ReStructured 代码不同的 'formatexpr' 值。如果你宁可 'formatexpr' 不置位,在 vimrc 中加入: let rrst_dynamic_comments = 0 RESTRUCTUREDTEXT ft-rst-plugin 以下排版设置可选: setlocal expandtab shiftwidth=3 softtabstop=3 tabstop=8 要打开此排版,在 vimrc 中设置以下变量: let g:rst_style = 1 RNOWEB ft-rnoweb-plugin 动态设置 'formatexpr' 选项,对 R 代码和 Latex 代码使用不同的值。如果不想设置 'formatexpr',在 vimrc 中加入: let rnw_dynamic_comments = 0 RPM SPEC ft-spec-plugin 因为这个插件的文本相当长,它被单独列出: pi_spec.txt 。 RUST ft-rust 因为这个插件的文本相当长,它被单独列出: ft_rust.txt 。 SQL ft-sql 因为这个插件的文本相当长,它被单独列出: ft_sql.txt 。 TEX ft-tex-plugin g:tex_flavor 如果 *.tex 文件的首行是如下的形式 %&<format> 那么它决定了文件类型: plaintex (普通的 TeX)、context (ConTeXt)、或者 tex (LaTeX)。否则在文件里搜索关键字以判断是 context 还是 tex。如果找不到关键字,缺 省是 plaintex。可以通过定义变量 g:tex_flavor 改变缺省值为最常用的格式 (不是文 件类型)。使用下列选择之一: let g:tex_flavor = "plain" let g:tex_flavor = "context" let g:tex_flavor = "latex" 目前还不能识别其它格式。 TYPST ft-typst-plugin g:typst_conceal TRUE 时,Typst 文件类型插件会设置 'conceallevel' 选项为 2。 g:typst_folding TRUE 时,Typst 文件类型插件会折叠标头。(缺省: FALSE ) 要打开之: let g:typst_folding = 1 g:typst_foldnested TRUE 时,Typst 文件类型插件会在父标头内部折叠嵌套的标头。(缺省: TRUE ) 要关闭之: let g:typst_foldnested = 0 VIM ft-vim-plugin Vim 文件类型插件定义 [[ 和 ]] 用来移动到函数开头和结尾处的映射。用 ]" 和 [" 在 注释间移动。 可以这样关闭这些映射: let g:no_vim_maps = 1 ZIG ft-zig-plugin g:zig_recommended_style 根据 Zig 推荐风格,缺省使用以下缩进选项 (https://ziglang.org/documentation/master/): setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8 要关闭此行为,把 g:zig_recommended_style 设为 0: let g:zig_recommended_style = 0 g:zig_std_dir Zig 标准库的路径。Zig ftplugin 读取 g:zig_std_dir 并附加到 'path' 之后用于 查找 Zig 文件。Zig 标准库的位置取决于系统和安装方法。 可用 `zig env` 自动设置 g:zig_std_dir : let g:zig_std_dir = json_decode(system('zig env'))['std_dir'] 这可以,比方说,放在 FireType :autocmd 或用户 ftplugin 里,这样就会只在载入 Zig 文件时才执行。 ZIMBU ft-zimbu-plugin Zimbu 文件类型插件定义 [[ 和 ]] 用来移动到函数开头和结尾处的映射。 可以这样关闭这些映射: let g:no_zimbu_maps = 1 vim:tw=78:ts=8:noet:ft=help:norl: