Problema com a tecla de atalho Ctrl no Emacs no gnome-terminal

4

Eu quero ser capaz de voltar e avançar entre dois buffers no Emacs da mesma forma que eu posso alternar entre as guias em alguns outros editores. A seguinte ligação de teclas Ctrl + TAB funciona bem em XEmacs :

(defun buffer-shimmy ()
  "Back to the previous buffer"
  (interactive)
  (let ((buff (car (buffer-list))))
    (message "Previous buffer: %s" buff)
    (switch-to-buffer (other-buffer buff))
   )
)
(global-set-key (kbd "<C-tab>") 'buffer-shimmy)
;; or (define-key global-map [(control tab)] 'buffer-shimmy) 

No entanto, ele não funciona quando eu abro o Emacs usando o "emacs -nw " (ou se estou usando o Emacs em uma sessão SSH).

Depois de encontrar este link - eu acho talvez o que eu quero não seja possível?

Aparentemente, no terminal (ou seja, fora do sistema de janelas), a adição de um modificador de controle ao caractere ASCII para 'TAB' é sem sentido. Considerando que, se for através de um sistema de janelas, o Emacs pode ver você pressionando Ctrl + TAB como <tab> com um modificador de controle, que pode ser representado no arquivo .emacs como C-<tab> ou <C-tab> ou [(control tab)] .

Existe uma solução que corrija esse problema?

Software de referência: Emacs versão: 22.2.1 no Ubuntu 9.04 usando o gnome-terminal com o perfil padrão.

    
por Tom 05.11.2009 / 13:12

1 resposta

6

Infelizmente, não existe uma solução única para isso para o cliente emacs em execução em uma janela de terminal. O problema surge porque o caractere <TAB> é definido como CTRL-I , então CTRL-<TAB> significaria CTRL-CTRL-I e, portanto, não é possível.

Quando o emacs está sendo executado no modo de janela, ele recebe sua entrada diretamente das teclas pressionadas. Quando é executado dentro de um terminal (ou se torna as coisas mais claras porque não funciona - em uma conexão ssh), a entrada vem do terminal I / O. É o programa terminal que lê os eventos de chave de hardware e gera o fluxo de entrada (não muito preciso, mas destaca o problema). O Emacs lê o fluxo de entrada e converte em eventos de pressionamento de tecla. Como o emacs não pode acessar os eventos de chave de hardware, ele é limitado pelas restrições do ambiente do terminal.

Para alguns programas de terminal, pode ser possível gerar uma sequência de entrada personalizada (por exemplo, quando você pressiona F1 ) quando pressiona CTRL-<Tab> , que pode ser interpretado pelo Emacs como CTRL-<Tab> . Um exemplo de snippet para fazer isso para CTRL-<Home> é:

(when (not window-system)
  ; Fixup missing console keys
  (define-key key-translation-map (kbd "M-[ 4 ^") (kbd "C-<end>"))
  (define-key key-translation-map (kbd "M-[ 1 ^") (kbd "C-<home>")))

Neste exemplo, M-[ 1 ^ é a sequência de entrada gerada quando eu pressiono CTRL-<Home> no meu terminal.

Não é uma solução muito portátil (eu uso principalmente putty para acessar minha caixa de linux a partir do Windows, e não permite isso), então sua milhagem pode variar.

No final, decidi usar outra ligação de chave no meu .emacs e deixar a memória muscular de CTRL-<TAB> morrer.

    
por 26.02.2011 / 18:22