VIM 奇怪的行为 F1-10

Pre*_*117 3 terminal vim gvim xterm

最近我开始在 VIM 中遇到一个非常烦人的行为:

无论我是在插入模式还是普通模式下,如果我按下 F 键之一,vim 都不会做它通常打算做的事情:

F1 - inserts a "P"
F2 - inserts a "Q"
F3 - inserts a "R"
F4 - inserts a "S"
F5-10 - inverts case
Run Code Online (Sandbox Code Playgroud)

使用 GVim 时,一切都按预期工作。有什么建议?我在 Ubuntu Maverick 10.10 上使用 7.3 版。使用终止符但更改为默认终端无济于事。

ZyX*_*ZyX 8

这是因为终端将 X 事件转换为如下转义序列:

<F1> -> ^[OP
<F2> -> ^[OQ
<F3> -> ^[OR
<F4> -> ^[OS
<F5> -> ^[[15~
<F6> -> ^[[17~
Run Code Online (Sandbox Code Playgroud)

等等(^[是一个转义字符)。在某些终端中,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
Run Code Online (Sandbox Code Playgroud)

如果您的代码与我用作示例的代码不同,请使用<C-v><F1>(在插入或命令行模式下)获取终端发送的内容(更多信息参见:h i_CTRL-V)。