Was ist der richtige Wert von $TERM für Ansi-Term von Emacs, insbesondere wenn „eterm-color“ nach SSH nicht verfügbar ist?

Was ist der richtige Wert von $TERM für Ansi-Term von Emacs, insbesondere wenn „eterm-color“ nach SSH nicht verfügbar ist?

Ich stelle derzeit ein $TERMauf xterm-256color:

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

Früher hatte ich es auf eingestellt eterm-color, aber das Problem ist, dass dieser Terminaltyp auf den meisten Maschinen, bei denen ich mich über SSH anmelde, nicht verfügbar ist.

Standardmäßig .bashrcprüft Ubuntu, ob die TERMVariable mit beginnt xterm-. In diesem Fall versucht es, den Fenstertitel festzulegen:

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

Das Problem ist das \[\e]0;Bit. Es sollte von xterm-kompatiblen Terminalemulatoren analysiert werden, aber Emacs (Ansi-Term) tut das nicht. Das Ergebnis ist ein Terminal wie dieses:

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

Es bricht auch einige Anwendungen ab readline, wenn der eingegebene Text größer als die Breite des Terminals ist.

Weil eterm-colores auf manchen Remote-Hosts nicht verfügbar ist (und ich es auch nicht installieren kann), bringt das Festlegen dieses Werts Dinge wie durcheinander less.

Gibt es einen Trick, den ich verwenden kann, z. B. einen anderen Terminaltyp, der mit den meisten Distributionen geliefert wird, oder einen Hack, der ansi-term erkenntdie entsprechenden Escape-Codesund den Titel festlegen oder einfach verwerfen?

Antwort1

Ich habe einen Ansatz ausgearbeitet, mit dem Sie gezielt herausfinden können, welche Terminals auf dem Remote-Host verfügbar sind, und diese dann einrichten können. Normalerweise gibt es mindestens ein ANSI-kompatibles Terminal, sodass ein „Hack“, um es vorzutäuschen, unnötig sein sollte.

Mit einem einzigen längeren SSH-Befehl erledigt, sieht es ungefähr so ​​aus:

ssh -i ~/.ssh/ein_Schlüssel.pub -tty ein_entfernter_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"

Dies findet verschiedene ANSI-kompatible (und nicht kompatible) Terminaltypen in einer bevorzugten Reihenfolge auf dem Remote-Host und legt den ersten gefundenen fest, bevor EMACS gestartet wird. Es legt TERM so fest, dass der Typ „xterm“ verwendet wird, wenn keiner unserer bevorzugten Typen gefunden wird, wodurch sichergestellt wird, dass EMACS tatsächlich gestartet wird.

In diesem Beispiel suche ich in dieser Reihenfolge nach eterm-color, aterm, ansi und xterm-256color. Ich bin kein intensiver EMACS-Benutzer und bin mir daher nicht sicher, ob dies wirklich die besten sind. Ich habe diesen Start unter CentOS getestet und er hat gut funktioniert (bei meinen Tests wurde eterm-color gefunden).

Ich glaube, dass die Terminfo bei den meisten/allen Linux-Varianten an der gleichen Stelle ist, aber Sie können weitere Suchpfade auf die gleiche Weise hinzufügen, wie Sie weitere Terminals hinzufügen würden, indem Sie weitere

|| ls -1R /a/anderer/Pfad | grep ^irgendeinanderesTerminal$
bedingter Test und Pipes.

Antwort2

Angesichts Ihres Problems würde ich empfehlen, auf TERMvt100 zu setzen. Es ist überall installiert, sogar im Debian- ncurses-basePaket. Die in der vorgeschlagenen Antwort genannten Alternativen (ansi, aterm, xterm-256color) weisen Unterschiede auf, die Funktionen nutzen, die in fehlen eterm-color.

Außerdem ist die Titelzeichenfolgenfunktion nicht Teil der Terminalbeschreibung. Ihre Remoteanwendungen verwenden sie basierend auf der Einstellung von TERM, z. B. alles, was „xterm“ verwendet.

Technisch gesehen würde man Farbe verlieren (schließlichVT100 hat nie Farbe gemacht). Einige Anwendungen tun dies trotzdem.

verwandte Informationen