Каково правильное значение $TERM для ansi-term emacs, особенно если eterm-color недоступен после SSH?

Каково правильное значение $TERM для ansi-term emacs, особенно если eterm-color недоступен после SSH?

В настоящее время я $TERMустанавливаю xterm-256color:

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

Раньше я устанавливал значение eterm-color, но проблема в том, что этот тип терминала недоступен на большинстве машин, на которые я вхожу через SSH.

По умолчанию .bashrcв Ubuntu проверяется, TERMначинается ли переменная с xterm-, и в этом случае она пытается установить заголовок окна:

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

Проблема в \[\e]0;бите. Он должен анализироваться совместимыми с xterm эмуляторами терминала, но emacs (ansi-term) этого не делает. Результатом чего является такой терминал:

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

Это также нарушает работу некоторых приложений, использующих readline, когда набираемый текст больше ширины терминала.

Поскольку eterm-colorон недоступен на некоторых удаленных хостах (и я тоже не могу его установить), установка этого значения портит такие вещи, как less.

Есть ли какой-нибудь трюк, который я могу использовать, например, другой тип терминала, который поставляется с большинством дистрибутивов, или хак, который заставляет ansi-term распознаватьсоответствующие коды выходаи задать заголовок или просто отбросить их?

решение1

Я разработал подход, который позволяет вам узнать, какие конкретно терминалы доступны на удаленном хосте, а затем установить их. Обычно есть по крайней мере один совместимый с ansi терминал, поэтому 'хак' для его подделки не должен быть излишним.

Если выполнить одну длинную команду ssh, то это будет выглядеть примерно так:

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"

Это находит различные совместимые с ansi (и несовместимые) типы терминалов в порядке предпочтения на удаленном хосте и устанавливает первый найденный перед запуском EMACS. Это устанавливает TERM для использования типа 'xterm', если ни один из наших предпочтительных типов не найден, гарантируя, что EMACS действительно запустится.

В этом примере я ищу eterm-color, aterm, ansi и xterm-256color в таком порядке. Я не заядлый пользователь EMACS, поэтому не уверен, что это действительно лучшие. Я протестировал этот запуск на CentOS и он работал хорошо (он нашел eterm-color в моем тестировании).

Я полагаю, что terminfo находится в одном и том же месте в большинстве/всех вариантах Linux, но вы можете добавить больше путей для поиска таким же образом, как вы добавляете больше терминалов, добавив больше

|| ls -1R /a/different/path | grep ^someotherterminal$
условный тест и трубы.

решение2

Учитывая вашу проблему, я бы рекомендовал установить TERMvt100. Он установлен везде, даже в пакете Debian ncurses-base. Альтернативы, упомянутые в предложенном ответе (ansi, aterm, xterm-256color), имеют отличия, которые будут использовать функции, отсутствующие в eterm-color.

Кроме того, функция title-string не является частью описания терминала. Ваши удаленные приложения используют ее на основе настройки TERM, например, все, что использует "xterm".

Технически вы бы потеряли цвет (в конце концов,vt100 никогда не делал цвет). Некоторые приложения все равно это делают.

Связанный контент