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

Ste*_*zzo 7 terminal emacs xterm ansi-term

我目前设置$TERMxterm-256color

if [[ -n "$EMACS" ]]; then
    export TERM=xterm-256color
    alias emacs="emacsclient --no-wait"
    export EDITOR="emacsclient --no-wait"
    export VISUAL="emacsclient"
fi
Run Code Online (Sandbox Code Playgroud)

我曾经将它设置为eterm-color,但问题是这种终端类型在我通过 SSH 登录的大多数机器上不可用。

.bashrcUbuntu 中的默认值检查TERM变量是否以开头xterm-,在这种情况下,它会尝试设置窗口标题:

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

问题是\[\e]0;一点。它应该由 xterm 兼容的终端模拟器解析,但 emacs (ansi-term) 不这样做。其结果是这样的终端:

0;user@host: ~user@host:~$ 
Run Code Online (Sandbox Code Playgroud)

readline当输入的文本大于终端的宽度时,它也会使用,破坏一些应用程序。

因为eterm-color在某些远程主机上不可用(而且我也无法安装它),将其设置为该值会使less.

有什么我可以使用的技巧,例如大多数发行版附带的另一种终端类型,或者使 ansi-term 识别相关转义码并设置标题的黑客,或者只是丢弃它们?

And*_*rew 4

我找到了一种方法,可以让您具体找出远程主机上可用的终端,然后进行设置。通常,至少有一个 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 ^其他终端$
条件测试和管道。