如何修复 gnome-terminal 中 xterm 中 vim 中的移动功能键?

如何修复 gnome-terminal 中 xterm 中 vim 中的移动功能键?

当我按下<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 接口进行测试。

相关内容