对于 emacs 的 ansi-term,$TERM 的正确值是多少,尤其是在 SSH 后“eterm-color”不可用的情况下?

对于 emacs 的 ansi-term,$TERM 的正确值是多少,尤其是在 SSH 后“eterm-color”不可用的情况下?

我目前设置$TERMxterm-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 登录的大多数机器上不可用。

.bashrcUbuntu 中的默认设置检查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 识别的 hack相关转义码并设置标题,或者直接丢弃它们?

答案1

我找到了一种方法,可以让您具体找出远程主机上可用的终端,然后进行设置。通常,至少有一个 ansi 兼容终端,因此不需要“黑客”来伪造它。

通过一个很长的 ssh 命令完成,它看起来像这样:

ssh -i ~/.ssh/some_key.pub -tty some_remote_server "导出 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$ || 导出 TERM=xterm && emacs -nw"

这会在远程主机上按优先顺序查找不同的 ansi 兼容(和不兼容)终端类型,并设置在启动 EMACS 之前找到的第一个终端类型。如果找不到我们的首选类型,它将 TERM 设置为使用“xterm”类型,确保 EMACS 确实启动。

在此示例中,我按顺序查找 eterm-color、aterm、ansi 和 xterm-256color。我不是 EMACS 的重度用户,所以不确定这些是否真的是最好的。我在 CentOS 上测试了这个启动并且运行良好(它在我的测试中发现了 eterm-color )。

我相信 terminfo 在大多数/所有 Linux 变体上都位于同一位置,但您可以添加更多路径来搜索,就像添加更多终端一样,通过添加更多

|| ls -1R /a/不同/路径 | grep ^其他终端$
条件测试和管道。

答案2

鉴于您的问题,我建议将设置TERM为 vt100。它安装在任何地方,甚至在 Debian 的ncurses-base软件包中。建议答案中提到的替代方案(ansi、aterm、xterm-256color)具有差异,这些差异将发挥eterm-color.

此外,标题字符串功能不是终端描述的一部分。您的远程应用程序根据 的设置使用它TERM,例如,任何使用“xterm”的内容。

从技术上讲,你会失去颜色(毕竟,vt100从来没有做过彩色)。无论如何,有些应用程序会这样做。

相关内容