当我按下<s-f2>
按键执行nnoremap <s-f2> :set number!
映射时,Vim 打开上面的“插入”模式 ( O
) 并键入1;2Q
字符串。为了查看整个终端键代码(不被“正常”模式中途吃掉),我点击<c-v><s-f2>
“插入”模式并得到^[O1;2Q
,字符^[
在哪里<esc>
。
即使读完之后“在终端 Vim 中映射快速键码”我不明白为什么^[O1;2Q
终端键代码没有映射到<s-f1>
Vim代码。因此我在我的~/.vimrc
文件中定义了以下函数:
function! s:Mod_fix_shift_fkey()
let a=0
let b='PQRS'
while a < 4
exec 'set <s-f' . (a + 1) . ">=\eO1;2" . b[a]
let a+=1
endwhile
endfunction
<s-f1>
通过调用它,我修复了从到 的移动功能键<s-f4>
,并且绑定到 的映射<s-f2>
突然起作用了。
有人可以解释一下吗?
另外,我还必须将移动的功能键从 修复<s-f5>
为<s-f12>
:
"...
let a=5
let b='1517181920212324'
let c=0
while a < 16
exec 'set <s-f' . a . ">=\e[" . b[c : c + 1] . ';2~'
let a+=1
let c+=2
endwhile
"...
以及从<c-s-f1>
到<c-s-f4>
和<c-s-f5>
到<c-s-f12>
控制转移功能键,例如:
" ...
exec 'map <esc>O1;6' . b[a] ' <c-s-f' . (a + 1) . '>'
" ...
exec 'map <esc>[' . b[c : c + 1] . ';6~ <c-s-f' . a . '>'
" ...
答案1
你可以使用特殊的通配符语法来:set <Key>
让Vim自动识别xterm-样式修改键:
if &term =~ '^gnome'
execute "set <xUp>=\e[1;*A"
execute "set <xDown>=\e[1;*B"
execute "set <xRight>=\e[1;*C"
execute "set <xLeft>=\e[1;*D"
execute "set <xHome>=\e[1;*H"
execute "set <xEnd>=\e[1;*F"
execute "set <PageUp>=\e[5;*~"
execute "set <PageDown>=\e[6;*~"
execute "set <F1>=\eOP"
execute "set <F2>=\eOQ"
execute "set <F3>=\eOR"
execute "set <F4>=\eOS"
execute "set <xF1>=\eO1;*P"
execute "set <xF2>=\eO1;*Q"
execute "set <xF3>=\eO1;*R"
execute "set <xF4>=\eO1;*S"
execute "set <F5>=\e[15;*~"
execute "set <F6>=\e[17;*~"
execute "set <F7>=\e[18;*~"
execute "set <F8>=\e[19;*~"
execute "set <F9>=\e[20;*~"
execute "set <F10>=\e[21;*~"
execute "set <F11>=\e[23;*~"
execute "set <F12>=\e[24;*~"
endif
参见:help xterm-function-keys
和:help xterm-modifier-keys
。
答案2
@chris-johnsen 的脚本看起来好像可以工作,但解释有一些问题:
- 首先,vim 是一个术语帽应用。它使用 termcap 接口,例如 ncurses 的接口。
- ncurses 提供功能键的名称,但 termcap 应用程序只能看到标准名称。
- 大多数移位功能键是扩展能力,如终端数据库中所述。
- 您感兴趣的内容在xterm 部分其中注释
# 大多数 xterm 扩展都是针对功能键的。自从补丁#94(在 # 1999), xterm 支持 shift/control/alt/meta 修饰符,这些修饰符会产生 # 附加功能键字符串。其他一些开发者复制了该功能, # 尽管他们没有遵循 xterm 在补丁 #167(2002 年)中的领先地位, # 这些关键定义不太含糊。
- 中提到的变更补丁 #167交换参数为修饰语和关键代码,以避免修饰符可能被误认为是光标键的重复计数的问题(在
emacs
另一个 termcap 应用程序中)。 - 在 xterm 中进行更改并没有对 vim 产生太大影响,因为(毫不奇怪)它使用了 中引入的不同扩展“tcap-query”补丁 #148xterm 的。
- 在 gnome-terminal 或 konsole 中使用 vim,它缺乏“tcap-query”功能,并且无法知道功能键发送的内容(除了用户填写键绑定信息之外)。
- 由于 gnome-terminal 和 konsole (不确定哪个是“第一个”,因为两者都没有很好地记录事情)从 xterm 复制了早期的行为,这产生了至少十年的错误报告(例如这个问题)。顺便说一句,ncurses 为这些终端提供了正确的终端描述,但这些终端大部分未被使用。标准化就这么多。
沿着标准化路线:
- 没有“标准”来说明将发送哪些功能键。
- xterm 始于(无论如何,从 20 世纪 90 年代初),带有 vt220 键盘的扩展。 vt220定义了F6-F20。 F1-F5 是“本地”。任何外面的事情都是后来发生的。
- 扩展的动机最初来自 PC 键盘(有 12 个功能键),它不能均匀地划分为 20 个。所以 xterm 有 24 个键,使用了 Shift(最初)。
- F1-F4 很特殊,因为它们还用于为 xterm 的 vt100 仿真提供 PF1-PF4。它们以 P、Q、R、S 结尾,而不是
"~"
。考虑到转变,这增加了问题中提到的怪癖之一。 - 控制-,元-,后来出现,例如,补丁 #94。与其让 12 个实际键看起来像 24 个,不如得到 48 个(控制键和 Shift 键),并剩下一些(以适应 terminfo/termcap 60 个功能键的限制)。
- 最初没有理由为额外的键发明名称,但随后向其他特殊键(光标和编辑键盘)添加了修饰符。
- (大约在同一时间)有一个ncurses 扩展提供扩展名称。
- 虽然设计了一些扩展功能(例如
AX
)以便可以从 termcap 进行测试,没有任何扩展特殊键的数量可以使用 termcap 接口进行测试。