![对于 emacs 的 ansi-term,$TERM 的正确值是多少,尤其是在 SSH 后“eterm-color”不可用的情况下?](https://linux22.com/image/50706/%E5%AF%B9%E4%BA%8E%20emacs%20%E7%9A%84%20ansi-term%EF%BC%8C%24TERM%20%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%80%BC%E6%98%AF%E5%A4%9A%E5%B0%91%EF%BC%8C%E5%B0%A4%E5%85%B6%E6%98%AF%E5%9C%A8%20SSH%20%E5%90%8E%E2%80%9Ceterm-color%E2%80%9D%E4%B8%8D%E5%8F%AF%E7%94%A8%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%9F.png)
我目前设置$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 识别的 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从来没有做过彩色)。无论如何,有些应用程序会这样做。