Linux - remapear Ctrl- [tecla

3

No Linux, a combinação de teclas Ctrl - [ parece ser equivalente a pressionar a tecla Esc . Eu gostaria de definir o Ctrl - [ como um atalho no Emacs, mas não consigo porque no momento em que o pressionamento de tecla chega ao Emacs ele se parece com o Esc A tecla foi pressionada. Existe alguma maneira de desabilitar esse comportamento para que Ctrl - [ simplesmente signifique Ctrl - [?

Executando o Ubuntu 9.10 com o GNOME.

    
por Linger 09.08.2010 / 18:13

2 respostas

5

Supondo que você esteja executando o Emacs diretamente sob um sistema de janelas (Cocoa, MS-DOS, Windows, X, ...) e não dentro de um terminal de texto (gnome-terminal, konsole, rxvt, xterm, ...) é possível.

(define-key key-translation-map [?\C-\[] [(control left_bracket)])
(define-key key-translation-map [escape] [?\e])
(define-key function-key-map [escape] nil)
(define-key function-key-map [?\e] nil)
(when (boundp 'local-function-key-map)
  ;;(define-key local-function-key-map [escape] nil)
  (defun remove-escape-from-local-function-key-map ()
    (define-key local-function-key-map [?\e] nil)
    (define-key local-function-key-map [escape] nil))
  (add-hook 'term-setup-hook 'remove-escape-from-local-function-key-map))

Existem três eventos de entrada diferentes em jogo aqui:

  • Ctrl + [, ou seja, o modificador control junto com uma chave que envia o caractere [ . O Emacs normalmente mostraria isso como C-[ (e C-[ aceito por kbd ), se não tivesse um caso especial para isso, como explicado abaixo.

  • Número do caractere 27, que é enviado pela tecla Esc em alguns sistemas. O Emacs mostra isso como ESC ao exibir sequências de teclas e \e em sequências.

  • A própria chave Esc (no X Window, isso significa que o Escape keysym). O Emacs mostra isso como escape , a menos que seja traduzido (veja abaixo).

O Emacs normalmente traduz escape em ESC , mas isso é feito em um nível relativamente alto, em function-key-map , então pode ser substituído modificando function-key-map ou definindo um ligação para escape no mapa de teclado global ou em um mapa de teclado local. O GNU Emacs 23 introduz o local-function-key-map , que se aplica por tipo de terminal.

O Emacs sempre traduz C-[ em ESC , em um nível muito baixo (em keyboard.c ). Isso não é configurável.

No entanto, o Emacs fornece uma maneira de traduzir chaves em um nível relativamente baixo: key-translation-map . Isso se aplica antes de qualquer ligação global ou local, mas apenas para chaves que não estão em function-key-map . Então, o truque é trocar ESC e escape nesse ponto.

Estes mecanismos são descritos no manual Emacs Lisp sob o cabeçalho "Translation keymaps".

Aliás, princípios semelhantes se aplicam a

  • C-i , TAB , \t tab
  • C-m , RET , \r , return
por 10.08.2010 / 00:13
0

Dependendo do seu xterm, você pode usar bindkey . Tente executar este comando no prompt do shell:

bindkey ^] tty-dsusp
    
por 09.08.2010 / 19:21