最近我在 VIM 中遇到了一个非常烦人的行为:
无论我处于插入模式还是正常模式,如果我按下其中一个 F 键,vim 都不会执行通常要执行的操作:
F1 - inserts a "P"
F2 - inserts a "Q"
F3 - inserts a "R"
F4 - inserts a "S"
F5-10 - inverts case
使用 GVim 时一切都按预期工作。有什么建议吗?我在 Ubuntu Maverick 10.10 上使用 7.3 版本。使用 terminator 但更改为默认终端没有帮助。
答案1
这是因为终端将 X 事件转换为如下的转义序列:
<F1> -> ^[OP
<F2> -> ^[OQ
<F3> -> ^[OR
<F4> -> ^[OS
<F5> -> ^[[15~
<F6> -> ^[[17~
等等(^[
是转义字符)。在某些终端中,vim 能够从 terminfo 数据库中获取这些序列,但有时 terminfo 数据库与实际发送的字符不匹配或不包含key_f*
条目。在这种情况下,按下<F1>
将导致获得转义(退出当前模式,除非它是正常模式),O
(在正常模式下:在光标行之前创建一个新行并进入插入模式)和插入到新行的一些字符(对于<F5>-...
键来说~
,是反转大小写的命令)。您可以通过在 vimrc 中输入类似以下内容来修复它
" Condition should identify terminal in question so "
" that it won't change anything for terminals without this problem "
if !has("gui_running") && $TERM is "xterm"
for [key, code] in [["<F1>", "\eOP"],
\["<F2>", "\eOQ"],
\["<F5>", "\e[15~"],
\]
execute "set" key."=".code
endfor
endif
如果您的代码与我用作示例的代码不同,请使用<C-v><F1>
(在插入或命令行模式下)获取您的终端发送的内容(更多信息:h i_CTRL-V
)。