VIM 参考手册 by Bram Moolenaar
译者: Willis、tocer
终端信息 terminal-info
Vim 使用当前终端信息完成屏幕绘制与按键识别。如果信息有误,会出现屏幕乱码以及按
键无法识别。屏幕操作通过向终端发送字符序列实现。而特殊按键会由终端产生相应字符
序列。这些字符序列都会用终端选项保存,见 terminal-options 。
注意: GUI 版本运行时,此处多数描述不生效。
1. 启动 startup-terminal
2. 终端选项 terminal-options
3. 窗口大小 window-size
4. 低速和快速终端 slow-fast-terminal
5. 使用鼠标 mouse-using
1. 启动 startup-terminal
Vim 启动时,会预设缺省终端类型。Amiga 上是标准 CLI 窗口,MS-Windows 上是 pc 终 端,而 Unix 上则是 ansi 终端。另有若干总是可用的内置终端类型,见下 builtin-terms 。 可用 -T Vim 参数指定终端名。未指定时,Vim 会试图从 TERM 环境变量读取。 termcap terminfo E557 E558 E559 Unix 系统使用 terminfo 数据库或者 termcap 文件。文档中统一称为 "termcap" (终端 能力库)。编译阶段 configure 脚本会在 terminfo 和 termcap 中自动选择。Vim 运行 时可查看 :version 输出,显示 +terminfo 则代表使用 terminfo。另见 xterm-screens 。 非 Unix 系统上,仅当 Vim 编译时定义 TERMCAP 才有效 (译者注: 现已无需如此,此说
明已过时)。
builtin-terms builtin_terms
Vim 自带若干内置终端。从 9.0.0280 补丁开始,各 Vim 版本的内置终端已经统一。
非 GUI 环境下执行 `:set term=xxx` 时,报错信息会列出全部可用内置终端。另见
+builtin_terms 。
编译包含 termcap 支持时,Vim 会同时从外部 termcap 文件和内置 termcap 读取终端
序列。所用终端名两者都有对应条目时,两者都会使用。使用顺序取决于 'ttybuiltin'
选项:
'ttybuiltin' 打开 1: 内置 termcap 2: 外部 termcap
'ttybuiltin' 关闭 1: 外部 termcap 2: 内置 termcap
一处缺失某项终端能力时,会从另一处获取。两者都存在时,则按上述顺序读取。
外部 termcap 文件路径随系统变化,也受环境变量 "TERMCAP" 和 "TERMPATH" 控制。见
"man tgetent"。
终端相关设置 term-dependent-settings
要根据终端名设置选项或映射,建议在 .vimrc 中设置。示例:
if &term == "xterm"
... xterm 特定映射和设置 ...
elseif &term =~ "vt10."
... vt100、vt102 特定映射和设置 ...
endif
raw-terminal-mode
普通编辑时,终端会进入原始 ("raw") 模式。Vim 会依次向终端发送 't_ti'、't_TI'
和 't_ks' 定义的字符序列。正常情况下,这会使终端进入一种 termcap 代码可用的状
态,并启用光标和功能键。
Vim 退出时,终端会恢复为 Vim 启动前的模式。Vim 会依次向终端发送 't_ke'、't_te'
和 't_TE' 定义的字符序列。在 Amiga 上,执行外部命令 (如 !! ) 时终端会短暂切回
普通模式。此时按可显示字符可暂停屏幕输出。按 <BS> 恢复输出。
注意: 't_ti' 非空时,Vim 假定终端会切换到备用屏幕。执行外壳命令或退出 Vim 的行
为会因此略有变化。如果不想如此,可改用 't_TI' 和 't_TE' 追加相应序列 (务必追加
内容,而非覆盖)。
Vim 通过 't_RK' 终端能力项检测终端使用的键盘协议。该序列在 't_TI' 之后发送,但
仅当不繁忙时 (无预输入或待执行命令) 才会进行。这可以避免应答出现在外壳命令中、
或在 Vim 结束后才到达。
xterm-bracketed-paste
设置 't_BE' 选项时,进入原始模式后会向终端发送 't_BE',退出原始模式前则会发送
't_BD'。在此括号粘贴模式下,约定终端在粘贴文本前先发送 't_PS',而粘贴文本结束
后发送 't_PE'。借此 Vim 可以区分粘贴文本和手动键入字符。粘贴文本的处理逻辑等同
于鼠标中键粘贴,即按本义插入,不会当作命令解析。
请 注意: 括号粘贴模式的作用是防止粘贴时带来的副作用 (如 CTRL-C 或 <Esc> 键被解
析),但这不应被视作安全保障,因为不同终端实现可能略有不同。粘贴内容仍应谨慎处
理。
光标位于首列时,粘贴文本会在光标前插入。其他情况下粘贴文本会插入在光标后。这意
味着,无法在首列之后粘贴。不幸的是,Vim 无法提前获知鼠标指针位置,无法在括号粘
贴时规避此限制。
注意 部分场景下 Vim 无法识别括号粘贴,只能获取原始文本。还有部分场景只能获取粘
贴的首个字符,其余丢失 (如 r 命令)。如果出现问题而要关闭括号粘贴模式,可在
.vimrc 里加入:
set t_BE=
设置后,Vim 运行时会向终端发送 't_BD' 以关闭括号粘贴模式。
如果 t_PS 或 t_PE 未设置,不会启用 t_BE 。保证在无法识别粘贴起止转义码
时,不开启括号粘贴模式。
注意: 'esckeys' 选项未开启时也会关闭括号粘贴模式 ('compatible' 选项置位时,隐
含关闭此选项)。
确定终端支持括号粘贴模式但相关选项未自动配置时,可进行手动配置:
if &term =~ "screen"
let &t_BE = "\e[?2004h"
let &t_BD = "\e[?2004l"
exec "set t_PS=\e[200~"
exec "set t_PE=\e[201~"
endif
ncurses 6.4 版本 (2023 年初) 为部分终端新增了 "BE"、"BD"、"PS" 和 "PE" 等
terminfo 项目。已有此版本时,可能无需手动配置。
tmux-integration
在 tmux 内执行 Vim 时如果出现问题,下面给出一些提示。可将不适用的部分注释掉
(效果取决于 tmux 运行所在的终端):
if !has('gui_running') && &term =~ '^\%(screen\|tmux\)'
" 提供更好鼠标支持,见 :help 'ttymouse'
set ttymouse=sgr
" 打开真彩,见 :help xterm-true-color
let &termguicolors = v:true
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
" 打开括号粘贴模式,见 :help xterm-bracketed-paste
let &t_BE = "\<Esc>[?2004h"
let &t_BD = "\<Esc>[?2004l"
let &t_PS = "\<Esc>[200~"
let &t_PE = "\<Esc>[201~"
" 打开焦点事件跟踪,见 :help xterm-focus-event
let &t_fe = "\<Esc>[?1004h"
let &t_fd = "\<Esc>[?1004l"
execute "set <FocusGained>=\<Esc>[I"
execute "set <FocusLost>=\<Esc>[O"
" 打开带修饰符光标键,见 :help arrow_modifiers
execute "silent! set <xUp>=\<Esc>[@;*A"
execute "silent! set <xDown>=\<Esc>[@;*B"
execute "silent! set <xRight>=\<Esc>[@;*C"
execute "silent! set <xLeft>=\<Esc>[@;*D"
endif
cs7-problem
注意: 如果启动 Vim 之后修改终端设置,可能造成设置组合非法。有报告在 Solaris
2.5 上,启动 Vim 后使用 "stty cs8 parenb",Vim 退出时会错误恢复为
"stty cs7 parenb"。可改用 "stty cs8 -parenb -istrip",即可正确恢复。
部分终端能力项存在缺陷,发送 't_ks' 后,光标键输出的序列和终端能力库的定义不一
致。解决方法是,将 't_ks' (以及 't_ke') 设为空值。这必须在初始阶段设置 (见
initialization ),否则为时太晚。
有些终端能力项则假设最高位为零。例如: Amiga 上,光标上移条目可能会写为
":ku=\E[A:"。但 Amiga 实际发送 "\233A"。最高位总为零 (如在串口使用 Amiga) 的
场景,没有问题。但如果光标键失效,应将该条目改为 ":ku=\233A:"。
有些终端能力项使用 ":ku=\E[A:"。但 Amiga 实际发送 "\233A"。输出时 "\E[" 和
"\233" 通常等价,但输入时二者并不等同。要修正,需要修改终端能力项,或用 :set
命令修正键码 (译者注: 这段内容略有重复,但原文如此)。
众多光标键以 <Esc> 开头。Vim 需要判断这是单独按下 <Esc> 键,还是光标键序列的开
头。为此,Vim 会等待下一个字符到达。一秒后无后续字符,则判定为单独 <Esc>。在很
慢的系统上此机制可能失效,造成光标键偶发失灵。如果遇到此问题,可复位 'timeout'
选项。此时 Vim 会在接收到 <Esc> 后一直等待后续字符。要输入单独 <Esc>,需要按键
两次。复位 'esckeys' 选项可在插入模式下避免按键两次的问题,但代价是插入模式下
无法使用光标和功能键。
Amiga 上,仅当终端名为 "amiga" 或 "builtin_amiga" 时,才会启用窗口大小变化检
测。
部分终端的光标键编码容易产生歧义。televideo 925 就是一例。左光标键发送
CTRL-H。这会导致无法区分退格和左光标键。为规避此问题,Vim 禁止将 CTRL-H 识别为
左光标键。
vt100-cursor-keys xterm-cursor-keys
其他终端 (如 vt100 和 xterm) 的光标键会发送 <Esc>OA、<Esc>OB 等序列。但这些都
是插入模式下合法的命令: 停止插入,在上方新开一行,插入字符 'A'、'B' 等。Vim 可
能误将该键序列识别为光标键动作,而非执行以上命令。要避免这个问题,使两种场景都
能正常工作,需要以下设置:
:set notimeout " 映射不检查超时
:set ttimeout " 终端键码检查超时
:set timeoutlen=100 " 100 毫秒超时
该设置要求键码在 100 毫秒内完整送达,从而能识别其为光标键。手动输入一般达不到
这种速度,所以即使对应相同的键序列,也会正确识别为独立输入的若干命令。
vt100-function-keys xterm-function-keys
xterm 可用两种模式发送功能键 F1 到 F4: vt100 兼容模式或非兼容模式。Vim 未必能
确定 xterm 具体使用哪种模式发送,因此同时识别两种模式。<Home> 和 <End> 键也有
类似情况。
普通模式 vt100 模式
<F1> t_k1 <Esc>[11~ <xF1> <Esc>OP <xF1>-xterm
<F2> t_k2 <Esc>[12~ <xF2> <Esc>OQ <xF2>-xterm
<F3> t_k3 <Esc>[13~ <xF3> <Esc>OR <xF3>-xterm
<F4> t_k4 <Esc>[14~ <xF4> <Esc>OS <xF4>-xterm
<Home> t_kh <Esc>[7~ <xHome> <Esc>OH <xHome>-xterm
<End> t_@7 <Esc>[4~ <xEnd> <Esc>OF <xEnd>-xterm
Vim 启动时,<xF1> 映射到 <F1>,<xF2> 映射到 <F2>,依此类推。默认两类编码效果相
同。对同时支持两种键的终端可单独定义 <xF2> 映射以覆盖缺省映射,可使 <F2> 和
<xF2> 键绑定不同功能。
xterm-shifted-keys
新版 xterm 支持带 Shift 的功能键与特殊按键。Vim 可识别其中大部分。可用
`:set termcap` 来检查支持的按键与对应序列。这类按键大多不存于终端能力库,仅内
置的 builtin_xterm termcap 支持。
xterm-modifier-keys
新版 xterm 支持带 Alt 和 Ctrl 的多数功能键。为免为每个按键对所有 Alt、Ctrl 和
Shift 组合分别指定,终端能力项识别特殊序列后缀: ";*X"。"X" 可为任何字符,常用
'~'。";*" 代表可选修饰符参数。";2" 对应 Shift,";3" 对应 Alt,";5" 对应 Ctrl,
而 ";9" 对应 Meta (与 Alt 不同时)。可组合使用多个修饰符。示例:
:set <F8>=^[[19;*~
:set <Home>=^[[1;*H
(译者注: 例如,<S-M-F8> 键码为 "^[[19;2;9~",而无修饰符的 <Home> 为 "^[[1H")
这类键码不会被其他编码覆盖。防止 xterm 通过 t_RV 获取的编码将其覆盖。
终端能力项的另一特殊序列后缀是 "@;*X"。用于光标键,这类按键编码格式为 "CSI X"
或 "CSI 1 ; 修饰符 X"。所以 "@" 代表 "1" (必须后跟修饰符) 或空。
arrow_modifiers
若干终端模拟器 (alacritty、gnome、konsole 等) 会为带修饰符的光标键发送特殊代
码,但 termcap/terminfo 数据库中没有对应项目。可在 vimrc 里添加相应配置以作补
充。例如,要使 gnome terminal 支持带 Control 的光标键:
if &term =~ 'gnome'
execute "set <xUp>=\<Esc>[@;*A"
execute "set <xDown>=\<Esc>[@;*B"
execute "set <xRight>=\<Esc>[@;*C"
execute "set <xLeft>=\<Esc>[@;*D"
endif
xterm-scroll-region
Sun 及其他平台上 xterm 缺省终端能力项不含滚动区域定义。可在 /etc/termpcap 的
xterm 段添加 ":cs=\E[%i%d;%dr:",即可正常工作。
xterm-end-home-keys
部分系统 (如带 XFree86 3.1.2 的 FreeBSD),<End> 和 <Home> 键发送序列会内含
<Nul> 字符。可在 ~/.Xdefaults 文件里加入以下设置,使按键输出正确键码:
*VT100.Translations: #override \n\
<Key>Home: string("0x1b") string("[7~") \n\
<Key>End: string("0x1b") string("[8~")
xterm-8bit xterm-8-bit
Xterm 可启用 8 位转义序列模式。使用 CSI 代码替代 <Esc>[。其优点是插入模式下可
快速识别 <Esc> 键,不会与特殊按键序列的开头部分混淆。
对于内置终端能力项,'term' 选项值包含 "8bit" 时,会对 termcap 项目、鼠标等自动
调整为 8 位字符设置,通常可将外壳环境变量 $TERM 设为 "xterm-8bit"。Vim 会作相
应调整。
Vim 收到 t_RV 序列 (查询终端版本) 的应答且其以 CSI 开头时,同样会判定终端处
于 8 位模式,并把将所有按健序列调整为 8 位版本。
(译者注: 具体会将 <Esc>[ 转为 <CSI>、<Esc>] 转为 <OSC>、<Esc>O 转为 \0x8f)
xterm-terminfo-entries
曾有一段时间 terminfo 项目不足于描述 Vim 使用的所有功能。而内置 xterm termcap
则具备全部项目,于是很多 xterm 兼容终端会在 $TERM 指定的终端名前加上 "xterm-"
前缀以利用此特性。
但这会引发问题,因为此类终端通常并非与 xterm 完全兼容。2023 年初,terminfo 数
据库新增若干项目,因此不再需要 "xterm" 变通方法就可使用全部功能。相关项目如下
(至今为止):
名字 xterm 值 描述
RV "\033[>c" 查询版本 t_RV
BE "\033[?2004h" 开启括号内粘贴模式 t_BE
BD "\033[?2004l" 关闭括号内粘贴模式 t_BD
PS "\033[200~" 粘贴文本开始 t_PS
PE "\033[201~" 粘贴文本结束 t_PE
XM "\033[?1006;1004;1000%?%p1%{1}%=%th%el%;"
鼠标开启 / 关闭 t_XM
FE "\033[?1004h" 开启焦点事件跟踪 t_fe
FD "\033[?1004l" 关闭焦点事件跟踪 t_fd
"XM" 项目既包含 "1006",打开 SGR 风格鼠标报告 (支持超过 223 列),又包含
"1004",开启焦点报告。
备注: 截至 2023 年,Vim 自身暂不使用 "1004",建议改用 t_fe 和 t_fd 项目独
立开启焦点报告,不与鼠标跟踪绑定,新版 ncurses 也开始使用此做法 (这些项目后续
会加入 terminfo/termcap)。
xterm-kitty kitty-terminal
Kitty 终端是个特例。主要因为其工作方式与绝大多数其他终端不同,设计理念也不试图
兼容任何终端,而是转而规定应用必须适配 Kitty 的工作方式。这导致 Vim 在 Kitty
终端里运行难点很多。有些处理甚至需要专门代码,但为单一终端开特例并非理想做法。
问题之一是其 $TERM 值设为 "xterm-kitty"。Vim 会认为此终端兼容 xterm,可使用内
置 xterm 终端能力项。大量其他终端依赖这一逻辑。但 Kitty 并不完全兼容 xterm。
Kitty 作者建议忽略 "xterm-" 前缀,直接使用其自身的 terminfo 项目。Vim 当前就是
如此处理,不再加载内置 xterm 终端能力项。但仍保留了 t_RV ,否则部分功能会失
效,例如自动将 'ttymouse' 设为 "sgr" (在改用 t_XM 之前)。
kitty 为何将 $TERM 设为 "xterm-kitty" 原因不明,该终端并不真正兼容 xterm。使用
"kitty" 作为终端类型更合适,但使用该名的 terminfo 项目并不被广泛接受。
注意 kitty 键盘协议是完全独立的功能,作 kitty-keyboard-protocol 。
2. 终端选项 terminal-options termcap-options E436
终端选项可像普通选项一样设置。但不会在 `:set all` 中显示。查看需用 `:set termcap`。 可通过设置适当选项单独修改各个控制字符串。示例: :set t_ce=^V^[[K (CTRL-V、<Esc>、[、K)
以下列出所有终端选项。选项名后两个字符对应终端能力项代码。仅有一项代码是必需:
光标移动,'t_cm'。
't_da'、't_db'、't_ms'、't_xs'、't_xn'、't_xo' (译者注: 还有 't_ut') 选项为终
端能力标志位。存在该标志位时,选项值设为 "y"。但任意非空串值都代表标志位置位。
而空串代表标志位复位。't_CS' 不属于终端能力标志位,但其行为也是如此。
输 出 代 码 terminal-output-codes
选项 含义
t_AB 设置背景色 (使用 ANSI 序列) t_AB 't_AB'
t_AF 设置前景色 (使用 ANSI 序列) t_AF 't_AF'
t_AL 增加若干空行 t_AL 't_AL'
t_al 增加一行空行 t_al 't_al'
t_bc 退格字符 t_bc 't_bc'
t_cd 清除到屏幕尾 t_cd 't_cd'
t_ce 清除到行尾 t_ce 't_ce'
t_cl 清空屏幕 t_cl 't_cl'
t_cm 光标移动 (必需!) E437 t_cm 't_cm'
t_Co 颜色数目 t_Co 't_Co'
t_CS 非空时,光标坐标相对于滚动区域 t_CS 't_CS'
t_cs 定义滚动区域 t_cs 't_cs'
t_CV 定义垂直滚动区域 t_CV 't_CV'
t_da 非空时,上方行会向下滚动 t_da 't_da'
t_db 非空时,下方行会向上滚动 t_db 't_db'
t_DL 删除若干行 t_DL 't_DL'
t_dl 删除一行 t_dl 't_dl'
t_fs 结束设置窗口标题 (退出 termcap 状态行) t_fs 't_fs'
t_ke 退出 "小键盘传输" 模式 t_ke 't_ke'
t_ks 进入 "小键盘传输" 模式 t_ks 't_ks'
t_le 光标左移一个字符 t_le 't_le'
t_mb 进入闪烁模式 t_mb 't_mb'
t_md 进入粗体模式 t_md 't_md'
t_me 普通模式 (撤销 t_mr、t_mb、t_md 及颜色) t_me 't_me'
t_mr 进入反显 (反转) 模式 t_mr 't_mr'
t_ms 非空时,可在突出/反转模式下移动光标 t_ms 't_ms'
t_nd 非破坏性空格字符 (光标右移一个字符) t_nd 't_nd'
t_op 恢复原始颜色对 (前景与背景) t_op 't_op'
t_RI 光标右移若干字符 t_RI 't_RI'
t_Sb 设置背景色 (老式) t_Sb 't_Sb'
t_Sf 设置前景色 (老式) t_Sf 't_Sf'
t_se 退出突出模式 t_se 't_se'
t_so 进入突出模式 t_so 't_so'
t_sr 反向滚动 (文本向下滚动一行) t_sr 't_sr'
t_te 退出 "termcap" 模式 t_te 't_te'
t_ti 进入 "termcap" 模式 t_ti 't_ti'
t_ts 开始设置窗口标题 (进入 termcap 状态行) t_ts 't_ts'
t_ue 退出下划模式 t_ue 't_ue'
t_us 进入下划模式 t_us 't_us'
t_ut 非空时,清屏使用当前背景色 t_ut 't_ut'
t_vb 可视响铃 t_vb 't_vb'
t_ve 使光标可见 t_ve 't_ve'
t_vi 使光标隐藏 t_vi 't_vi'
t_vs 使光标 "非常" 可见 (闪烁) t_vs 't_vs'
t_xs 非空时,覆盖写入不清除突出属性 (hpterm) t_xs 't_xs'
t_xn 非空时,屏幕末单元格写入字符不触发滚动 t_xn 't_xn'
t_xo 't_xo'
t_xo 非空时,终端使用 xon/xoff 握手协议,此时 CTRL-S 被流控制占用
(如 vt420 终端),无法用于映射。此标志位仅在 Vim 启动阶段生效
t_ZH 进入斜体模式 t_ZH 't_ZH'
t_ZR 退出斜体模式 t_ZR 't_ZR'
Vim 新增 (无对应标准代码):
t_AU 设置下划线颜色 (使用 ANSI 序列) t_AU 't_AU'
t_Ce 退出下曲 (undercurl) 和各种下划线模式 t_Ce 't_Ce'
t_Cs 进入下曲 (波浪状下划线) 模式 t_Cs 't_Cs'
t_CF 设置备选字体 (使用索引 0 - 10) t_CF 't_CF'
t_Us 进入双下划线模式 t_Us 't_Us'
t_ds 进入点状下划线模式 t_ds 't_ds'
t_Ds 进入虚线下划线模式 t_Ds 't_Ds'
t_Te 退出删除线模式 t_Te 't_Te'
t_Ts 进入删除线模式 t_Ts 't_Ts'
t_IS 开始设置图标文本 t_IS 't_IS'
t_IE 结束设置图标文本 t_IE 't_IE'
t_WP 设置窗口像素坐标 (Y,X) t_WP 't_WP'
t_GP 获取窗口像素坐标 (Y,X) t_GP 't_GP'
t_WS 设置窗口大小 (单元格高度和宽度) t_WS 't_WS'
t_VS 使光标常亮 (无闪烁) t_VS 't_VS'
t_SI 进入插入模式 (条形光标) t_SI 't_SI'
t_SR 进入替换模式 (下划线光标) t_SR 't_SR'
t_EI 退出插入或替换模式 (块形光标) t_EI 't_EI'
光标形状总结可见 termcap-cursor-shape
t_RV 't_RV'
t_RV 查询终端版本字符串 (适用于 xterm 和其他终端模拟器),应答值存于
v:termresponse 。参见 xterm-8bit 'ttymouse' xterm-codes
t_XM 打开/关闭鼠标报告。见 mouse-reporting t_XM 't_XM'
t_RK 查询终端键盘协议状态;在 t_TI 后发送 t_RK 't_RK'
t_u7 't_u7'
t_u7 查询光标位置 (用于 xterm),见 'ambiwidth',值存于 v:term7resp
t_RF 查询终端前景色,值存于 v:termrfgresp t_RF 't_RF'
t_RB 查询终端背景色,值存于 v:termrbgresp t_RB 't_RB'
t_8f 设置终端前景色 RGB xterm-true-color t_8f 't_8f'
t_8b 设置终端背景色 RGB xterm-true-color t_8b 't_8b'
t_8u 设置下划线颜色 (R, G, B) t_8u 't_8u'
t_BE 打开括号粘贴 xterm-bracketed-paste t_BE 't_BE'
t_BD 关闭括号粘贴 xterm-bracketed-paste t_BD 't_BD'
t_SC 开始设置光标颜色 t_SC 't_SC'
t_EC 结束设置光标颜色 t_EC 't_EC'
t_SH 设置光标形状 t_SH 't_SH'
t_RC 查询光标闪烁状态,值存于 v:termblinkresp t_RC 't_RC'
t_RS 查询光标样式,值存于 v:termstyleresp t_RS 't_RS'
t_ST 将窗口标题压入栈 t_ST 't_ST'
t_RT 从栈弹出窗口标题 t_RT 't_RT'
t_Si 将图标文本压入栈 t_Si 't_Si'
t_Ri 从栈弹出图标文本 t_Ri 't_Ri'
t_TE 退出原始 ("raw") 模式 t_TE 't_TE'
t_TI 进入原始 ("raw") 模式 t_TI 't_TI'
t_fe 打开焦点事件跟踪 ( xterm-focus-event ) t_fe 't_fe'
t_fd 关闭焦点事件跟踪 ( xterm-focus-event ) t_fd 't_fd'
t_BS 打开同步更新模式,见 'termsync' t_BS 't_BS'
t_ES 关闭同步更新模式,见 'termsync' t_ES 't_ES'
部分控制码分为起始、中间、结束三段。起始和结束由终端能力项定义,中间为文本内
容。
设置标题文本: t_ts {标题文本} t_fs
设置图标文本: t_IS {图标文本} t_IE
设置光标颜色: t_SC {颜色名} t_EC
t_SH (DECSCUSR 序列) 必须提供一个参数,分别对应:
0、1 或省略 闪烁块状光标
2 块状光标
3 闪烁下划线光标
4 下划线光标
5 闪烁竖线光标
6 竖线光标
仅当收到 t_RV 应答后才会发送 t_RS。Mac OS 上,通过 termresponse 识别出
Terminal.app 时,则不使用 t_RS。
t_BS 和 t_ES 不存储在 termcap 数据库中,而是在 Vim 启动时直接设置为以下缺省值:
t_BS "\033[?2026h"
t_ES "\033[?2026l"
mouse-reporting
许多终端可报告鼠标点击事件,部分还支持鼠标移动和拖曳。Vim 需要获知对应的控制
码。
这由 "XM" terminfo/termcap 项目负责。Vim 另有 'ttymouse' 选项指定鼠标协议。可
用值参见该选项。
"XM" 终端能力项可用时,Vim 用该项来开关鼠标报告。否则,会依赖 'ttymouse' 值决
定。
"XM" 项存在且首个数值为 "1006" 时,'ttymouse' 在尚未设置时会被自动设为 "sgr"。
键 代 码 terminal-key-codes
备注: 尽量使用 <> 形式
选项 名字 含义
t_ku <Up> 上箭头键 t_ku 't_ku'
t_kd <Down> 下箭头键 t_kd 't_kd'
t_kr <Right> 右箭头键 t_kr 't_kr'
t_kl <Left> 左箭头键 t_kl 't_kl'
<xUp> 备用上箭头键 <xUp>
<xDown> 备用下箭头键 <xDown>
<xRight> 备用右箭头键 <xRight>
<xLeft> 备用左箭头键 <xLeft>
<S-Up> Shift+上箭头键
<S-Down> Shift+下箭头键
t_%i <S-Right> Shift+右箭头键 t_%i 't_%i'
t_#4 <S-Left> Shift+左箭头键 t_#4 't_#4'
t_k1 <F1> F1 功能键 t_k1 't_k1'
<xF1> 备用 F1 <xF1>
t_k2 <F2> F2 功能键 <F2> t_k2 't_k2'
<xF2> 备用 F2 <xF2>
t_k3 <F3> F3 功能键 <F3> t_k3 't_k3'
<xF3> 备用 F3 <xF3>
t_k4 <F4> F4 功能键 <F4> t_k4 't_k4'
<xF4> 备用 F4 <xF4>
t_k5 <F5> F5 功能键 <F5> t_k5 't_k5'
t_k6 <F6> F6 功能键 <F6> t_k6 't_k6'
t_k7 <F7> F7 功能键 <F7> t_k7 't_k7'
t_k8 <F8> F8 功能键 <F8> t_k8 't_k8'
t_k9 <F9> F9 功能键 <F9> t_k9 't_k9'
t_k; <F10> F10 功能键 <F10> t_k; 't_k;'
t_F1 <F11> F11 功能键 <F11> t_F1 't_F1'
t_F2 <F12> F12 功能键 <F12> t_F2 't_F2'
t_F3 <F13> F13 功能键 <F13> t_F3 't_F3'
t_F4 <F14> F14 功能键 <F14> t_F4 't_F4'
t_F5 <F15> F15 功能键 <F15> t_F5 't_F5'
t_F6 <F16> F16 功能键 <F16> t_F6 't_F6'
t_F7 <F17> F17 功能键 <F17> t_F7 't_F7'
t_F8 <F18> F18 功能键 <F18> t_F8 't_F8'
t_F9 <F19> F19 功能键 <F19> t_F9 't_F9'
<S-F1> Shift+F1
<S-xF1> 备用 <S-F1> <S-xF1>
<S-F2> Shift+F2 <S-F2>
<S-xF2> 备用 <S-F2> <S-xF2>
<S-F3> Shift+F3 <S-F3>
<S-xF3> 备用 <S-F3> <S-xF3>
<S-F4> Shift+F4 <S-F4>
<S-xF4> 备用 <S-F4> <S-xF4>
<S-F5> Shift+F5 <S-F5>
<S-F6> Shift+F6 <S-F6>
<S-F7> Shift+F7 <S-F7>
<S-F8> Shift+F8 <S-F8>
<S-F9> Shift+F9 <S-F9>
<S-F10> Shift+F10 <S-F10>
<S-F11> Shift+F11 <S-F11>
<S-F12> Shift+F12 <S-F12>
t_%1 <Help> Help 键 t_%1 't_%1'
t_&8 <Undo> Undo 键 t_&8 't_&8'
t_kI <Insert> Ins 键 t_kI 't_kI'
<kInsert> 小键盘 Ins 键
t_kD <Del> Del 键 t_kD 't_kD'
t_kb <BS> 退格键 t_kb 't_kb'
t_kB <S-Tab> Shift+Tab <S-Tab> t_kB 't_kB'
t_kh <Home> Home 键 t_kh 't_kh'
t_#2 <S-Home> Shift+Home <S-Home> t_#2 't_#2'
<xHome> 备用 Home 键 <xHome>
t_@7 <End> End 键 t_@7 't_@7'
t_*7 <S-End> Shift+End <S-End> t_star7 't_star7'
<xEnd> 备用 end 键 <xEnd>
t_kP <PageUp> PgUp 键 t_kP 't_kP'
t_kN <PageDown> PgDn 键 t_kN 't_kN'
t_K1 <kHome> 小键盘 Home 键 t_K1 't_K1'
t_K4 <kEnd> 小键盘 End 键 t_K4 't_K4'
t_K3 <kPageUp> 小键盘 PgUp 键 t_K3 't_K3'
t_K5 <kPageDown> 小键盘 PgDn 键 t_K5 't_K5'
t_K6 <kPlus> 小键盘加号 <kPlus> t_K6 't_K6'
t_K7 <kMinus> 小键盘减号 <kMinus> t_K7 't_K7'
t_K8 <kDivide> 小键盘除号 <kDivide> t_K8 't_K8'
t_K9 <kMultiply> 小键盘乘号 <kMultiply> t_K9 't_K9'
t_KA <kEnter> 小键盘回车键 <kEnter> t_KA 't_KA'
t_KB <kPoint> 小键盘小数点 <kPoint> t_KB 't_KB'
t_KC <k0> 小键盘 0 <k0> t_KC 't_KC'
t_KD <k1> 小键盘 1 <k1> t_KD 't_KD'
t_KE <k2> 小键盘 2 <k2> t_KE 't_KE'
t_KF <k3> 小键盘 3 <k3> t_KF 't_KF'
t_KG <k4> 小键盘 4 <k4> t_KG 't_KG'
t_KH <k5> 小键盘 5 <k5> t_KH 't_KH'
t_KI <k6> 小键盘 6 <k6> t_KI 't_KI'
t_KJ <k7> 小键盘 7 <k7> t_KJ 't_KJ'
t_KK <k8> 小键盘 8 <k8> t_KK 't_KK'
t_KL <k9> 小键盘 9 <k9> t_KL 't_KL'
<Mouse> 鼠标控制码引导标记 <Mouse>
t_PS <PasteStart> 开始括号粘贴 t_PS 't_PS'
xterm-bracketed-paste
t_PE <PasteEnd> 结束括号粘贴 t_PE 't_PE'
xterm-bracketed-paste
<FocusGained> Vim 窗口获得焦点 (仅限内部使用)
<FocusLost> Vim 窗口失去焦点 (仅限内部使用)
t_so 和 t_mr 备注: 如果终端能力项 "so" 不存在,会用 "mr" 条目代替,反之亦
然。退出相关模式的 "se" 和 "me" 同理。终端同时支持反转和突出模式时,二者显示效
果会有区别。如果终端只支持其中一种,则两种模式效果相同。
keypad-comma
小键盘键未被映射时等同于对应的普通键。但有一处例外: 如果小键盘上是逗号而非小数
点,Vim 默认仍使用小数点。可用以下映射修正:
:noremap <kPoint> ,
:noremap! <kPoint> ,
xterm-codes
有一种获取键码的特殊技巧,目前仅适用于 xterm。当 t_RV 已定义且其应答指示
xterm 补丁版本不低于 141 时,Vim 会通过专用转义序列直接从 xterm 查询键码。并用
返回结果调整各种 t_ 代码。这解决了 xterm 在不同模式 (8-位、VT102、VT220 等) 下
生成不同编码的问题。<xF1> 这类备用键码此时不再必要。
't_Co',颜色数目,也是可能被调整的代码之一,从而触发重绘。如果这会引起问题,请
尽早复位 'xtermcodes' 选项:
set noxtermcodes
注意: 键码查询仅在启动阶段进行。如果 Vim 启动后再更改 xterm 设置,可能导致转义
序列无法识别。
xterm-true-color
终端支持真彩时,Vim 可在终端内提供相应支持 (通过 highlight-guifg 和
highlight-guibg )。为此需要开启 'termguicolors' 选项。支持真彩的终端列表可见
https://gist.github.com/XVilka/8346728。
直接色彩终端 (如 "xterm-direct") 的条目拥有 16777216 种颜色。此时 't_Co' 值为
16777216, terminalprops() 返回的 'y' 字段为 "rgb"。Vim 不会自动开启
'termguicolors'。要为此类终端自动启用,可在 vimrc 加入:
if get(terminalprops(), 'rgb', 'n') == 'y'
set termguicolors
endif
通过 t_8f 、 t_8b 和 t_8u 终端能力项指定终端使用的 RGB 色。其缺省值应适用
于大多数终端。如果不合适,可手动设置。缺省值分别是:
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
部分终端接受另一种相似格式: 分号被替换为冒号,数值 2 后需要额外加上冒号 (该格
式符合 ISO 8613-6 标准,但支持不广泛):
let &t_8f = "\<Esc>[38:2::%lu:%lu:%lum"
let &t_8b = "\<Esc>[48:2::%lu:%lu:%lum"
let &t_8u = "\<Esc>[58:2::%lu:%lu:%lum"
这些选项是 printf 格式字符串,会调用 printf() (实际使用底层 C 同名函数,因此
使用 l 修饰符),传入相应 t_ 选项字符串与三个取值范围在 0 到 255 (含) 的无符
号长整数,分别代表红、绿和蓝色分量。
xterm-resize
xterm 的窗口缩放功能,仅当开启 allowWindowOps 资源后才生效。部分系统与部分
xterm 版本缺省关闭该资源,因为被认为存在安全隐患。但其实际风险尚无定论。
要覆盖该缺省值,可在 ~/.Xdefaults 或 ~/.Xresources 中放入:
XTerm*allowWindowOps: true
执行 "xrdb -merge .Xresources" 使之生效。可通过上下文菜单检查 (按住 CTRL 键并
点击鼠标右键),在 allow-window-ops 项应当带有勾选标记。
xterm-focus-event
包含 xterm 在内的部分终端支持焦点事件跟踪。通过 't_fe' 序列开启此功能后,终端
每次获得或丧失焦点时,都会向 Vim 发送专用转义序列。Vim 解析后触发焦点事件
( FocusGained / FocusLost )。退出原始 ("raw") 模式时,会通过 't_fd' 序列关闭焦
点事件跟踪。要禁用此功能,可在 .vimrc 里加入:
set t_fd=
set t_fe=
如果终端支持但 Vim 无法识别终端类型时,需要手动设置:
let &t_fe = "\<Esc>[?1004h"
let &t_fd = "\<Esc>[?1004l"
execute "set <FocusGained>=\<Esc>[I"
execute "set <FocusLost>=\<Esc>[O"
如果 Vim 启动时出现乱码,则代表该设置不兼容。
termcap-colors
颜色备注: 't_Co' 选项告知 Vim 可用颜色数目。非零时,使用 't_AB' 和 't_AF' 选项
设置颜色。如果其中之一不可用,则改用 't_Sb' 和 't_Sf'。't_me' 用于恢复缺省颜色
设置。另见 'termguicolors'。
GUI 运行时,'t_Co' 固定设为 16777216。
termcap-cursor-shape termcap-cursor-color
Vim 进入插入模式时会发送 't_SI' 转义序列。进入替换模式而 't_SR' 可用时,发送
't_SR' 转义序列,否则发送 't_SI'。退出插入或替换模式时,发送 't_EI'。
备注: 如果未设置 't_EI','t_SI' 和 't_SR' 都不会发送。而如果未设置 't_SI' 或
't_SR',会仅发送 't_EI' 一次。
借助这组选项,可在插入或替换模式下切换光标形状或颜色。它们不属于标准
termcap/terminfo 项目,需要手动设置。
xterm 修改光标颜色的示例:
if &term =~ "xterm"
let &t_SI = "\<Esc>]12;purple\x7"
let &t_SR = "\<Esc>]12;red\x7"
let &t_EI = "\<Esc>]12;blue\x7"
endif
注意: Vim 退出后,光标将保留普通模式下的形状,而不会恢复 Vim 启动前的状态。
Windows 终端可用以下设置:
" 注意: 应在 `set termguicolors` 或 `set t_Co=256` 后设置。
if &term =~ 'xterm' || &term == 'win32'
" 使用 DECSCUSR 转义序列
let &t_SI = "\e[5 q" " 闪烁竖线光标
let &t_SR = "\e[3 q" " 闪烁下划线光标
let &t_EI = "\e[1 q" " 闪烁块状光标
let &t_ti ..= "\e[1 q" " 闪烁块状光标
let &t_te ..= "\e[0 q" " 缺省光标 (取决于终端,通常是闪烁块状光标)
endif
{仅当编译时加入 +cursorshape 特性才支持}
termcap-title
终端支持发送字符串设置标题时,可用 't_ts' 和 't_fs' 选项设置窗口标题。二者分别
在发送标题字符串的前后发送。与之类似,'t_IS' 和 't_IE' 用于设置图标文本。这几
项属于 Vim 内部对 Unix 终端能力库的扩展,无法不能从外部终端能力库获取。不过,
内置终端能力库已为 xterm 和 iris-ansi 配置好对应项目,无需手动设置。
hpterm
如果反显或其他高亮方式不能正常工作,可尝试将 't_xs' 选项设为非空字符串。通过
't_ce' 代码清除一行上的高亮。"hpterm" 终端需要此设置。置位 'weirdinvert' 选项
等价于将 't_xs' 设为非空串,反之亦然。
scroll-region
部分终端能力库不提供 "cs" (滚动区域) 条目,但终端本身支持该功能。例如 Sun 平台
上的 xterm。可用内置 builtin_xterm 条目,或者自行定义 t_cs 。例如:
:set t_cs=^V^[[%i%d;%dr
其中 ^V 代表 CTRL-V,而 ^[ 代表 <Esc>。
垂直滚动区域 t_CV 并非标准终端能力项。Vim 在 GUI 内部使用该项。终端支持时,
也可手动定义,接受两个参数,分别代表滚动区域限制范围的左右边界列。和 t_cs 定
义顶部和底部边界行类似。定义 t_CV 能大幅提升垂直分割窗口里的滚动速度。如果已
定义 t_da 或 t_db ,则不要设置 t_CV (否则滚动时文本不会被清除)。
不幸的是,无法通过终端能力项自动推断,在使用滚动区域时,光标坐标应是相对于屏幕
起点,还是滚动区域起点。大多数终端采用第一种方式。在光标坐标基准是滚动区域起点
时,应将 't_CS' 选项设为任意非空串。否则设为空串。
xterm 用户需注意: Shift + 光标键默认无法正常工作。可以借助 xmodmap 命令和 Vim
里的映射解决。
在 xterm 中,执行如下命令:
xmodmap -e "keysym Up = Up F13"
xmodmap -e "keysym Down = Down F16"
xmodmap -e "keysym Left = Left F18"
xmodmap -e "keysym Right = Right F19"
然后在 Vim 内添加映射:
:map <t_F3> <S-Up>
:map! <t_F3> <S-Up>
:map <t_F6> <S-Down>
:map! <t_F6> <S-Down>
:map <t_F8> <S-Left>
:map! <t_F8> <S-Left>
:map <t_F9> <S-Right>
:map! <t_F9> <S-Right>
可将 <S-Up> 替换为其他想要绑定给 Shift + 上箭头键的命令 (注意: 对使用左侧功能
键 Sun 键盘的用户,请勿使用与 Undo 键有冲突的 F14;触发窗口前置的 F15;会最小
化窗口的 F17。其他系统上这些键一般都可正常使用)。
3. 窗口大小 window-size
[本节讨论 Vim 使用的整体窗口,而非 :split 命令创建的那种窗口 (译者注: Vim
里的术语或者用屏幕更合适些)。]
在 Amiga 上运行 Vim 且终端名是 "amiga" 或 "builtin_amiga" 时,会开启 Amiga 专
属窗口缩放逻辑。Unix 系统上,获取窗口大小有三种方法:
- ioctl 系统调用 (视乎具体系统,使用 TIOCGSIZE 或 TIOCGWINSZ 命令)
- 环境变量 "LINES" 和 "COLUMNS"
- 终端能力项 "li" 和 "co" (译者注: 没有对应 Vim 终端选项)
如果以上方法都失败,默认窗口大小为 24 行和 80 列。收到窗口缩放信号时,会重新设
置大小。如果窗口大小有误,可用 'lines' 和 'columns' 选项手动修正。
也可用以下命令设置屏幕大小:
:mod :mode E359
:mod[e] [mode]
省略参数时,检测屏幕大小并重绘屏幕。参数 [mode] 曾用于 MS-DOS 系统,现已废弃。
Vim9 不支持本命令。
4. 低速和快速终端 slow-fast-terminal
slow-terminal 使用快速终端时,可置位 'ruler' 选项。在状态行显示光标位置。使用水平滚动模式 ('wrap' 选项关闭) 时,可将 'sidescroll' 适当调小。 使用低速终端时,建议复位 'showcmd' 选项。状态行不再显示命令字符。终端滚动极慢 时,可将 'scrolljump' 设为 5 左右。光标移出屏幕 (如用 j ),Vim 会一次滚动 5 行。也可用 "z{height}<CR>" 命令 ( zN<CR> ) 减少 Vim 使用的行数。
如果终端字符的接收间隔超过 1 秒,可调整 'timeout' 和/或 'ttimeout' 选项。见
"选项" 一章 options 。
如果终端不支持滚动区域、但支持行增删相关命令,在多窗口滚动时,行可能会出现上下
跳动。原因可能是复位了 'ttyfast' 选项。可用以下命令检查:
verbose set ttyfast?
如果终端滚动很慢,但重绘速度尚可,可将 'ttyscroll' 调小。如设为 3。需要滚动超
过 3 行时,Vim 会重绘屏幕而非滚动。
使用低速彩色终端时,可用以下命令:
hi NonText cterm=NONE ctermfg=NONE
可避免发送带有不同属性的空格。大多数终端上肉眼看不出差别。
通过低速串行线路使用 Vim 时,可考虑在 "screen" 程序中运行 Vim。screen 会大幅优
化终端 I/O。
测试终端能力项时如果看不清执行过程,可设置 'writedelay' 选项。非零时,每次只向
终端发送一个字符。屏幕刷新会显著变慢,方便观察执行细节。
5. 使用鼠标 mouse-using
本节说明在终端或终端窗口里鼠标的使用方式。GUI 窗口的鼠标用法见 gui-mouse 。鼠 标滚轮滚动相关见 scroll-mouse-wheel 。 请使用以下命令开启鼠标支持: :set mouse=a
否则 Vim 不会在所有模式下识别鼠标 (见 'mouse')。
目前,鼠标支持包括 Unix 环境下的 xterm 窗口、带 sysmouse 的 *BSD 控制台、带
GPM gpm-mouse 的 Linux 终端,以及 Windows 控制台。
鼠标点击可用于定位光标、选择区域、以及粘贴。
'mouse' 选项字符用于指定 Vim 使用鼠标的场景:
n 普通模式
v 可视模式
i 插入模式
c 命令行模式
h 编辑帮助文档时使用前面列出的所有模式
a 前面列出的所有模式
r hit-enter 和 more-prompt 提示
'mouse' 缺省值为空,代表不启用鼠标。一般使用:
:set mouse=a
开启鼠标 (等价于将 'mouse' 设为 "nvich")。
如果只需在部分模式或两个提示界面下使用鼠标,将所需模式对应字母进行拼接即可。例
如:
:set mouse=nv
仅在普通模式和可视模式下启用鼠标。
:set mouse=h
仅在帮助文档里启用鼠标 (可用 "g<LeftMouse>" 跳转标签)。
用鼠标开始选区时,进入可视模式还是选择模式,取决于 'selectmode' 选项是否包含
"mouse"。
terminal-mouse
在 xterm 终端里,'mouse' 选项包含当前模式时,普通鼠标点击交由 Vim 处理,按住
Shift 或 Ctrl 键的鼠标点击则交由 xterm 处理。'mouse' 不含当前模式时,所有鼠标
事件都交由 xterm 处理。
如果终端自身无法处理带修饰符的鼠标事件,一个权宜之计是在 Vim 的命令模式下关闭
鼠标:
:set mouse=nvi
之后如果要在终端自身选中文本,可通过 : 进入命令行模式,选中并复制文本到系
统,再按 Esc 退出。
另一种方案是临时执行 :sh 进入外壳、复制文本、然后退出。此时 'mouse' 仍可保持
为 "a"。
xterm-clipboard
Motif GUI 版本上,运行在终端且 X-server (已设置 DISPLAY 环境变量) 可访问时,复
制和粘贴行为和 GUI 一致。否则,鼠标中键会粘贴到无名寄存器。这种情景下,要复制
和粘贴一段文本,可用以下步骤:
通过鼠标和可视模式进行复制/粘贴 (必须已设置 'mouse' 选项,见上):
1. 在文本首字符上按鼠标左键、拖动鼠标到文本末字符、释放左键。此时启动可视模
式,高亮选区。
2. 按 y 将可视选中文本抽出到无名寄存器。
3. 移动到目标位置,点击鼠标左键。
4. 点击鼠标中键完成粘贴。
快捷方式: 目标位置和可视选中文本同在屏幕上出现时,可一步完成 2、3 和 4: 在目标
位置直接点击鼠标中键即可。
注意: 使用 -X 命令行参数时,Vim 不会连接 X 服务器,因而无法通过 X 剪贴板 (选
择区) 进行复制/粘贴。此时可按 Shift 键配合鼠标操作,由 xterm 完成文本选取。
xterm-command-server
X 服务器剪贴板可用时,可通过 --servername 命令行参数打开 x11-clientserver
中介绍的命令服务器。
xterm-copy-paste
注意: 部分 (旧版) xterm 里,光标无法移动到第 95 或 223 列之后。这是 xterm 自身
限制,不是 Vim 的问题。更换新版 xterm 即可 color-xterm 。另见 'ttymouse'。
当前模式 不 在 'mouse' 内时,可通过 xterm 进行粘贴/复制,步骤如下:
1. 在文本首字符上按鼠标左键,拖动鼠标到文本末字符,释放左键。
2. 使用普通 Vim 命令,移动光标到目标位置。
3. 按 a ,进入插入模式。
4. 点击鼠标中键完成粘贴。
5. 按 ESC 退出插入模式。
(即使当前模式已加入 'mouse',也可使用这套流程,操作鼠标时按住 Shift 键即可。)
备注: 粘贴时如果第 8 位丢失 (特殊字符被错误译成其他字符),可在启动 Vim 前在外
壳上执行 "stty cs8 -istrip -parenb"。
因此,在 xterm 中,Shift 与 Ctrl 键不能与鼠标组合用于 Vim。需要 CTRL 修饰符的
鼠标命令,可在使用鼠标前先按 "g" 键来模拟:
"g<LeftMouse>" 等同于 "<C-LeftMouse> (跳转到鼠标点击所在的标签)
"g<RightMouse>" 等同于 "<C-RightMouse> (等价 "CTRL-T")
mouse-mode-table mouse-overview
'mousemodel' 设为 "extend" 时,鼠标按键行为简要说明如下:
普通模式:
事件 移动光标 选区 窗口变更 动作
<LeftMouse> 是 结束 是
<C-LeftMouse> 是 结束 是 "CTRL-]" (2)
<S-LeftMouse> 是 不改变 是 "*" (2) <S-LeftMouse>
<LeftDrag> 是 开始或扩展 (1) 否 <LeftDrag>
<LeftRelease> 是 开始或扩展 (1) 否
<MiddleMouse> 是 未激活时 否 放置
<MiddleMouse> 是 已激活时 否 抽出并放置
<RightMouse> 是 开始或扩展 是
<A-RightMouse> 是 开始或扩展列块模式 是 <A-RightMouse>
<S-RightMouse> 是 不改变 是 "#" (2) <S-RightMouse>
<C-RightMouse> 否 不改变 否 "CTRL-T"
<RightDrag> 是 扩展 否 <RightDrag>
<RightRelease> 是 扩展 否 <RightRelease>
插入或替换模式:
事件 移动光标 选区 窗口变更 动作
<LeftMouse> 是 (不能激活) 是
<C-LeftMouse> 是 (不能激活) 是 "CTRL-O^]" (2)
<S-LeftMouse> 是 (不能激活) 是 "CTRL-O*" (2)
<LeftDrag> 是 开始或扩展 (1) 否 类似 CTRL-O (1)
<LeftRelease> 是 开始或扩展 (1) 否 类似 CTRL-O (1)
<MiddleMouse> 否 (不能激活) 否 放置寄存器内容
<RightMouse> 是 开始或扩展 是 类似 CTRL-O
<A-RightMouse> 是 开始或扩展列块模式 是
<S-RightMouse> 是 (不能激活) 是 "CTRL-O#" (2)
<C-RightMouse> 否 (不能激活) 否 "CTRL-O CTRL-T"
在帮助窗口中:
事件 移动光标 选区 窗口变更 动作
<2-LeftMouse> 是 (不能激活) 否 "^]" (跳转到帮助标签)
'mousemodel' 设为 "popup" 时,以下按键行为有所差异:
普通模式:
事件 移动光标 选区 窗口变更 动作
<S-LeftMouse> 是 开始或扩展 (1) 否
<A-LeftMouse> 是 开始或扩展列块模式 否 <A-LeftMouse>
<RightMouse> 否 弹出菜单 否
插入或替换模式:
事件 移动光标 选区 窗口变更 动作
<S-LeftMouse> 是 开始或扩展 (1) 否 类似 CTRL-O (1)
<A-LeftMouse> 是 开始或扩展列块模式 否
<RightMouse> 否 弹出菜单 否
(1) 仅当按下鼠标后移动过指针才生效
(2) 仅当点击发生在同一缓冲区时才生效
点击鼠标左键会定位光标。在另一个窗口点击时,该窗口会成为活动窗口。在命令行编辑
状态下,光标只能定位在命令行内。在插入模式下,任意鼠标操作后 Vim 仍会保持在插
入模式。设置 'scrolloff' 且新光标位置距离窗口边界小于 'scrolloff' 指定行数时,
文本会自动滚动。
要创建选区,可在选区首个字符上按鼠标左键、拖动到末字符再放开。在释放鼠标键前,
并非所有版本都会实时显示拖动选区。仅部分版本 (GUI、WIN32) 可以。注意
'scrolloff' 非零时,拖动到窗口首/末行后需再移动鼠标至少一个字符位置,才能使文
本滚动。
在普通、可视和选择模式下,点击鼠标右键会扩展可视选区。'mousemodel' 为 "popup"
时,须改用鼠标左键且同时需按住 Shift 键。点击编辑其他缓冲区的窗口时,会退出可
视和选择模式。
在普通、可视和选择模式下,按住 Alt 键的同时点击鼠标右键,可视选区会使用列块模
式。'mousemodel' 为 "popup" 时,按住 Alt 键的同时需改用鼠标左键。注意在部分系
统上,窗口管理器在按下 Alt 键时会拦截鼠标事件 (可能触发窗口移动),此时本功能无
法使用。
double-click
支持双击、三击和四击的环境包括 GUI、Win32 以及 xterm (需 gettimeofday() 函数可
用)。用于文本选择时,多次点击可扩展选区范围:
点击次数 选中范围
两次 单词或者 % 配对范围 <2-LeftMouse>
三次 整行 <3-LeftMouse>
四次 列块区域 <4-LeftMouse>
特例: 在帮助窗口中双击,会跳到点击单词对应的帮助。
双击单词会选中该单词。单词组成字符由 'iskeyword' 决定。双击带配对标记的字符会
选中两个配对字符之间的区域 (效果类似 v% )。匹配项目是 #if/#else/#endif 块时,
进入行选择模式。
MS-Windows 和 xterm 环境 (译者注: 还有 GUI) 可通过 'mousetime' 选项设置双击间
隔时长。其他系统的双击时长在 Vim 之外定义。
使用双击跳转到光标所在标签的示例:
:map <2-LeftMouse> :exe "tag " .. expand("<cword>")<CR>
双击后拖动鼠标 (即按下、松开、再按下然后拖动) 会按单词扩展选区。直到按钮释放
后,才恢复为按字符选区。
鼠标滚动相关可见 scroll-mouse-wheel 。
gpm-mouse
{仅当编译时打开 +mouse_gpm 特性才支持 GPM 鼠标} GPM 鼠标驱动 (Linux 终端) 不
支持四击。
插入模式下启动选区时,Vim 会暂时回到普通模式。退出可视或选择模式后回到插入模
式。行为类似插入模式下按 CTRL-O。'selectmode' 选项包含 "mouse" 时,使用选择模
式。
sysmouse
{仅当编译时加入 +mouse_sysmouse 特性才支持 sysmouse} sysmouse 驱动 (*BSD 控
制台) 不支持键盘修饰符。
drag-status-line
多窗口布局时,可通过鼠标拖动状态行调整窗口大小。具体步骤是,鼠标移到状态行,按
住左键,拖动到目标位置后松开。直接点击状态行而不移动鼠标,只会将该窗口切换为当
前窗口。如果选中窗口会使其位置或大小发生变化,拖动状态行时看来会有些混乱,但仍
可正常工作 (不妨尝试一下)。
<MiddleRelease> <MiddleDrag>
鼠标点击事件可被映射。鼠标点击编码如下:
编码 对应鼠标按键 缺省动作
<LeftMouse> 按住左键 设置光标位置
<LeftDrag> 按住并移动左键 扩展选区
<LeftRelease> 释放左键 结束选区
<MiddleMouse> 按住中键 在光标处粘贴
<MiddleDrag> 按住并移动中键 -
<MiddleRelease> 释放中键 -
<RightMouse> 按住右键 扩展选区
<RightDrag> 按住并移动右键 扩展选区
<RightRelease> 释放右键 结束选区
<X1Mouse> 按住 X1 键 - X1Mouse
<X1Drag> 按住并移动 X1 键 - X1Drag
<X1Release> 释放 X1 键 - X1Release
<X2Mouse> 按住 X2 键 - X2Mouse
<X2Drag> 按住并移动 X2 键 - X2Drag
<X2Release> 释放 X2 键 - X2Release
X1 和 X2 按键是部分鼠标提供的额外按键。例如 'Microsoft Explorer' 鼠标在右拇指
位置有这些按键。目前 X1 和 X2 仅在 Win32、X11,以及支持 xterm-兼容鼠标协议的终
端中可用。
示例:
:noremap <MiddleMouse> <LeftMouse><MiddleMouse>
在鼠标中键点击位置粘贴文本 (缺省会在光标位置粘贴)。
:noremap <LeftRelease> <LeftRelease>y
在可视模式下,释放左键会立即抽出选区文本。
注意使用了 :noremap 而非 :map ,防止映射递归。
:map <X1Mouse> <C-O>
:map <X2Mouse> <C-I>
将 X1 和 X2 键映射为跳跃表的后退与前进,见 CTRL-O 和 CTRL-I 。
mouse-swap-buttons
要交换鼠标左键和右键功能:
:noremap <LeftMouse> <RightMouse>
:noremap <LeftDrag> <RightDrag>
:noremap <LeftRelease> <RightRelease>
:noremap <RightMouse> <LeftMouse>
:noremap <RightDrag> <LeftDrag>
:noremap <RightRelease> <LeftRelease>
:noremap g<LeftMouse> <C-RightMouse>
:noremap g<RightMouse> <C-LeftMouse>
:noremap! <LeftMouse> <RightMouse>
:noremap! <LeftDrag> <RightDrag>
:noremap! <LeftRelease> <RightRelease>
:noremap! <RightMouse> <LeftMouse>
:noremap! <RightDrag> <LeftDrag>
:noremap! <RightRelease> <LeftRelease>
vim:tw=78:ts=8:noet:ft=help:norl: