Qual é o valor correto de $ TERM para o prazo do emacs, especialmente se 'eterm-color' não estiver disponível após o SSH?

7

Atualmente, estou definindo $TERM para xterm-256color :

if [[ -n "$EMACS" ]]; then
    export TERM=xterm-256color
    alias emacs="emacsclient --no-wait"
    export EDITOR="emacsclient --no-wait"
    export VISUAL="emacsclient"
fi

Eu costumava tê-lo definido como eterm-color , mas o problema é que este tipo de terminal não está disponível na maioria das máquinas que eu logar via SSH.

O padrão .bashrc no Ubuntu verifica se a variável TERM começa com xterm- , caso em que tenta definir o título da janela:

PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

O problema é o \[\e]0; bit. Ele deve ser analisado por emuladores de terminal compatíveis com xterm, mas o emacs (ansi term) não faz isso. O resultado disso é um terminal como este:

0;user@host: ~user@host:~$ 

Ele também quebra alguns aplicativos usando readline , quando o texto digitado é maior que a largura do terminal.

Como eterm-color não está disponível em alguns hosts remotos (e também não consigo instalá-lo), configurá-lo com esse valor atrapalha itens como less .

Existe algum truque que eu possa usar, como outro tipo de terminal que vem com a maioria das distribuições ou um hack que faz o ansi-term reconhecer os códigos de escape relevantes e definir o título, ou apenas descartá-los?

    
por Stefano Palazzo 23.09.2013 / 09:49

2 respostas

3

Eu desenvolvi uma abordagem que permite descobrir especificamente quais terminais estão disponíveis no host remoto e, em seguida, configurá-lo. Normalmente, há pelo menos um terminal compatível com ansi, portanto, um "hack" para falsificar deve ser desnecessário.

Feito em um comando ssh long'ish, parecerá algo assim:

ssh -i ~/.ssh/some_key.pub -tty some_remote_server "export TERM='ls -1R /usr/share/terminfo | grep ^eterm-color$ || ls -1R /usr/share/terminfo | grep ^aterm$ || ls -1R /usr/share/terminfo | grep ^ansi$ || ls -1R /usr/share/terminfo | grep ^xterm-256color$ || export TERM=xterm && emacs -nw"

Ele encontra diferentes tipos de terminal compatíveis com ansi (e não compatíveis) em uma ordem de preferência no host remoto e define o primeiro encontrado antes de iniciar o EMACS. Ele define TERM para usar o tipo 'xterm' se nenhum dos nossos tipos preferidos for encontrado, garantindo que o EMACS realmente seja iniciado.

Neste exemplo, estou procurando eterm-color, aterm, ansi e xterm-256color nessa ordem. Eu não sou um usuário pesado do EMACS, então não tenho certeza se eles são realmente os melhores. Eu testei esse lançamento no CentOS e trabalhei bem (encontrei o eterm-color no meu teste).

Acredito que o terminfo esteja no mesmo lugar na maioria das variantes do Linux, mas você pode adicionar mais caminhos para pesquisar da mesma maneira que adicionaria mais terminais, adicionando mais

 || ls -1R /a/different/path | grep ^someotherterminal$ 
teste condicional e tubulações.     
por 30.09.2013 / 20:36
2

Dado o seu problema, eu recomendaria definir o TERM para vt100. Ele é instalado em qualquer lugar, mesmo no pacote ncurses-base do Debian. As alternativas mencionadas na resposta sugerida (ansi, aterm, xterm-256color) possuem diferenças que exercitarão características ausentes em eterm-color .

Além disso, o recurso de string de título não faz parte da descrição do terminal. Seus aplicativos remotos estão usando com base na configuração de TERM , por exemplo, qualquer coisa usando "xterm".

Tecnicamente você perderia a cor (afinal, vt100 nunca coloriu ). Algumas aplicações fazem isso de qualquer maneira.

    
por 25.09.2016 / 01:28