¿Cuál es el valor correcto de $TERM para ansi-term de emacs, especialmente si 'eterm-color' no está disponible después de SSH?

¿Cuál es el valor correcto de $TERM para ansi-term de emacs, especialmente si 'eterm-color' no está disponible después de SSH?

Actualmente estoy configurando $TERMen xterm-256color:

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

Solía ​​tenerlo configurado en eterm-color, pero el problema es que este tipo de terminal no está disponible en la mayoría de las máquinas en las que inicio sesión a través de SSH.

El valor predeterminado .bashrcen Ubuntu comprueba si la TERMvariable comienza con xterm-, en cuyo caso intenta establecer el título de la ventana:

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

El problema es el \[\e]0;bit. Debería ser analizado por emuladores de terminal compatibles con xterm, pero emacs (ansi-term) no hace eso. El resultado de lo cual es una terminal como esta:

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

También rompe algunas aplicaciones que usan readline, cuando el texto escrito es más grande que el ancho del terminal.

Debido a que eterm-colorno está disponible en algunos hosts remotos (y tampoco puedo instalarlo), configurarlo en ese valor estropea cosas como less.

¿Hay algún truco que pueda usar, como otro tipo de terminal que se envíe con la mayoría de las distribuciones o un truco que haga que ansi-term reconozca?los códigos de escape relevantesy establecer el título, o simplemente descartarlos?

Respuesta1

Desarrollé un enfoque que le permite averiguar específicamente qué terminales están disponibles en el host remoto y luego configurarlo. Normalmente hay al menos un terminal compatible con ansi, por lo que un 'hack' para falsificarlo debería ser innecesario.

Hecho con un comando ssh largo, se verá así:

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$ || exportar TERM=xterm && emacs -nw"

Esto busca diferentes tipos de terminales compatibles con ANSI (y no compatibles) en orden de preferencia en el host remoto y configura el primero encontrado antes de iniciar EMACS. Configura TERM para que utilice el tipo 'xterm' si no se encuentra ninguno de nuestros tipos preferidos, lo que garantiza que EMACS realmente se inicie.

En este ejemplo, busco eterm-color, aterm, ansi y xterm-256color en ese orden. No soy un gran usuario de EMACS, así que no estoy seguro de que sean realmente los mejores. Probé este lanzamiento en CentOS y funcionó bien (encontré eterm-color en mis pruebas).

Creo que terminfo está en el mismo lugar en la mayoría/todas las variantes de Linux, pero puedes agregar más rutas para buscar de la misma manera que agregarías más terminales, agregando más

|| ls -1R /a/diferente/ruta | grep ^algún otro terminal$
prueba condicional y tuberías.

Respuesta2

Dado su problema, recomendaría configurar TERMvt100. Se instala en todas partes, incluso en ncurses-baseel paquete de Debian. Las alternativas mencionadas en la respuesta sugerida (ansi, aterm, xterm-256color) tienen diferencias que ejercitarán características ausentes en eterm-color.

Además, la función de cadena de título no forma parte de la descripción del terminal. Sus aplicaciones remotas lo utilizan según la configuración de TERM, por ejemplo, cualquier cosa que utilice "xterm".

Técnicamente perderías color (después de todo,Los vt100 nunca hicieron color.). Algunas aplicaciones hacen esto de todos modos.

información relacionada