term

term.txt 适用于 Vim 9.0 版本。 最近更新: 2022年7月 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 系统中,termcap 只有在 Vim 编译时定义 TERMCAP 才有效。 builtin-terms builtin_terms 内建的终端哪些可用,决定于 feature.h 的一些定义。这些需要在编译时确定: 定义 ":version" 的输出 内建的终端 NO_BUILTIN_TCAPS -builtin_terms 无 SOME_BUILTIN_TCAPS +builtin_terms 大多数常用终端 (缺省) ALL_BUILTIN_TCAPS ++builtin_terms 全部 用 ":set term=xxx" (在不运行 GUI 的时候)。你可以看到可用的内建终端类型列表。另 见 +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") 模式。't_ti''t_TI''t_ks' 定义的字符串 会送到终端上。正常情况下,这把终端设为一个状态,该状态下能合法给出 termcap 代 码,并激活光标和功能键。 Vim 退出终端时,它会回到 Vim 启动前的模式。't_te''t_TE''t_ke' 定义的字符 串会发送给终端。在 Amiga 上,执行外部命令的命令 (例如 "!!") 会把终端暂时置回普 通模式。这意味着你可以按打印键停止到屏幕的输出。输出在按 <BS> 时继续。 注意: 如果 't_ti' 非空,Vim 假定它会切换到轮换屏幕上。执行外壳命令或退出 Vim 时产生的结果可能会因此稍有不同。如果不想如此,用 't_TI''t_TE' xterm-bracketed-paste 如果设置了 't_BE' 选项,进入 "raw" 模式时会发送 't_BE' 到终端,退出 "raw" 模式 时则发送 't_BD'。终端应在粘贴文本之前发送 't_PS',而粘贴文本之后发送 't_PE'。 这样 Vim 就能区隔粘贴的文本和键入的字符。粘贴文本的处理就像使用了鼠标中键,按 本义插入而不作命令解释。 光标在首列时,在光标前插入粘贴文本。否则在光标位置之后附加粘贴文本。这意味着你 不能在首列之后粘贴。不幸的是 Vim 没有办法知道鼠标指针在哪里。 注意 有些情况下 Vim 不能识别这种括号内的粘贴,而只能得到原始的文本。在其它一些 情况下,Vim 只能得到首个粘贴的字符而丢失其余的部分,例如在使用 "r" 命令时。如 果你对此不满意,在 .vimrc 这样关闭带括号的粘贴: set t_BE= 如果这样做,Vim 运行时发送 't_BD' 给终端以关闭括号内的粘贴。 如果你的终端支持括号内的粘贴但没有自动设置相关选项,可以试试下面: 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 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 上 "stty cs8 parenb",使用 "stty cs7 parenb" 恢复就会有这个问题。 如果你使用 "stty cs8 -parenb -istrip",就能正确恢复了。 有些 termcap 项目在某种意义上是错误的,因为发送 't_ks' 后光标键发送的代码和 termcap 定义的不同。要避免这一点,你需要设置 't_ks' (和 't_ke') 为空值。这必须 在初始化时进行 (见 initialization ),不然就太晚了。 有些终端项目假设最高位总是被复位的。例如: Amiga 上光标向上项目可以是 ":ku=\E[A:"。但是 Amiga 实际发送 "\233A"。如果最高位被复位,这没有问题,比如在 串行线使用 Amiga 的时候。如果光标键不工作,尝试一下项目 ":ku=\233A:"。 有些 termcap 项目使用 ":ku=\E[A:"。但 Amiga 实际发送 "\233A"。输出结果 "\E[" 和 "\233" 经常是等价的,但输入时则不然。要修正这一问题,你需要修改 termcap 项 目,或者用 :set 命令改变键码 (译者注: 这段内容有重复,但原文如此)。 许多光标键以单个 <Esc> 开始。Vim 必须找出是否这确实是 <Esc> 键单击,还是光标键 序列的开始。它等待下一个字符到达。如果一秒钟不出现,就假设是单个 <Esc>。在很慢 的系统里,这可能失败,使得有时候光标键不能工作。如果你发现这一问题,复位 'timeout' 选项。Vim 会在 <Esc> 之后等待下一个字符的来临。如果你需要输入单个 <Esc>,必须输入两次。复位 'esckeys' 选项在插入模式下避免这个问题,但是这样你不 能在插入模式下使用光标和功能键。 Amiga 上窗口调整大小的识别只有在终端名为 "amiga" 或 "builtin_amiga" 才有可能。 有些终端的光标键的代码不明确。televideo 925 就是这样的一个终端。光标左键发送的 是 CTRL-H。这使得退格和光标左键无法区别。要避免这一问题,CTRL-H 永远不会识别为 光标左键。 vt100-cursor-keys xterm-cursor-keys 其它终端 (例如,vt100 和 xterm) 的光标键发送 <Esc>OA、<Esc>OB,等等。不幸的 是,这些是插入模式下合法的命令: 结束插入,在上面打开新行,开始插入 'A'、'B', 等等。Vim 不会执行这些命令,相反,它会把该输入键序列识别为光标键的移动。要避免 这一点而使 Vim 在两种情况下都能工作,你需要以下设置: :set notimeout " 映射时不检查超时 :set ttimeout " 终端键码检查超时 :set timeoutlen=100 " 超时为 100 毫秒 这要求键码在 100 毫秒的间隔内发送,从而能识别其为光标键。正常情况下,你的输入 不会那么快,所以它们能被识别为单独输入的命令,即使 Vim 收到了相同的字节序列。 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" 来检查哪些是支持的,相应的代码为何。多数情况下这些不在 termcap 里,只 有 builtin_xterm termcap 才支持。 xterm-modifier-keys 新版 xterm 对于大多数功能键支持 Alt 和 Ctrl。为避免增加 Alt、Ctrl 和 Shift 对 每个键的捆绑,在 termcap 项目末尾识别一个特殊序列: ";*X"。"X" 可以是任何字符, 通常是 '~'。";*" 支持一个可选的修饰符参数。";2" 代表 Shift,";3" 是 Alt,";5" 是 Ctrl,";9" 是 Meta (当它与 Alt 不同时)。它们可以组合使用。例如: :set <F8>=^[[19;*~ :set <Home>=^[[1;*H 关于这些代码的另一个特性是它们不能被另外的代码覆盖。这就避免了被来自 xterm t_RV 所包含的代码直接覆盖掉。 另一个特殊值是以 "@;*X" 结尾的 termcap 项目。这用于光标键,那里可用 "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 缺省的 termcap 项目不包含区域滚动的项目。在 /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> 键可以在插入模式下更快的识别,因为不会和特殊键的开始相混淆。 对于内建的 termcap 项目而言,Vim 检查 'term' 选项是否包含 "8bit"。如果是,就在 termcap 项目、鼠标和一些其它的项目中使用 8 位字符,通常,你在外壳里设置 $TERM 为 "xterm-8bit"。Vim 会发现这一点,并自动调整 8 位设置。 如果 Vim 接收到对 t_RV 序列的应答 (请求版本) 并且它以 CSI 开始,就假设终端处 于 8 位模式,并把所有的健序列转换为它们的 8 位版本。

2. 终端选项 terminal-options termcap-options E436

终端选项可以和普通选项一样设置。但不会在 ":set all" 命令里显示。相反,应该用 ":set termcap"。 通过设置合适的选项,你总是可以调整个别字符串的值。例如: :set t_ce=^V^[[K (CTRL-V,<Esc>,[,K) 这些选项列在下面。相关的 termcap 代码总是等价于选项名字的最后两个字符。只有一 个 termcap 代码是必须的: 光标移动,'t_cm'。 选项 't_da''t_db''t_ms''t_xs''t_xn' 代表 termcap 里的标志位。termcap 标志位存在时,选项总是设为 "y"。但是任何非空的字符串意味着标志位已经置位。而空 字符串代表该标志位没有置位。't_CS' 也是这样的,虽然它不是 termcap 的标志位。 输 出 代 码 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 结束 "keypad 传输" 模式 t_ke 't_ke' t_ks 进入 "keypad 传输" 模式 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_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_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 请求终端版本字符串 (适用于 xterm 和其它终端模 t_RV 't_RV' 拟器) 其响应存于 v:termresponse xterm-8bit 'ttymouse' xterm-codes t_u7 请求光标位置 (适用于 xterm) t_u7 't_u7' 'ambiwidth' 其响应存于 v:term7resp t_RF 请求终端前景色 t_RF 't_RF' 其响应存于 v:termfgresp t_RB 请求终端背景色 t_RB 't_RB' 其响应存于 v:termbgresp t_8f 设置终端前景色 (R, G, B) t_8f 't_8f' xterm-true-color t_8b 设置终端背景色 (R, G, B) t_8b 't_8b' xterm-true-color t_8u 设置下划线色 (R, G, B) t_8u 't_8u' t_BE 打开括号内粘贴模式 t_BE 't_BE' xterm-bracketed-paste t_BD 关闭括号内粘贴模式 t_BD 't_BD' xterm-bracketed-paste t_SC 开始设置光标颜色 t_SC 't_SC' t_EC 结束设置光标颜色 t_EC 't_EC' t_SH 设置光标形状 t_SH 't_SH' t_RC 请求终端光标闪烁 t_RC 't_RC' 其响应存于 v:termblinkresp t_RS 请求终端光标风格 t_RS 't_RS' 其响应存于 v:termstyleresp 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 打开焦点事件跟踪 t_fe 't_fe' xterm-focus-event t_fd 关闭焦点事件跟踪 t_fd 't_fd' xterm-focus-event 有些代码有开始、中间和结束部分。开始和结束由 termcap 选项定义,中间部分是文 本。 设置标题文本: t_ts {title text} t_fs 设置图标文本: t_IS {icon text} t_IE 设置光标颜色: t_SC {color name} t_EC t_SH 必须提供一个参数: 0、1 或无 闪烁块状光标 2 块状光标 3 闪烁下划光标 4 下划光标 5 产供垂直条光标 6 垂直条光标 仅当接收到 t_RV 的反馈时才会发送 t_RS。Mac OS 上如果 termresponse 不能识别到 Terminal.app 也不会用它。 键 代 码 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> 功能键 1 t_k1 't_k1' <xF1> 替代的 F1 <xF1> t_k2 <F2> 功能键 2 <F2> t_k2 't_k2' <xF2> 替代的 F2 <xF2> t_k3 <F3> 功能键 3 <F3> t_k3 't_k3' <xF3> 替代的 F3 <xF3> t_k4 <F4> 功能键 4 <F4> t_k4 't_k4' <xF4> 替代的 F4 <xF4> t_k5 <F5> 功能键 5 <F5> t_k5 't_k5' t_k6 <F6> 功能键 6 <F6> t_k6 't_k6' t_k7 <F7> 功能键 7 <F7> t_k7 't_k7' t_k8 <F8> 功能键 8 <F8> t_k8 't_k8' t_k9 <F9> 功能键 9 <F9> t_k9 't_k9' t_k; <F10> 功能键 10 <F10> t_k; 't_k;' t_F1 <F11> 功能键 11 <F11> t_F1 't_F1' t_F2 <F12> 功能键 12 <F12> t_F2 't_F2' t_F3 <F13> 功能键 13 <F13> t_F3 't_F3' t_F4 <F14> 功能键 14 <F14> t_F4 't_F4' t_F5 <F15> 功能键 15 <F15> t_F5 't_F5' t_F6 <F16> 功能键 16 <F16> t_F6 't_F6' t_F7 <F17> 功能键 17 <F17> t_F7 't_F7' t_F8 <F18> 功能键 18 <F18> t_F8 't_F8' t_F9 <F19> 功能键 19 <F19> t_F9 't_F9' <S-F1> shift 功能键 1 <S-xF1> 替代的 <S-F1> <S-xF1> <S-F2> shift 功能键 2 <S-F2> <S-xF2> 替代的 <S-F2> <S-xF2> <S-F3> shift 功能键 3 <S-F3> <S-xF3> 替代的 <S-F3> <S-xF3> <S-F4> shift 功能键 4 <S-F4> <S-xF4> 替代的 <S-F4> <S-xF4> <S-F5> shift 功能键 5 <S-F5> <S-F6> shift 功能键 6 <S-F6> <S-F7> shift 功能键 7 <S-F7> <S-F8> shift 功能键 8 <S-F8> <S-F9> shift 功能键 9 <S-F9> <S-F10> shift 功能键 10 <S-F10> <S-F11> shift 功能键 11 <S-F11> <S-F12> shift 功能键 12 <S-F12> t_%1 <Help> 帮助键 t_%1 't_%1' t_&8 <Undo> 撤销键 t_&8 't_&8' t_kI <Insert> 插入键 t_kI 't_kI' t_kD <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> page-up 键 t_kP 't_kP' t_kN <PageDown> page-down 键 t_kN 't_kN' t_K1 <kHome> keypad home 键 t_K1 't_K1' t_K4 <kEnd> keypad end 键 t_K4 't_K4' t_K3 <kPageUp> keypad page-up 键 t_K3 't_K3' t_K5 <kPageDown> keypad page-down 键 t_K5 't_K5' t_K6 <kPlus> keypad 加号键 <kPlus> t_K6 't_K6' t_K7 <kMinus> keypad 减号键 <kMinus> t_K7 't_K7' t_K8 <kDivide> keypad 除号 <kDivide> t_K8 't_K8' t_K9 <kMultiply> keypad 乘号 <kMultiply> t_K9 't_K9' t_KA <kEnter> keypad 回车键 <kEnter> t_KA 't_KA' t_KB <kPoint> keypad 小数点 <kPoint> t_KB 't_KB' t_KC <k0> keypad 0 <k0> t_KC 't_KC' t_KD <k1> keypad 1 <k1> t_KD 't_KD' t_KE <k2> keypad 2 <k2> t_KE 't_KE' t_KF <k3> keypad 3 <k3> t_KF 't_KF' t_KG <k4> keypad 4 <k4> t_KG 't_KG' t_KH <k5> keypad 5 <k5> t_KH 't_KH' t_KI <k6> keypad 6 <k6> t_KI 't_KI' t_KJ <k7> keypad 7 <k7> t_KJ 't_KJ' t_KK <k8> keypad 8 <k8> t_KK 't_KK' t_KL <k9> keypad 9 <k9> t_KL 't_KL' <Mouse> 鼠标代码的引导键 <Mouse> t_PS 括号内粘贴的开始 xterm-bracketed-paste t_PS 't_PS' t_PE 括号内粘贴的结束 xterm-bracketed-paste t_PE 't_PE' 关于 t_so 和 t_mr 的 注意 事项: 如果 termcap 项目 "so" 不存在,则使用 "mr" 的 项目。反之亦然。"se" 和 "me" 也是一样。如果你的终端同时支持反转和突出模式,你 可以看到两种不同的模式。如果只支持其中一种,则两者看起来一样。 keypad-comma keypad 键在没有映射时和等价的普通键等价。但有一个特例: 如果你的 keypad 有逗号 而不是小数点,Vim 仍然认为那是小数点。下面的映射可以修正这个问题: :noremap <kPoint> , :noremap! <kPoint> , xterm-codes 得到键码有一个特殊的技巧,现在这只适用于 xterm。如果定义了 t_RV ,而且得到的 响应指示使用的版本是补丁级别不低于 141 的 xterm,Vim 就使用特殊的转义序列来从 xterm 里直接取得键码。响应的内容用于调整各种 t_ 代码。这样,xterm 可能根据所处 的模式 (8-位、VT102、VT220,等等) 产生不同代码的问题就避免了。结果是,<xF1> 这 样的代码就不需要了。 't_Co' 是其中一个可修改的代码,色彩数。这会触发重画。如果有问题,尽早复位 'xtermcodes' 选项: set noxtermcodes 注意: 请求键码只能在启动时完成。如果 xterm 选项在 Vim 启动以后被改变,这些转义 序列就不再能识别了。 xterm-true-color 只要终端支持,Vim 支持终端真彩 (使用 highlight-guifghighlight-guibg )。 为此,置位 'termguicolors' 选项。 https://gist.github.com/XVilka/8346728 有支持真彩的终端列表。 有时置位 'termguicolors' 还不够,还需要显式设置 t_8ft_8b 选项。这些选 项的缺省值分别是 "^[[38;2;%lu;%lu;%lum" 和 "^[[48;2;%lu;%lu;%lum",但只当 $TERMxterm 时才设置。有些终端也接受相同的序列,但把所有的分号替换为冒 号 (这样实际更兼容,但支持不是那么广泛): let &t_8f = "\<Esc>[38:2:%lu:%lu:%lum" let &t_8b = "\<Esc>[48: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' 转义序列。Vim 进入替换模式而 '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 启动之前的形状。 {仅当编译时加入 +cursorshape 特性才支持} termcap-title 如果终端允许通过发送字符串设置标题的话,'t_ts''t_fs' 选项用来设置窗口的标 题。在发送标题字符串之前和之后分别发送两者。类似的,'t_IS''t_IE' 用来设置 图标文本。这些是 Vim 内部对 Unix termcap 的扩展,所以它们的值不能从外部 termcap 获取。不过,内建的 termcap 包含 xterm 和 iris-ansi 的合适的项目,所以 你不需要在这里设置。 hpterm 如果反转和其他高亮方式不工作,尝试设置 't_xs' 选项为非空字符串。这使得 't_ce' 代码可以用于从行里撤销高亮。对 "hpterm" 这是必需的。置位 'weirdinvert' 选项和 设置 't_xs' 非空的相同的效果,反之亦然。 scroll-region 有些 termcap 不包括 "cs" (滚动区域) 的项目,尽管有些终端支持这一特性。比如, Sun 上的 xterm。你可以使用内建的 builtin_xterm 或者自己定义 t_cs。例如: :set t_cs=^V^[[%i%d;%dr 其中 ^V 是 CTRL-V,而 ^[ 是 <Esc>。 垂直滚动区域 t_CV 不是标准的 termcap 代码。Vim 在 GUI 里内部使用之。但是如果你 能找到支持这一特性的终端,也可以在终端里定义,两个参数分别是限制滚动的区域的左 边列和右边列。就像 t_cs 定义顶部行和底部行那样。定义 t_CV 会使得在垂直分割的窗 口里滚动窗口快很多。如果 t_da 或者 t_db 设置了,不要设置 t_CV (文本在滚动时不 会清除)。 不幸的是无法从 termcap 里推断光标定位应不应该使用滚动区域: 是相对于屏幕的开始 处,还是相对于滚动区域的开始处。大多数终端使用第一种方法。在光标定位相对于滚动 区域的情况下,'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 键盘的人,不要使用 F14,因为它和撤 销键有冲突;不要用 F15,因为它执行把窗口转到前台的操作;也不要用 F17,因为它关 闭窗口。其他系统上,你也许可以用这些键。)

3. 窗口大小 window-size

[这是关于 Vim 使用的整个窗口,不是用 ":split" 命令创建的那种窗口。(译者注: Vim 里的术语或者用屏幕更合适些。)] 如果你在 Amiga 上运行 Vim,而终端名是 "amiga" 或 "builtin_amiga",打开 amiga 专用的窗口大小调整技术。Unix 系统上,有三个方法可以得到窗口的大小: - ioctl 调用 (TIOCGSIZE 或者 TIOCGWINSZ,视乎你的系统而定) - 环境变量 "LINES" 和 "COLUMNS" - termcap 项目 "li" 和 "co" 如果所有这些都不行,假设缺省大小为 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 行。另外一个可能性是减少 Vim 使用的行数,通过 "z{height}<CR>" 命令。 如果终端的字符到达时间相距超过 1 秒,你也许希望设置 'timeout' 和/或 'ttimeout' 选项。见 "Options" 一章 options 。 如果你的终端不支持滚动区域,但是支持插入/删除行命令,多个窗口的滚动也许会使得 行跳上跳下。如果你不希望这样,置位 'ttyfast' 选项,它使得窗口重画,而不是行滚 动。 如果你的终端滚动很慢,但是重画却不慢,把 'ttyscroll' 设小一点,比如 3。这使得 Vim 在超过 3 行需要滚动时,重画屏幕而不是滚动。 如果你使用一个慢速的彩色终端,使用命令: hi NonText cterm=NONE ctermfg=NONE 这避免了空格在改变属性时被重复发送。大多数终端上,你反正也不会看到任何区别。 如果你在慢速的串行线上使用 Vim,你也许想要尝试在 "screen" 程序里运行 Vim。 screen 优化终端 I/O 挺不错的。 如果你在测试 termcap 选项,但是你看不到发生了什么,你也许希望设置 'writedelay' 选项。如果非零,每次给终端只发一个字符。这使得屏幕刷新变慢很多,从而能看清楚发 生了什么。

5. 使用鼠标 mouse-using

本节说明在终端或者终端窗口里如何使用鼠标。GUI 窗口里如何使用鼠标在 gui-mouse 里解释。关于使用鼠标滚轮进行滚动的部分见 scroll-mouse-wheel 。 不要忘记用以下命令打开鼠标: :set mouse=a 否则 Vim 不会在所有模式下识别鼠标 (见 'mouse')。 目前,鼠标只有在 Unix 的 xterm 窗口、带 sysmouse 的 *BSD 控制台、Linux 终端 (带 GPM gpm-mouse )、Windows 终端上才支持。鼠标键击可以用来定位光标,设置区域 并粘贴。 'mouse' 选项的字符决定 Vim 在什么场合下会使用鼠标: n 普通模式 v 可视模式 i 插入模式 c 命令行模式 h 在帮助文件里,以上所有的模式 a 以上所有的模式 r 跳过 hit-enter 提示 '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-服务器的剪贴板可用, x11-clientserver 的命令服务器可以在命令行用 --servername 打开。 xterm-copy-paste 注意: 在有些 (较老的) xterm 版本里,光标不能移动超过第 95 或 223 列。这是 xterm 的问题,不是 Vim 的。用新一点的 xterm 吧 color-xterm 。另见 'ttymouse'。 使用 xterm 粘贴/复制 (当前模式 包括在 'mouse' 里): 1. 在文本的第一个字符上按鼠标左键,移动鼠标到文本的最后一个字母,然后释放。 2. 使用普通的 Vim 命令把光标移动到待插入的位置。 3. 按 "a" 开始插入模式。 4. 按鼠标中键。 5. 按 ESC 退出插入模式。 (对包含在 'mouse' 里的模式,这里的操作同样可以完成,只要你在使用鼠标的时候按住 shift 键就行了。) 注意: 如果你在粘贴的时候丢失了第 8 位 (特殊字符被翻译成其他字符),你需要在启动 Vim 之前在外壳上执行 "stty cs8 -istrip -parenb"。 这样,在 xterm 上 shift 和 ctrl 键不能和鼠标一起使用。需要 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 上,双击相隔的时间可以通过 'mousetime' 选项设置。其他系统 上,该值只能在 Vim 之外定义。 一个使用双击跳转到光标所在的标签的例子: :map <2-LeftMouse> :exe "tag " .. expand("<cword>")<CR> 使用双击拖动鼠标 (按下按钮、抬起按钮、按下按钮、然后拖动) 会导致完整的多个单词 被选择,直到按钮被释放为止。这时选择重新以字符为单位。 gpm-mouse GPM 鼠标只有在编译时打开 +mouse_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 环境。 示例: :noremap <MiddleMouse> <LeftMouse><MiddleMouse> 在鼠标中键点击的位置粘贴 (不然,粘贴在光标所在的位置进行)。 :noremap <LeftRelease> <LeftRelease>y 在可视模式下立即抽出选择区。 注意使用了 ":noremap" 而不是 "map",以免发生递归映射。 :map <X1Mouse> <C-O> :map <X2Mouse> <C-I> 把 X1 和 X2 键定义为跳转表的前进和后退,见 CTRL-OCTRL-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: