Como corrigir as teclas de função deslocadas no vim no xterm no gnome-terminal?

4

Quando eu pressiono a tecla <s-f2> para executar meu mapeamento nnoremap <s-f2> :set number! , o Vim abre seu modo "Inserir" acima ( O ) e digita a string 1;2Q . Para ver todo o código de chave do terminal - não comido na metade do caminho pelo modo "Normal" - eu atingi <c-v><s-f2> no modo "Inserir" e recebo ^[O1;2Q , onde ^[ é o caractere <esc> .

Mesmo depois de ler o "Códigos de códigos de mapeamento rápido no terminal Vim" não entendo por que o terminal ^[O1;2Q O código da chave não está mapeado para o código <s-f1> Vim. Por isso, defini a seguinte função no meu arquivo ~/.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

Ao chamá-lo, corrijo as teclas de função deslocadas de <s-f1> para <s-f4> e o mapeamento vinculado a <s-f2> funciona de repente.

Alguém pode explicar?

Também precisei corrigir as teclas de função deslocadas de <s-f5> para <s-f12> como:

  "...
  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
  "...

E de <c-s-f1> a <c-s-f4> e <c-s-f5> a <c-s-f12> as teclas de função com deslocamento de controle como:

" ...
exec 'map <esc>O1;6' . b[a] ' <c-s-f' . (a + 1) . '>'
" ...
exec 'map <esc>[' . b[c : c + 1] . ';6~ <c-s-f' . a . '>'
" ...
    
por Tim Friske 13.12.2012 / 04:28

2 respostas

2

Você pode usar uma sintaxe curinga especial com :set <Key> para permitir que o Vim reconheça automaticamente as chaves modificadas no estilo 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

Veja :help xterm-function-keys e :help xterm-modifier-keys .

    
por 14.12.2012 / 05:57
1

O script de @ chris-johnsen parece que funcionaria, mas a explicação tem alguns problemas:

  • Para começar, o vim é um aplicativo termcap . Ele usa a interface termcap, por exemplo, de ncurses.
  • ncurses fornece nomes para as teclas de função, mas os aplicativos termcap podem ver apenas os nomes padrão.
  • a maioria das teclas de função deslocados são capacidades alargadas , como observado no o banco de dados do terminal.
  • aquelas em que você está interessado estão na seção no xterm , que menciona
    # Most of the xterm extensions are for function-keys.  Since patch #94 (in
    # 1999), xterm has supported shift/control/alt/meta modifiers which produce
    # additional function-key strings.  Some other developers copied the feature,
    # though they did not follow xterm's lead in patch #167 (in 2002), to make
    # these key definitions less ambiguous.
  • a alteração mencionada no patch # 167 trocou os parâmetros do modificador e keycode , para evitar o problema de o modificador ser confundido com uma contagem de repetição para as teclas do cursor (em emacs , outro aplicativo termcap).
  • fazer a mudança no xterm não afetou muito o vim, porque (não é surpresa) ele estava usando uma extensão diferente "tcap-query" introduzida em patch # 148 do xterm.
  • usando o vim no gnome-terminal ou no konsole, ele não tinha o recurso "tcap-query" e não tinha como saber o que as teclas de função enviavam (além de os usuários preencherem as informações de ligação de chaves).
  • desde o gnome-terminal e o konsole (não tem certeza de qual foi o "primeiro" pois nem documenta as coisas tão bem) copiou o comportamento anterior do xterm, isso produziu pelo menos dez anos de relatórios de bug (como essa questão). A ncurses, a propósito, forneceu as descrições corretas dos terminais para esses terminais, que eram em grande parte não utilizados. Tanto para padronização.

Ao longo da linha de padronização:

  • não há "padrão" como tal, que indica quais teclas de função serão enviadas.
  • O
  • xterm começou (a partir do início dos anos 90, de qualquer forma), com uma extensão do teclado vt220. O vt220 definiu F6-F20. F1-F5 eram "locais". Qualquer coisa fora disso veio depois.
  • a motivação para estender veio inicialmente de teclados de PC (com 12 teclas de função), que não se dividem uniformemente contra 20. Então o xterm tem 24 teclas, usando o deslocamento (inicialmente).
  • F1-F4 eram especiais porque também eram usados para fornecer PF1-PF4 para a emulação vt100 do xterm. Aqueles terminam com P, Q, R, S em vez de "~" . Levando em conta a mudança, isso acrescentou uma das peculiaridades observadas na pergunta.
  • control-, meta-, veio mais tarde, por exemplo, no patch # 94 . Em vez de fazer com que 12 chaves reais parecessem 24, era possível obter 48 (controle e deslocamento) com algumas sobras (para caber no limite terminfo / termcap de 60 teclas de função).
  • Inicialmente, não havia motivo para inventar nomes para as chaves extras, mas a adição de modificadores às outras teclas especiais (teclas de cursor e edição) seguiu.
  • ajudou o fato de haver (na mesma época) uma extensão ncurses para fornecer os nomes estendidos .
  • enquanto alguns recursos estendidos (como AX ) são projetados para que possam ser testados a partir do termcap, nenhum das chaves especiais estendidas podem ser testadas usando a interface termcap.
por 28.03.2016 / 00:27