gui

gui.txt 适用于 Vim 9.2 版本。 最近更新: 2025年9月 VIM 参考手册 by Bram Moolenaar 译者: Willis Vim 的图形用户界面 gui GUI 1. 启动 GUI gui-start 2. 滚动条 gui-scrollbars 3. 鼠标控制 gui-mouse 4. 使用 GUI 进行选择 gui-selections 5. 菜单 menus 6. 字体 gui-font 7. 附加 gui-extras 8. 外壳命令 gui-shell 其它的 GUI 文档: gui_x11.txt 关于 X11 GUI 的特定内容。 gui_w32.txt 关于 Win32 GUI 的特定内容。

1. 启动 GUI gui-start E229 E233

首先,需要确定运行的 Vim 版本包含 GUI 支持。可用 ":version" 命令检查,它应该输 出 "带 xxx 图形界面",其中 "xxx" 是 X11-Motif、Photon、GTK2、GTK3 等,或者 "MS-Windows 32 位图形界面版本" 等等。 启动 GUI 的方法取决于不同系统。多数情况下,可以这样启动 Vim 的 GUI 版本: gvim [options] [files...] Vim 的 X11 版本 在 GUI 和非 GUI 模式上都可以运行。见 gui-x11-start gui-init gvimrc .gvimrc _gvimrc $MYGVIMRC gvimrc 文件用于放置 GUI 专用的启动命令。它总在 vimrc 文件之后执行。如果此文 件存在,$MYGVIMRC 环境变量会保存其文件名。 GUI 启动时,会按照以下顺序执行初始化操作: - 'term' 选项被设为 "builtin_gui",终端选项被复位为其 GUI 缺省值 terminal-options 。 - 系统菜单文件存在时,执行之。该文件通常是 "$VIMRUNTIME/menu.vim",但可通过 :version 检查实际路径。另见 $VIMRUNTIME 。要跳过系统菜单载入,可在 'guioptions' 里加入 'M'。 buffers-menu no_buffers_menu 系统菜单文件会包含 "缓冲区" 菜单。如果不需要,可在 .vimrc (不是 .gvimrc!) 里置位 "no_buffers_menu" 变量: :let no_buffers_menu = 1 备注: 打开语法高亮时,也会载入菜单文件,因此要关闭缓冲区菜单,必须在 `:syntax on` 之前进行。 此菜单中的路径名被截短到 35 个字符。要截短到其他长度 (例如 50),可用: :let bmenu_max_pathlen = 50 - 启动 Vim 时,如果用了 "-U {gvimrc}" 命令行选项,会执行该 {gvimrc} 文件进行初 始化,并跳过以下步骤。{gvimrc} 为 "NONE" 时,初始化过程不读入任何文件。 - 对 Unix 和 MS-Windows 而言,系统 gvimrc 文件存在时,执行之。该文件通常是 "$VIM/gvimrc",但可通过 :version 检查实际路径。另见 $VIM 。 - 尝试以下位置,只使用其中首个可用的环境变量或用户 gvimrc 文件: - GVIMINIT 环境变量存在而且非空时,Vim 会将其内容作为 Ex 命令来执行。 - 用户 gvimrc 文件存在时,执行之。该文件通常是 "$HOME/.gvimrc",但可用 :version 检查实际路径 (译者注: 此路径被称为用户 gvimrc 文件)。 - 对 Win32 而言,必要时 Vim 会设置 $HOME,见 $HOME-windows 。 - 如果没找到 "_gvimrc" 文件,也会尝试 ".gvimrc"。反之亦然。 - (译者注: 系统此时会检查 $HOME/.vim/gvimrc (Unix) 或 $HOME/vimfiles/gvimrc (Win32),此路径被称为第二用户 gvimrc 文件,可用 :version 检查实际路径) - 对 Unix 而言,如果找到 "~/.config/vim/gvimrc" 或 "$XDG_CONFIG_HOME/vim/gvimrc" (如果 XDG_CONFIG_HOME 环境变量存在),执行 之。可用 :version 检查实际路径 (译者注: 这被称为第三用户 gvimrc 文件)。 首个被找到的文件名被保存到 $MYGVIMRC,除非该环境变量已被设置。 - 如果置位 'exrc' 选项 ( 并非 缺省),会执行文件 ./.gvimrc。如果该文件拥有者不 是当前用户,会有一些安全限制。如果没找到 ".gvimrc",也会尝试 "_gvimrc"。对 Macintosh 和 DOS/Win32 而言,会先尝试 "_gvimrc" 而非 ".gvimrc"。 注意: 如果 Vim 启动时使用 "-u NONE"、"-u DEFAULTS" 且没有给出 "-U" 参数、或者 "-U NONE",则除了第一步 (终端设置) 以外,其他初始化操作都不执行。 以上步骤在通用 Vim 初始化 (如读取 .vimrc 文件) 之 执行。参见 initialization 。 仅在全部初始化操作执行完毕后,才会打开 GUI 窗口。要在打开 GUI 窗口后再执行若干 命令,可用 GUIEnter 自动事件。例如: :autocmd GUIEnter * winpos 100 50 可用 gvimrc 文件自定义菜单 (见 :menu ),以及设置其他不同于终端版本的个人初始 化选项。 用户 GUI 初始化文件建议放在以下位置: Unix $HOME/.gvimrc 或 $HOME/.vim/gvimrc (译者注: 还可以 放在 $HOME/.config/vim/gvimrc) Win32 $HOME/_gvimrc、$HOME/vimfiles/gvimrc 或 $VIM/_gvimrc Amiga s:.gvimrc、home:.gvimrc、home:vimfiles:gvimrc 或 $VIM/.gvimrc Haiku $HOME/config/settings/vim/gvimrc 按以上顺序依次搜索用户初始化文件,只读入其中首个找到的文件。 若干选项仅在 GUI 版本的 Vim 里才有意义。它们分别是 'guicursor''guifont''guipty''guioptions'。和其它选项一样,其文档可见 options.txt 。 使用 Motif 版本的 GUI (不适用于 GTK+ 或 Win32 版本) 时,可以使用若干 X 资源。 见 gui-resources 。 另外一个为不同场合设置不同颜色的方法是使用高亮组。其中,"Normal" 组用来设置缺 省的背景和前景色。示例 (看上去很悦目): :highlight Normal guibg=grey90 "guibg" 和 "guifg" 设置会覆盖正常的背景和前景设置。不使用 Normal 高亮组的其他 设置。要设置字体,可用 'guifont' 选项。 要为不同 Vim 模式设置不同的光标颜色,另见 'guicursor' 选项。 启动时,Vim 会让窗口适应屏幕大小,以免部分内容不可见。在 X 窗口系统中,这需要 一些估算。要调整用于窗口标题和任务栏的预留高度,可用 'guiheadroom' 选项。 :winp :winpos E188 :winp[os] 显示当前 GUI vim 窗口左上角的 {X}{Y} 坐标,以像素为单位。 并非在所有系统上都可用。 另见 getwinpos()getwinposx()getwinposy() 。 :winp[os] {X} {Y} E466 将 GUI vim 窗口的左上角位置定位在给定的 {X}{Y} 坐标,以像 素为单位。并非在所有系统上都可用,但可用于 (新版的) xterm xterm-color 。 GUI 窗口还未打开时,会先记住坐标值,等到窗口打开时再应用。该位 置可能会被调整,以尽量让窗口适应屏幕上大小 (如果可能)。 :wi :win :winsize E465 :win[size] {width} {height} 设置窗口高度为 {width}{height} 高,以字符为单位。 建议使用 `:set lines=11 columns=22` 代替,因为这样更容易理解这 些数值的意义。 如果实际行数少于指定值,请检查 'guiheadroom' 选项。 运行 X 窗口系统时,可获取 Vim 运行所在窗口的相关信息: :!xwininfo -id $WINDOWID :!xprop -id $WINDOWID :execute '!xwininfo -id ' .. v:windowid :execute '!xprop -id ' .. v:windowid gui-IME iBus X 系统中,依赖 XIM 框架的国际字符输入法 (尤其是 iBus) 已知会给 gvim 产生一些不 良效果。包括不能输入空格,输入字符之间有长时间延迟,或者应用无法识别输入的字符 等等。 一个可行的解决方法 (虽然原因不明),是在启动时使用 -f 参数,不让 gvim 通过分 叉 (fork) 进入后台运行。

2. 滚动条 gui-scrollbars

Vim 提供若干垂直滚动条和一个水平滚动条。可用 'guioptions' 选项来设置具体显示哪 些滚动条。 界面看起来是这样 (假定使用 ":set guioptions=mlrb" 设置): +------------------------------+ ` | 文件 编辑 帮助 | <- 菜单栏 (m) ` +-+--------------------------+-+ ` ^ ^ ` # 文本区域 # ` | | | | ` v __________________________ v ` Vim 窗口间的 -> |-+ File.c 5,2 +-| ` 普通状态行 ^ """""""""""""""""""""""""" ^ ` | | | | ` | | 另一个文件缓冲区。 | | ` | | | | ` # # ` 左滚动条 (l) -> # # <- 右滚动条 (r) ` # # ` | | | | ` v v ` +-+--------------------------+-+ ` | |< #### >| | <- 底部滚动条 (b) ` +-+--------------------------+-+ ` 可以通过在 'guioptions' 字符串中移除对应的字母标志位 (见上图),来关闭相应的滚 动条或菜单栏。底部滚动条仅在置位 'nowrap' 时才有用。 垂 直 滚 动 条 gui-vert-scroll 每个 Vim 窗口旁边都有一个滚动条,可以通过上下滚动来改变缓冲区中显示的文本位 置。滚动条拇指 (thumb,又译滑块) 的大小指示窗口中可见内容在整个缓冲区中所占的 比例。如果滚动条被一直往下拖动,文件末行最后会显示在窗口的顶部。 如果某个窗口被缩小到零高度 (因为其他窗口被放大),其滚动条会消失。窗口恢复时, 滚动条才会重新出现。 如果窗口被垂直分割,当该窗口是当前窗口时,或者,想象从当前窗口正中间画一条垂直 线,这条线会经过该窗口时,则该窗口会有滚动条。 如果左右两侧都有滚动条,而当前窗口的中间线落在左半边,那么右侧滚动条列会包含最 右侧窗口的滚动条。另外一侧也是如此。 水 平 滚 动 条 gui-horiz-scroll 水平滚动条 (位于 Vim GUI 窗口底部) 在 'wrap' 选项关闭时,可用来水平滚动文本。 滚动条的拇指大小取决于最长可见行的文本可以左右滚动的最大范围。有必要时,会移动 光标,确保光标总会停留在可见字符上 (除非置位了 'virtualedit')。 计算最长可见行的长度需要一定开销,而且每次有文本改变时都需要重新进行。如果此操 作耗时太长,或者不希望光标跳到别的行上,可在 'guioptions' 里包含 'h' 标志位。 此时,滚动会仅局限于当前光标所在的文本行。 motif-intellimouse 有 Intellimouse 鼠标并且 X 服务器支持滚轮时,在 gvim 里可用滚轮上下滚动文本。 此功能适用于 XFree86 4.0 和以后的版本,也可在一些更老的版本上使用,但需要安装 补丁。见 scroll-mouse-wheel 。 较老的 XFree86 版本里,需要为 X 服务器安装补丁。以下页面提供了关于 Linux 上使 用 Intellimouse 的一些信息,同时包含补丁和 X 服务器可执行文件的链接 (但后者未 必有用户所需的版本): (死链) http://www.inria.fr/koala/colas/mouse-wheel-scroll/

3. 鼠标控制 gui-mouse

仅在 'mouse' 选项设置合适的标志位时,鼠标才会正常工作。打开 GUI 时,如果还未设 置 'mouse''mouse' 选项会被自动设为 "a",确保鼠标在除了 hit-enter 提示以外 的所有的模式下都能使用。如果不希望如此,建议在 "gvimrc" 文件中修改 'mouse' 选 项。 其它相关选项: 'mousefocus' 窗口焦点追随鼠标指针 gui-mouse-focus 'mousemodel' 各个鼠标按钮执行的具体操作 'mousehide' 输入文本时隐藏鼠标指针 'mousemoveevent' 启用鼠标移动事件,此时 <MouseMove> 可被映射 'selectmode' 使用鼠标开始选择时,启动选择模式还是可视模式 设置这些选项的一个快速方法是通过 ":behave" 命令。 :behave :be :be[have] {model} 设置鼠标以及选择的行为。可接受的参数是: mswin MS-Windows 行为 xterm Xterm 行为 使用 ":behave" 会改变以下选项: 选项 mswin xterm 'selectmode' "mouse,key" "" 'mousemodel' "popup" "extend" 'keymodel' "startsel,stopsel" "" 'selection' "exclusive" "inclusive" 在 $VIMRUNTIME 目录下,有一个名为 mswin.vim 的脚本 。它会在 MS-Windows 上定 义一些用于剪切/复制/粘贴的键盘映射,但这些映射与 Vim 兼容,因为它覆盖了 CTRL-VCTRL-XCTRL-C 键。如果不介意这些键被覆盖,可用以下命令: :so $VIMRUNTIME/mswin.vim 关于如果使用鼠标滚轮进行滚动,参见 scroll-mouse-wheel 。 3.1 使用鼠标移动光标 gui-mouse-move 在文本缓冲区某处点击鼠标左键,光标会移动到点击的位置! 可用于 当 'mouse' 包含...时 普通模式 'n' 或 'a' 可视模式 'v' 或 'a' 插入模式 'i' 或 'a' 选择模式的处理方式和可视模式相同。 可以和操作符配合使用,比如 'd' 加鼠标点击,会删除从当前光标位置到鼠标点击位置 的所有文本。具体操作是,先按 'd',然后在某处点击鼠标。 gui-mouse-focus 可通过置位 'mousefocus' 选项,使键盘焦点追随鼠标指针。这就是说,鼠标移动到哪个 窗口,就激活哪个窗口。警告: 使用菜单时,该功能可能不完全可靠,因为菜单命令总是 作用于最顶层的窗口。 在 ':' (或 '/' 或 '?') 行上点击鼠标左键或右键,会在 ':' 行上移动光标到点击位 置 (当 'mouse' 包含 'c' 或 'a' 时)。 在任何情况下,都可以点击鼠标中键,用于粘贴当前选择的内容。 3.2 使用鼠标进行选择 gui-mouse-select 可用鼠标来启动选择。具体方式取决于 'mousemodel' 选项: 'mousemodel' 为 "extend" 时: 使用鼠标右键 'mousemodel' 为 "popup" 时: 使用鼠标左键,同时按住 Shift 键。 如果选择尚未开始,则会选中从先前光标位置开始到鼠标点击位置的文本范围。否则,选 择区域会在离鼠标更近的一端扩展到鼠标点击位置。 'selectmode' 包含 "mouse" 时,选择区会处于选择模式。这意味着此时输入正常文本会 替换选择区的内容。见 Select-mode 。不然,选择区处于可视模式。 双击该键会使选择区面向单词,三击会使之面向行,四击会使之面向列块。 关于如何使用选择区,见 gui-selections 。 3.3 鼠标另一种文本选择方式 gui-mouse-modeless modeless-selection 在以下任一情况下,会使用另一种选择方式: - 处于命令行模式 - 在命令行窗口中,且鼠标指向另一个窗口 - 出现 hit-enter 提示时 - 当前模式未包含在 'mouse' 选项中 - 在 GUI 模式中,按住 CTRL 和 SHIFT 键 此时 Vim 会像没有选择区存在一样继续工作,并且该选择不对应任何模式,因此这种选 择方式被称为无模式选择。此方式可以选择 Vim 窗口里的任何文本。具体方式是,鼠标 左键点击开始文本选择,拖动鼠标到选择区结尾,然后释放鼠标。要扩展选择区,当 'mousemodel' 为 "extend" 时,使用鼠标右键;而当 'mousemodel' 为 "popup" 时,使 用鼠标左键并同时按住 Shift 键。 选中文本发生滚动或被修改时,选择区会被撤销。 在命令行上,CTRL-Y 可以用来将选择区复制到剪贴板。在插入模式下,可用 CTRL-O : CTRL-Y <CR>'guioptions' 包含 a 或 A (X11 上的缺省值) 时,选择内容会 被自动复制到 "* 寄存器。 此时,鼠标中键可以粘贴文本。非 X11 系统上,可以使用 CTRL-R + (译者注: 适用于命 令行模式和插入模式)。 3.4 在状态行上使用鼠标 gui-mouse-status 在 Vim 窗口下方的状态行上点击鼠标左键或者右键,会将该窗口变成当前窗口。更准确 地说,这一操作是在鼠标释放时发生的 (以区别于拖动过程中的点击操作)。 可以使用鼠标左键上下拖动状态行,从而调整其上下窗口的高度。此操作不会改变窗口焦 点。 以上规则同样适用于垂直分割线: 点击会把焦点给其左侧窗口,左右拖动会调整其左右两 侧窗口的宽度。 3.5 各种鼠标点击 gui-mouse-various <S-LeftMouse> 正向搜索鼠标点击所在的单词。 当 'mousemodel' 为 "popup" 时,该操作用来开始或者扩展 选择区。 <S-RightMouse> 反向搜索鼠标点击所在的单词。 <C-LeftMouse> 跳转到鼠标点击所在的标签。 <C-RightMouse> 跳回上次标签跳转之前的光标位置 (同 "CTRL-T") 3.6 鼠标映射 gui-mouse-mapping 鼠标事件 (包括各种修饰符的组合) 可以被映射。例如: :map <S-LeftMouse> <RightMouse> :map <S-LeftDrag> <RightDrag> :map <S-LeftRelease> <RightRelease> :map <2-S-LeftMouse> <2-RightMouse> :map <2-S-LeftDrag> <2-RightDrag> :map <2-S-LeftRelease> <2-RightRelease> :map <3-S-LeftMouse> <3-RightMouse> :map <3-S-LeftDrag> <3-RightDrag> :map <3-S-LeftRelease> <3-RightRelease> :map <4-S-LeftMouse> <4-RightMouse> :map <4-S-LeftDrag> <4-RightDrag> :map <4-S-LeftRelease> <4-RightRelease> (译者注: 2-、3-、4- 分别指双击、三击和四击) 以上映射使得选择操作的行为与 Motif 应用程序一致,按 Shift + 鼠标左键可以扩展可 视区域,而不是鼠标右键。 <MouseMove> 也可被映射,但前提是要先打开 'mousemoveevent',这样映射才会生效。 带修饰符的鼠标映射不适用于无模式选择。 3.7 拖放 drag-n-drop 可以将一个或多个文件拖放到 Vim 窗口中,其效果相当于执行了 :drop 命令,打开被 放置的这些文件。要检查是否支持拖放功能,可查看 drop_file 特性: has('drop_file') 。 拖放时如果按住 Shift,Vim 会切换到首个被放置文件的所在目录。如果按住 Ctrl,Vim 总会为该文件分割出新窗口。否则,仅在当前缓冲区已修改时才会这么做。 可以将目录拖放到 Vim 中。这相当于为该目录启动探索器插件 (假设该插件被启用,不 然会给出错误信息)。按住 Shift 则会切换到该目录。 如果 Vim 正在编辑命令行过程中,被拖放的文件或目录名会被插入到光标所在位置。这 样,就可以在任何 Ex 命令中使用这些文件或目录名。其中的特殊字符 (空格、制表、双 引号、'|'、还包括非 MS-Windows 系统上的反斜杠) 在插入时会被转义。

4. 使用 GUI 进行选择 gui-selections

quotestar 要进行选择,可以使用鼠标 (见 gui-mouse-select ),也可使用 Vim 的可视模式 (见 v )。如果 'guioptions' 里包含 'a',那么无论何时开始选择 (可视或选择模式),或 者选择内容发生变化时,Vim 都会成为窗口系统主选择区的拥有者 (MS-Windows 上使 用 gui-clipboard ;X11 上使用 x11-selection - 无论具体指哪一个,这里都统称 主选择区)。 clipboard 有一个特殊寄存器,用于保存选择内容,这就是 "* 寄存器。仅当选择文本的相关信息发 生变动 (例如在某处按了鼠标左键),或者另一个应用想要粘贴选择文本时。文本才会被 放进 "* 寄存器。例如,要剪切一行,并使之成为当前的选择文本并放到剪贴板: "*dd 类似的,如果想从其他应用粘贴 (比如通过点击鼠标中键),该选择文本会先被放到 "* 寄存器上,然后再像其它寄存器那样被 'put' (放置)。例如,要放置选择内容 (剪贴板 的内容),可用: "*p 在 X11 中使用该寄存器时,另见 x11-selection 。那里也解释了相关的 "+ 寄存器。 注意 在从一个 Vim 实例粘贴文本到另一个独立的 Vim 实例时,选择类型 (面向字符、 行、还是面向列块) 会被保留。但对于其他应用,选择类型总是视为面向字符。不过,如 果通过 x11-cut-buffer 传输文本,选择类型 会丢失。 当 'clipboard' 选项包含了 "unnamed" 字符串时,无名寄存器等同于 "* 寄存器。这样 就可以直接抽出和粘贴选择内容,而无需在相关命令前加上 "*。 另见 W23W24

5. 菜单 menus

用户手册 usr_42.txt 有本节内容的简单介绍。 5.1 使用菜单 using-menus 菜单的使用方式和映射类似。可以自定义任意数量的菜单。 Vim 的长期用户可能不太依赖菜单。但它的优势在于可以自行扩展菜单和菜单项。这在 记不住键序列时很有用。 要用不同语言创建菜单,见 :menutrans 。 如果完全不想使用菜单,见 'go-M' menu.vim 缺省菜单由 "$VIMRUNTIME/menu.vim" 文件提供。 $VIMRUNTIME 说明该路径的来源。也 可以自行设置菜单。建议用缺省菜单作为蓝本,然后在此之上添加其他菜单项。如果完全 不喜欢缺省菜单,可用 :unmenu-all 先删除所有缺省菜单。也可将下行加入 .vimrc ( 不是 .gvimrc) 文件,这样,启动时就不会加载缺省菜单: :let g:did_install_default_menus = 1 如果同时也不想加载语法菜单: :let g:did_install_syntax_menu = 1 语法菜单中的第一项可以用来在语法菜单中加入所有可用的文件类型 (载入可能需要较长 时间)。如果想在启动时就将所有文件类型加入菜单,可用: :let g:do_syntax_sel_menu = 1 menu-lazyload g:do_no_lazyload_menus 以下菜单项显示所有可用的色彩方案,键盘映射和编译器设置: 编辑 > 色彩方案 编辑 > 键盘映射 工具 > 设置编译器 不过,载入这些项目可能需要较长时间,因为它们要从 'runtimepath' 中的每个目录里 搜索所有的相关文件。因此,它们被延后加载 (通过 CursorHold 事件),也可以手动 加载。如果想在系统启动时就载入所有这些项目,可用: :let g:do_no_lazyload_menus = 1 注意 在执行 `:syntax on` 或 `:filetype on` 时,或者在载入 .vimrc 文件时,都会 自动加载 menu.vim。这意味着,如果想修改 'encoding' 选项和消息语言 (`:language messages`),必须在这些操作之前就完成设置。 console-menus 尽管本文档着重讨论 GUI,但控制台模式其实也可使用菜单。不过,在该模式中,不会自 动载入菜单,需要用户自行载入 menu.vim 。然后,可以使用 :emenu 命令并配合 'wildmenu' 打开的命令行补全功能,从而像真实的菜单系统一样访问菜单项。为此,可 在 .vimrc 文件里放入如下命令: :source $VIMRUNTIME/menu.vim :set wildmenu :set cpo-=< :set wcm=<C-Z> :map <F4> :emenu <C-Z><F4> 可以启动菜单。此时可用光标移动键来选择菜单项。按 <Enter> 执行选中的菜 单项。按 <Esc> 取消菜单。本功能需要在编译时加入 +menu 特性。 tear-off-menus GTK+ 2 和 Motif 支持可撕菜单。这是一种自粘菜单,可撕下并变成会一直显示在屏幕上 的弹出菜单。如果这些菜单无法调整大小,可能是因为 defaults 文件里使用了类似 "Vim*geometry" 的设置。正确的写法应该是 "Vim.geometry"。 至于 GTK+ 3,从 GTK+ 3.4 开始,可撕菜单功能已被废弃。因而如果 gvim 链接的是 GTK+ 3.4 或更新版本,就不再支持可撕菜单功能。 在 Win32 GUI 版本里,Vim 会模拟 Motif 的可撕菜单。虽然真正的 Motif 用户很容易 看出两者的区别,但这种模拟已经足够实用。也可给合使用 :tearoff 命令和 hidden-menus ,来创建不会在主菜单栏中出现的浮动菜单。 5.2 创建新菜单 creating-menus :me :menu :noreme :noremenu E330 E327 E331 E336 E333 E328 E329 E337 E792 要创建新菜单项,可用 ":menu" 命令系列。它与 ":map" 命令系列非常相似 (见 map-modes ),区别是首个参数是菜单项名称。使用格式为由 '.' 分隔的菜单或子菜单 的路径,例如: :menu File.Save :w<CR> :inoremenu File.Save <C-O>:w<CR> :menu Edit.Big\ Changes.Delete\ All\ Spaces :%s/[ ^I]//g<CR> 示例中的最后一行会在菜单栏创建新菜单项 "Edit",在其上点击鼠标键时,会弹出菜 单,菜单中会包含 "Big Changes" 子菜单,子菜单中又包含 "Delete All Spaces" 项。 选择该项时,会执行指定操作。 要在终端模式下创建菜单,应使用 :tlmenu 而不是 :tmenu ,因为 :tmenu 已被用 于定义菜单的工具提示,所以命名规则和键盘映射 ( :tmap ) 略有不同。见 terminal-typing 。 菜单名称里可用的特殊字符: menu-shortcut & 下一个字符被用作快捷键。要确保该快捷键在所属的 (子) 菜单里只使 用一次。要插入按本义出现的 "&",可用 "&&"。 menu-text <Tab> 用于分隔菜单名和右对齐文本。右侧文本通常用于显示对应的快捷键。 为了方便起见,也可以使用文本 "<Tab>"。如果使用真正的制表符,记 得在前面加上反斜杠! 示例: :amenu &File.&Open<Tab>:e :browse e<CR> [按文本直接输入] 要访问该菜单项,可用快捷键 Alt + F 再加 O。菜单的第二部分被显示为 "Open :e"。其中的 ":e" 被右对齐,而 "O" 带下划线,指示这是访问该菜单项的快 捷键。 :am :amenu :an :anoremenu ":amenu" 命令可以用来一次性在除终端模式以外的所有模式下定义菜单项。要使该命令 能够正确工作,在有些模式下,会自动在前后插入字符: 模式 前面插入 后面附加 普通 不需要 不需要 可视 <C-C> <C-\><C-G> 插入 <C-\><C-O> 命令行 <C-C> <C-\><C-G> 等待操作符 <C-C> <C-\><C-G> 附加 CTRL-\ CTRL-G 是为了能在置位 'insertmode' 时回到插入模式。 CTRL-\_CTRL-G 示例: :amenu File.Next :next^M 等价于: :nmenu File.Next :next^M :vmenu File.Next ^C:next^M^\^G :imenu File.Next ^\^O:next^M :cmenu File.Next ^C:next^M^\^G :omenu File.Next ^C:next^M^\^G 小心: 在插入模式下,由于使用了 CTRL-O,本命令只适用于执行单个普通模式命令。如 果需要执行两个或多个命令,必须使用 ":imenu" 命令。要在任何模式下都能正确插入文 本,可在本命令中使用表达式寄存器: :amenu Insert.foobar "='foobar'<CR>P 特殊文本 <Cmd> 会启动 "命令菜单",可以直接执行命令而不用先切换模式。原来要用 ":...<CR>" 的地方,现在可用 "<Cmd>...<CR>" 代替。详见 <Cmd> 。例如: anoremenu File.Next <Cmd>next<CR> 注意 这里适用 'cpoptions' 里的 '<' 和 'k' 标志位 (包含时,不识别 <> 记法和原始 键盘代码)。 注意 在命令行模式下,<Esc> 会执行命令,这与映射中的行为一致。这是为了保持和 Vi 的兼容。要退出命令行模式而不执行,可用 CTRL-C :nme :nmenu :nnoreme :nnoremenu :nunme :nunmenu "n" 开始的菜单命令用于普通模式。 mapmode-n :ome :omenu :onoreme :onoremenu :ounme :ounmenu "o" 开始的菜单命令用于操作符等待模式。 mapmode-o :vme :vmenu :vnoreme :vnoremenu :vunme :vunmenu "v" 开始的菜单命令用于可视模式。 mapmode-v :xme :xmenu :xnoreme :xnoremenu :xunme :xunmenu "x" 开始的菜单命令用于可视和选择模式。 mapmode-x :sme :smenu :snoreme :snoremenu :sunme :sunmenu "s" 开始的菜单命令用于选择模式。 mapmode-s :ime :imenu :inoreme :inoremenu :iunme :iunmenu "i" 开始的菜单命令用于插入模式。 mapmode-i :cme :cmenu :cnoreme :cnoremenu :cunme :cunmenu "c" 开始的菜单命令用于命令行模式。 mapmode-c :tlm :tlmenu :tln :tlnoremenu :tlu :tlunmenu "tl" 开始的菜单命令用于终端模式。 mapmode-t (译者注: 和 :map:map! 一样,`:menu ` 和 :menu! 分别代表其定义的菜 单命令用于普通、可视、选择和操作符等待模式 (即 nvo) 以及插入和命令行模式 (即 ic),具体可见 map-table ) :menu-<silent> :menu-silent 要定义执行时不在命令行上回显的菜单项,可以添加 "<silent>" 作为命令的首个参数。 例如: :menu <silent> Settings.Ignore\ case :set ic<CR> 使用该菜单项时,不会在命令行上回显 ":set ic"。但是执行命令时仍然会回显消息。要 把那些消息也去掉,可在执行的命令前加上 ":silent": :menu <silent> Search.Header :exe ":silent normal /Header\r"<CR> "<silent>" 也可以出现 (但只能出现) 在 "<special>" 或 "<script>" 之后。 :menu-<special> :menu-special 通过在定义菜单时添加 <special> 参数,可以在任何情况下都能使用 <> 记法表示特殊 键,而不受 'cpoptions' 里是否包含 "<" 标志位的影响。这可用于避免因修改 'cpoptions' 而带来的副作用。例如: :menu <special> Search.Header /Header<CR> "<special>" 必须是首个参数,或出现 (但只能出现) 在 "<silent>" 或 "<script>" 之 后。 :menu-<script> :menu-script 菜单的命令部分里会检查映射。如果不想如此。可用 ":noremenu" 命令 (或用于特定模 式的相应命令变体)。 如果需要使用局部于脚本的映射,可以添加 "<script>" 作为 ":menu" 的首个或紧跟在 "<silent>" 或 "<special>" 之后的参数。 menu-priority 可以为菜单指定优先级。高优先级的菜单会出现在更右侧。":menu" 命令之前的数值前缀 可用于指定该菜单的优先级。例如: :80menu Buffer.next :bn<CR> 缺省菜单使用如下优先级: 文件 10 编辑 20 工具 40 语法 50 缓冲区 60 窗口 70 帮助 9999 省略或者给出的优先级为零时,默认使用优先级 500。 弹出菜单不使用优先级。 如果系统支持 (Motif 和 GTK+),帮助菜单会出现在菜单栏的最右侧。GTK+ 2 和 3 版本 已经不再提供此支持,因为当今的界面设计风格已不再鼓励右对齐帮助菜单。 可以使用超过 9999 的优先级,使菜单出现在帮助菜单之后。不过,这属于非标准用法, 并不鼓励。可能的最高优先级约为 32000。最低为 1。 sub-menu-priority 优先级机制也可用于定位子菜单项。在这种情况下,优先级通过出现在菜单名前、由句号 分隔的数值列表来指定: :menu 80.500 Buffer.next :bn<CR> 只有在希望子菜单项不出现在默认位置时,才需要指定优先级。例如,要将某个子菜单项 放在其它项目之前: :menu 80.100 Buffer.first :brew<CR> 也可用于将某个子菜单项放在其他项目之后,并期待其后出现的使用缺省优先级的项目会 出现在该子菜单项之前: :menu 80.900 Buffer.last :blast<CR> 如果省略一个数值,默认使用优先级 500: :menu .900 myMenu.test :echo "text"<CR> 菜单的优先级只在创建新菜单时使用。一旦菜单已经存在 (例如在其他模式下已定义), 优先级不会再改变。因此,菜单仅在首次定义时才需要指定优先级。 弹出菜单是个例外。每种模式下 (普通、操作符等待、可视、插入、命令行) 都会有自己 独立的菜单。而每种模式下菜单的顺序可以不同。这与菜单栏不同,那里所有模式下都使 用相同顺序。 注意: 子菜单优先级目前并非在所有版本的 GUI 版本中都可用。 menu-separator E332 可以用特殊项目来分隔菜单项,它会在项目间插入额外空间。不同系统上,这种分隔线可 能显示为实线或虚线。这些项目必须以 '-' 开始和结尾。中间使用一个唯一名字。和普 通菜单项一样,也可以指定优先级。例如: :menu Example.item1 :完成一些操作 :menu Example.-Sep- : :menu Example.item2 :完成一些其他操作 注意 这种分隔符的菜单定义也需要提供右侧的命令。但内容无关紧要,因为该项目永远 不可选。简单用单个冒号作为命令就可以了。 gui-toolbar 目前,只有 Win32、Motif、GTK+ (X11) 和 Photon GUI 提供工具栏。在适当的时候,其 它 GUI 也会考虑开放这一功能。缺省工具栏在 menu.vim 里定义。 'guioptions' 里的 'T' 字母控制工具栏是否显示。可以同时显示菜单和工具栏,也可只 显示其中之一,甚至两者都关闭。 工具栏外观由 'toolbar' 选项控制。可以选择显示图像、文本或者两者兼有。 toolbar-icon 工具栏被定义为一个特殊的菜单,名为 ToolBar。它只有一层结构。Vim 会按照以下规则 来解释工具栏菜单中的各个项目: 1) 给出 "icon=" 参数时,使用该名字指定的文件作为按钮图像。此文件可以给出完整 路径,也可以只给出不含路径的文件名。后者会在 'runtimepath' 中的 "bitmaps" 目录里搜索,和以下第三点类似。例如: :amenu icon=/usr/local/pixmaps/foo_icon.xpm ToolBar.Foo :echo "Foo"<CR> :amenu icon=FooIcon ToolBar.Foo :echo "Foo"<CR> 注意在第一个例子中,完整路径需要提供扩展名,而第二个例子则不需要。 如果该文件无法打开,才会继续尝试以下步骤寻找按钮图像。 文件名里的空格必须用反斜杠转义。 菜单优先级必须在 icon 参数 之后 给出: :amenu icon=foo 1.42 ToolBar.Foo :echo "42!"<CR> 2) 菜单名为 'BuiltIn##' 的项目 (其中 ## 为数值) 会用于指定 Vim 第 ## 个内建的 位图作为按钮图像。目前提供 31 个内建位图,编号从 0 到 30。覆盖了大多数常见 的编辑操作 builtin-tools :amenu ToolBar.BuiltIn22 :call SearchNext("back")<CR> 3) 对于其他菜单名,会在 'runtimepath' 中的 "bitmaps" 里搜索首个对应该菜单名的 位图文件。如果找到,使用该位图文件作为按钮图像。注意 具体的文件名取决于操 作系统: 例如,在 Win32 上,命令 :amenu ToolBar.Hello :echo "hello"<CR> 会找到文件 'hello.bmp'。在 GTK+/X11 上则是 'Hello.xpm'。在 GTK+ 2 上则会依 序查找 'Hello.png'、'Hello.xpm' 和 'Hello.bmp',并使用最先找到的文件。 在 MS-Windows 和 GTK+ 2 上,位图会被缩放到合适的按钮大小。在 MS-Windows 上,建议使用 18x18 像素的位图。 在 MS-Windows 上,位图必须使用 16 色的标准调色板。浅灰色像素会被替换为窗口 框架颜色,而深灰色像素会被替换为窗口阴影颜色。其他系统可能会支持更多颜色。 4) 如果仍然找不到可用位图,Vim 会在内建名列表里查找菜单名。所有内建按钮图像都 提供了名字。 因此,如果没有 open.bmp 的话,命令 :amenu ToolBar.Open :e 会显示内建的 "打开文件" 按钮图标。 要查看所有的内建名,可见 menu.vim。 5) 如果以上都不行,就显示一个可用的空白按钮。 builtin-tools 号 名字 正常定义的操作 00 New 打开新窗口 01 Open 在当前窗口,打开文件用于浏览 02 Save 将缓冲区文本写回文件 03 Undo 撤销上次改变 04 Redo 重做上次被撤销的改变 05 Cut 删除选中文本,同时复制该文本到剪贴板 06 Copy 复制选中文本到剪贴板 07 Paste 从剪贴板粘贴文本 08 Print 打印当前缓冲区 09 Help 打开缓冲区,用于显示 Vim 的内建帮助 10 Find 开始搜索命令 11 SaveAll 把所有已修改的缓冲区文本写回文件 12 SaveSesn 把当前状态写入一个会话文件 13 NewSesn 创建一个新的会话文件 14 LoadSesn 载入会话文件 15 RunScript 浏览并选择文件,作为 Vim 脚本执行 16 Replace 弹出替代对话框 17 WinClose 关闭当前窗口 18 WinMax 使当前窗口尽可能显示更多行 19 WinMin 使当前窗口尽可能显示更少行 20 WinSplit (水平) 分割当前窗口 21 Shell 启动外壳 22 FindPrev 反向重复上次搜索 23 FindNext 正向重复上次搜索 24 FindHelp 提示关键字,并搜索其相关帮助 25 Make 运行 make,并跳到其首个错误位置 26 TagJump 跳转至光标所在的标签 27 RunCtags 运行 ctags,为当前目录下的文件生成标签文件 28 WinVSplit 垂直分割当前窗口 29 WinMaxWidth 使当前窗口尽可能显示更多列 30 WinMinWidth 使当前窗口尽可能显示更少列 hidden-menus win32-hidden-menus 在 Win32 和 GTK+ GUI 中,以 ']' 开头的菜单名表示该菜单不会显示在主菜单栏中。必 须使用 :popup 或者 :tearoff 命令来显示隐藏菜单。 window-toolbar WinBar 每个窗口都可有本地工具条。工具条占用窗口的首行,因而会减少一行文本可用空间。工 具条项目必须以 "WinBar" 开头。 工具条只能使用文本。不过,通过使用 Unicode 特殊字符,可使项目看上去类似图标。 如果无法将全部项目安放于一行,超出部分的后几个项目将无法使用。因为工具条不会自 动回绕。 备注 Vim 执行工具条命令时可能处于任何模式。应使用普通模式定义,这样执行时不会 切换当前模式。例如,如果当前窗口处于可视模式,而菜单命令没有主动改变模式的话, Vim 会继续留在可视模式。最好采用 :nnoremenu 形式来避免副作用。 用于调试会话的工具条示例: nnoremenu 1.10 WinBar.Step :Step<CR> nnoremenu 1.20 WinBar.Next :Next<CR> nnoremenu 1.30 WinBar.Finish :Finish<CR> nnoremenu 1.40 WinBar.Cont :Continue<CR> hl-ToolbarLine hl-ToolbarButton 窗口工具条使用 ToolbarLine 和 ToolbarButton 高亮组。 分割窗口时,原窗口的工具条不会被复制到新窗口。 popup-menu 在 Win32、GTK+、Motif 和 Photon GUI 中,可以定义特殊菜单 "PopUp"。'mousemodel' 设为 popup 或者 popup_setpos 时,点击鼠标右键会显示该菜单。 示例: nnoremenu 1.40 PopUp.&Paste "+gP menu PopUp 5.3 显示菜单如何被映射 showing-menus 要查看现有菜单的映射情况,可在 menu 命令系列之后只使用单个参数 (用法和 ":map" 命令类似)。如果指定的菜单名是子菜单,会显示该子菜单以下的完整层次结构。如果 :menu 后面不给出任何参数,会显示对应模式下的 所有 菜单项 (例如, :cmenu 会 显示所有命令行模式下的菜单)。 列表中,右侧命令部分之前显示的特殊字符含义如下: * 菜单使用 "nore" 定义,禁止重映射。 & 菜单定义时使用了 "<script>",仅允许脚本局部的重映射。 s 菜单定义时使用了 "<silent>",触发时不会显示映射内容。 - 菜单被禁用。 注意 在 menu 命令后要输入菜单名时,可按 <Tab> 来补全菜单项目。 菜单列出时不能被更改。 E1310 这种情况通常不会发生,但可能出现在定时器回调里定义菜单的同时,用户正在显示菜单 并触发 more-prompt 等特定情况。 5.4 执行菜单 execute-menus :em :emenu E334 E335 :[range]em[enu] {menu} 从命令行上执行 {menu} 菜单。缺省执行普通模式下 的菜单。但给出行范围 [range] 时,会执行可视模 式下的菜单。 如果调用来自 <c-o> ( i_CTRL-O ),则会执行插入 模式下的菜单。例如: :emenu File.Exit :[range]em[enu] {mode} {menu} 同上,但显式执行 {mode} 指定模式下的菜单: 'n': :nmenu 普通模式 'v': :vmenu 可视模式 's': :smenu 选择模式 'o': :omenu 操作符等待模式 't': :tlmenu 终端模式 'i': :imenu 插入模式 'c': :cmenu 命令行模式 如果控制台版本的 Vim 在编译时定义了 WANT_MENU (译者注: 原文如此,该宏定义已废 弃),可用 :emenu 来访问 GUI 模式中常用的菜单项目。同时,'wildmenu' 提供了与 之配合良好的命令行补全选项。示例可见 console-menus 。 如果使用 '<、'> 来指定行范围 [range],则使用前次可视区域范围来执行菜单命令。 5.5 删除菜单 delete-menus :unme :unmenu :aun :aunmenu 要删除一个菜单项或者整个子菜单,可用 umenu 命令系列,和 unmap 命令类似。 例如: :unmenu! Edit.Paste 会删除插入和命令行模式下的 Edit 菜单的 Paste 项。 注意 在 umenu 命令后要输入菜单名时,可按 <Tab> 来补全菜单项目。 要删除所有菜单,可用: :unmenu-all :unmenu * " 删除普通和可视模式下的所有菜单 :unmenu! * " 删除插入和命令行模式下的所有菜单 :aunmenu * " 删除除了终端模式以外的所有模式下的所有菜单 :tlunmenu * " 删除终端模式下的所有菜单 如果想隐藏菜单栏: :set guioptions-=m 5.6 屏蔽菜单 disable-menus :menu-disable :menu-enable 如果不想永久删除某个菜单,但想暂时屏蔽它,可在 :menu 命令里使用 "enable" 或 "disable" 关键字。例如: :menu disable &File.&Open\.\.\. :amenu enable * :amenu disable &Tools.* 和其它 menu 命令一样,"enable" 和 "disable" 关键字只作用于指定的模式。注意 "&" 等特殊字符也需要被包含,以便翻译时可以找到准确的菜单名。参数是 "*" 时,会影响 所有菜单项。否则,只会影响指定的菜单及其下的所有子菜单 (如有)。 5.7 菜单示例 menu-examples 这里是一个如何用 menu 命令添加菜单项的例子。此例为光标下的关键字增加菜单项,在 插入模式下插入该关键字。定义时使用了寄存器 "z"。 :nmenu Words.Add\ Var wb"zye:menu! Words.<C-R>z <C-R>z<CR> :nmenu Words.Remove\ Var wb"zye:unmenu! Words.<C-R>z<CR> :vmenu Words.Add\ Var "zy:menu! Words.<C-R>z <C-R>z <CR> :vmenu Words.Remove\ Var "zy:unmenu! Words.<C-R>z<CR> :imenu Words.Add\ Var <Esc>wb"zye:menu! Words.<C-R>z <C-R>z<CR>a :imenu Words.Remove\ Var <Esc>wb"zye:unmenu! Words.<C-R>z<CR>a (这里右侧的命令部分使用了 <> 记法,可以复制/粘贴此处文本来测试这些映射,也可 将这些行添加到 gvimrc 文件中;"<C-R>" 代表 CTRL-R,"<CR>" 代表 <CR> 键。 <> ) tooltips menu-tips 5.8 工具提示 (Tooltips) 和菜单提示 见用户手册的 42.4 一节。 :tmenu :tm :tm[enu] {menupath} {rhs} 为菜单或者工具定义提示。 {仅存在于 X11 和 Win32 GUI} :tm[enu] [menupath] 列出菜单提示。{仅存在于 X11 和 Win32 GUI} :tunmenu :tu :tu[nmenu] {menupath} 删除一项菜单或者工具提示。 {仅存在于 X11 和 Win32 GUI} 备注: 要创建终端模式下的菜单,可用 :tlmenu 而不是本命令。 为菜单项定义提示后,当鼠标移到该项目上时,命令行区域会显示相应提示,就像标准 Windows 菜单在状态栏显示提示一样 (除非 Vim 当前处于命令行模式,此时当然不会显 示任何提示)。 为工具栏项目定义提示后,当鼠标移到该按钮上时,会以标准的工具提示形式显示。要改 变提示的颜色,可用 hl-Tooltip 高亮组。 可为每个菜单项目单独定义 "提示"。例如,如果定义的菜单项是: :amenu MyMenu.Hello :echo "Hello"<CR> 可以这样定义提示: :tmenu MyMenu.Hello Displays a greeting. 如果要删除提示,可用: :tunmenu MyMenu.Hello 目前工具提示仅在 X11 和 Win32 GUI 中受到支持。不过,在不久的将来,其他 GUI 平 台也可能会支持此功能。 ":tmenu" 菜单和其它 menu 命令的用法一致,使用相同的参数。":tunmenu" 则会删除已 存在的菜单提示,用法也和其他的 umenu 命令一致。 如果菜单项目不再有效 (也就是它在所有模式下的定义都被删除),Vim 会自动删除菜单 对应的提示信息 (包括提示项本身)。这意味着使用 :aunmenu 会彻底删除整个菜单项 - 包括也不再需要额外执行 :tunmenu 。 5.9 弹出任意菜单 在 Win32 和 GTK+ GUI 里,可在光标位置上弹出任意菜单。这和 PopUp 菜单类似,但可 弹出任何菜单树。 该命令仅为后向兼容而保留,不鼓励使用。因为它的行为很不直观。 :popup :popu :popu[p] {name} 弹出名为 {name} 的菜单。该菜单必须至少包含一项 子项,但不一定需要在菜单栏上显示 (见 hidden-menus )。 {仅在 Win32 和 GTK GUI 或终端上有效} :popu[p]! {name} 同上,但使用鼠标指针位置,而非光标位置。 在终端环境中,这里指的是鼠标最后一次已知的位 置,通常是最近一次点击或释放的位置 (不受鼠标移 动的影响)。 示例: :popup File 会在文本光标位置 (使用 ! 时则为鼠标指针位置) 处弹出 "File" 菜单 (如有)。 :amenu ]Toolbar.Make :make<CR> :popup ]Toolbar 会创建一个不在主菜单栏上显示的弹出菜单。 注意 在 GUI 里, :popup 命令会立即返回,不会等待用户作出选择。而在终端上,该 命令会等待用户完成选择再返回。 注意 ']' 开头的菜单不会被显示,见 hidden-menus

6. 字体

本小节描述与字体相关的选项。 GUIFONT gui-font 'guifont' 选项用于指定 Vim 使用的字体。最简单形式是单个字体名。也可为逗号分隔 的字体名列表。Vim 会使用其中首个可用的字体。如果没有任何可用字体,会报错。 在支持 'guifontset' 的系统上 (主要是 X11),'guifontset' 非空时不会使用 'guifont'。见 xfontset注意: 对 GTK GUI 而言,即使字体名不合法也不会报错,GTK 总是选择并使用列表中的 首个字体。这是因为 GTK GUI 并不会明确识别字体名,而是将其作为模式,用于在可选 字体中寻找最佳匹配,从这个意义上,匹配永远不会失败。字符名即使不合法也没关系, 因为除了名字以外,GTK 也会利用字体的其他属性来完成匹配。 忽略逗号后的空格。如果字体名本身包含逗号,需要在逗号前加上反斜杠。设置本选项 时,在空格和反斜杠前也需加上额外的反斜杠进行转义。另见 option-backslash 。比 如: :set guifont=Screen15,\ 7x13,font\\,with\\,commas Vim 会先查找字体 "Screen15",如果不可用,再查找 "7x13",最后尝试 "font,with,commas"。 如果未能成功载入任何字体,Vim 会保持原有设置不变。如果给出空字体列表,Vim 会试 图使用其他资源设置 (对 X 而言,会寻找 Vim.font 资源),最后,Vim 会使用总是可用 的内建缺省值 (如 X 使用的缺省值为 "7x13")。选项指定的字体必须对应 "正常" 字 体。Vim 会试图找到与之相应的粗体和斜体字体。 对于 Win32、GTK、Motif、Mac OS 和 Photon: :set guifont=* 会给出字体请求对话框,从中可以选择用户所需的字体。 字体名取决于具体的 GUI。 setting-guifont 提供一个为不同系统设置 'guifont' 的 示例。 对于 GTK+ 2 和 3 GUI,其字体名形如: :set guifont=Andale\ Mono\ 11 这样就可以了。不使用 XLFD (X 逻辑字体描述)。有报告称,对于中文字体,可以采用如 下设置: if has("gui_gtk2") set guifont=Bitstream\ Vera\ Sans\ Mono\ 12,Fixed\ 12 set guifontwide=Microsoft\ Yahei\ 12,WenQuanYi\ Zen\ Hei\ 12 endif (GTK+ 3 GUI 里,请把 gui_gtk2 换成 gui_gtk3) Mac OSX 上,可用: :set guifont=Monaco:h10 等宽字体 E236 注意 字体必须是等宽字体 (所有字符采用相同宽度)。GTK 是个例外: 它可以接受任意字 体,不过为了最佳视觉效果,仍建议使用等宽字体。 对于 X11,要预览字体的外观,可用 "xfontsel" 程序。"xlsfonts" 程序会给出所有可 用字体的列表。 对于 Win32 GUI E244 E245 - 字体名中接受以下附加选项 (选项间用 ':' 分隔): hXX - 高度为 XX (点 (point),可为浮点数) wXX - 宽度为 XX (点 (point),可为浮点数) WXX - 权重为 XX (见以下关于权重的备注) b - 使用粗体。等价于权重设为 700 i - 使用斜体 u - 使用下划线 s - 使用删除线 cXX - 使用字符集 XX。合法的字符集是: ANSI、ARABIC、BALTIC、 CHINESEBIG5、DEFAULT、EASTEUROPE、GB2312、GREEK、HANGEUL、 HEBREW、JOHAB、MAC、OEM、RUSSIAN、SHIFTJIS、SYMBOL、THAI、 TURKISH 和 VIETNAMESE。一般应使用 "cDEFAULT"。 qXX - 质量值 XX。合法的质量名为: PROOF、DRAFT、ANTIALIASED、 NONANTIALIASED、CLEARTYPE 和 DEFAULT。一般会使用 "qDEFAULT"。 在老版操作系统上,部分质量值不被支持。 - '_' 可以代替空格,这样就无须用反斜杠转义空格。 例如: :set guifont=courier_new:h12:w5:b:cRUSSIAN :set guifont=Andale_Mono:h7.5:w4.5 另见 font-sizes 。 关于权重的 备注: 不同字体通常提供不同权重。Windows 上,"正常" 权重值为 400,查 找字体时如果权重省略,会默认使用该值。和字体名比较,Windows 在匹配字体时更看重 权重,这意味着,即使指定了 Light 或 ExtraLight 的变体版本,实际仍然可能会使用 Book 或 Medium 变体版本,如果遇到字体被替换为更粗的版本,可以尝试显式设置较低 的权重值,以减少发生这种意外替换的可能性。 GUIFONTWIDE gui-fontwide 非空时,'guifontwide' 指定用于双宽字符的字体列表,由逗号分隔。Vim 会使用其中首 个可用的字体。 注意: 这些字体的宽度必须为 'guifont' 指定字体的两倍,且高度应保持一致。否则, 文本绘制会出现异常。 在 GTK+ 以外的所有 GUI 版本里: 仅当 'encoding' 设置为 "utf-8",且 'guifontset' 为空或无效时,才会启用 'guifontwide'。 已设置 'guifont' 并且其中包含可用字体,而 'guifontwide' 为空时,Vim 会试图自动 查找对应的双宽字体,并据此设置 'guifontwide'。 仅限于 GTK+ GUI: guifontwide_gtk 即使 'encoding' 未设置为 "utf-8",只要 'guifontwide' 已设置并有效,也会总为双 宽字符应用该选项。 Vim 不会自动为 'guifontwide' 查找合适的值。不过,当 'guifontwide' 为空时, Pango/Xft 会为 'guifont' 中缺失的字符自动选择字体。所以,除非对 Pango/Xft 的选 择不满意,一般无需手动设置 'guifontwide'。 仅限于 Windows +multibyte: guifontwide_win_mbyte 如果已设置且有效,IME 会优先使用 'guifontwide' 而不是 'guifont'

7. 附加 gui-extras

这一节描述和 GUI 相关的其他特性。 - 在 GUI 里,按 Esc 键之后无需等待一秒,因为键码不会以 <Esc> 开头。 - 在 GUI 里,输入 ^V 后跟一个特殊键会插入 "<Key>" 形式的字符串,因为内部终端代 码对 GUI 没有意义。按下修饰符时,则会插入 "<Modifiers-Key>"。 - 在 GUI 里,映射中可以将修饰符 SHIFT、CTRL 和 ALT (或 META) 和特殊键或鼠标事 件组合使用。 例如 :map <M-LeftDrag> <LeftDrag> - 在 GUI 里,映射等命令允许部分普通键与修饰符组合使用,这些键包括 <Space><Tab><NL><CR><Esc>。 - 在 Vim 脚本里,要检查是否正在使用 GUI,可用: if has("gui_running") echo "是的,我们有 GUI" else echo "无聊的老式终端" endif setting-guifont - 在多个系统上使用同一个 vimrc 文件时,可以如此为不同类型的 GUI 分别设置专用选 项: if has("gui_running") if has("gui_gtk") :set guifont=Luxi\ Mono\ 12 elseif has("x11") :set guifont=*-lucidatypewriter-medium-r-normal-*-*-180-*-*-m-*-* elseif has("gui_win32") :set guifont=Luxi_Mono:h12:cANSI endif endif 对于日文字体,推荐使用 MS Mincho。相关信息见: https://learn.microsoft.com/en-us/typography/font-list/ms-mincho 该字体通常随 Windows 系统一并发布。

8. 外壳命令 gui-shell

对于 X11 GUI,外部命令会在 gvim 窗口里执行。见 gui-pty警告: 在 X11 GUI 中执行外部命令并不总是可行。大多数 "普通" 命令,如 "ls"、 "grep"、"make" 等都可以正常运行。但需要智能终端的命令,如 "less" 和 "ispell" 等,则可能无法使用。有些命令甚至可能挂起,此时只能通过另一个终端手动终止相应进 程。所以,请谨慎使用。 对于 Win32 GUI,外部命令会在一个单独的窗口里执行。见 gui-shell-win32 。 vim:tw=78:sw=4:ts=8:noet:ft=help:norl: