A execução do emacs no GNU Screen sobrescreve as configurações do .emacs para a ligação de teclas [home] no FreeBSD 8.2

1

Se eu usar o seguinte arquivo .emacs, posso ir para o início / fim da linha atual usando as teclas home / end como seria de esperar.

(keyboard-translate ?\C-h ?\C-?)

(add-to-list 'load-path "/home/sam/programs/go/go/misc/emacs/" t)
(require 'go-mode-load)

(global-set-key [kp-home]  'beginning-of-line) ; [Home]
(global-set-key [home]     'beginning-of-line) ; [Home]

(global-set-key [kp-end]  'end-of-line) ; [End]
(global-set-key [end]     'end-of-line) ; [End]

No entanto, se eu abrir uma sessão de tela, ela não funcionará assim (a tecla [home] ainda me leva ao início do buffer por algum motivo).

Aqui está o meu arquivo .screenrc, se alguém puder detectar algo estranho:

term xterm
defutf8 on
defflow off
startup_message off

# terminfo and termcap for nice 256 color terminal
# allow bold colors - necessary for some reason
attrcolor b ".I"

# tell screen how to set colors. AB = background, AF=foreground
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'

#use bash as the default login shell
defshell -bash

EDIT: Aparentemente, usando M-x describe-key (como nschum sugerido) diz que [begin] está sendo acionado quando eu pressiono a tecla home no meu teclado ao executar o emacs dentro da tela. Quando eu executo o emacs fora da tela, descreva-chave se refere a [home] como esperado. Parece que o "defutf8 on" é a única entrada relacionada ao teclado no meu .screenrc - há mais alguma coisa lá que possa estar causando problemas?

    
por javanix 21.06.2011 / 16:53

1 resposta

0

Quando você executa um programa em screen , o programa screen pode (e vai) fazer isso:

  • screen tem sua própria descrição de terminal. Ele tenta mapear (converter) as seqüências-chave do terminal subjacente para isso.
  • A conversão não está completa. Como solução alternativa, screen procura descrições de terminal personalizadas iniciando com screen.$TERM . ncurses fornece alguns úteis.
  • screen filtra (ignora) algumas sequências chave que não se encaixam em sua noção de como a entrada deve ser feita.

Provavelmente, o seu problema está no primeiro caso. Se você fizer

infocmp xterm screen

(presumindo que você esteja usando o valor mais frequentemente sugerido para TERM , se você está usando xterm ), você pode notar algumas linhas como esta:

kend: '\E[4~', '\EOF'.
khome: '\E[1~', '\EOH'.

A última coluna é a sequência ( \E é o caractere escape ) que screen enviará ao seu programa quando receber a coluna do meio de xterm , etc.

O problema com o .screenrc é que substitui o $TERM valor para xterm , confundindo screen :

term xterm

Você poderia supor que a conversão seria completa, mas o teste mostra que não é. Esse tipo de problema é porque ncurses fornece entradas customizadas. Por exemplo, esta entrada do banco de dados ncurses é a que entra em vigor no meu máquina, dado que .screenrc configuração (porque "xterm" é aliased para "xterm-new"):

screen.xterm-xfree86|screen.xterm-new|screen customized for modern xterm,
        bce@, bw,
        invis@, kIC@, kNXT@, kPRV@, meml@, memu@,
        sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m,
        E3@, use=screen+italics, use=screen+fkeys, use=xterm-new,

você pode notar o use=screen+fkeys . Isso significa: vá em frente e use as chaves que screen usará, pois é a solução mais simples. Agora há um problema sutil: screen+fkeys se parece com isso:

screen+fkeys|function-keys according to screen,
        kend=\E[4~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kfnd@,
        khome=\E[1~, kslt@,

porque (na tela de teste), ele enviou essas chaves em vez do que estava na descrição externa do terminal $TERM . O $TERM interno está definido como xterm , mas screen usa essa entrada intermediária quando transmite chaves especiais como home / end para sua sessão.

    
por 03.05.2015 / 12:40