В настоящее время я $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
Учитывая вашу проблему, я бы рекомендовал установить TERM
vt100. Он установлен везде, даже в пакете Debian ncurses-base
. Альтернативы, упомянутые в предложенном ответе (ansi, aterm, xterm-256color), имеют отличия, которые будут использовать функции, отсутствующие в eterm-color
.
Кроме того, функция title-string не является частью описания терминала. Ваши удаленные приложения используют ее на основе настройки TERM
, например, все, что использует "xterm".
Технически вы бы потеряли цвет (в конце концов,vt100 никогда не делал цвет). Некоторые приложения все равно это делают.