TUI中的Emacs所在的终端的类别为何总是dumb

konsole,qterminal这两个终端模拟器中TERM环境变量都是xterm-256color。WSL里面,Windows Terminal也是xterm-256color。但是上面这三个终端里面跑TUI的Emacs,getenv得到的TERM都是dumb。send-string-to-terminal发送到的是哪个终端?

可以google一些信息,你可以看下。

所以,TERM=dumb这个环境变量是指emacs自己那个终端的类型。那么我怎么获取到那个显示TUI Emacs的终端的TERM环境变量呢?

那就不知道了

用 lisp (getenv "TERM")

应该也没用,他想要的是终端里的TERM环境变量

听起来像个xy problem,直接说说你想干啥可能能更好的解决。

你如果想知道终端是几色的

(length tty-defined-color-alist)

想知道别的信息可以参考kkp.el

initial-environment 里面有吗?

这问题我之前遇到过,当时我要解决的问题是emacs在TUI模式下方向键失灵的问题。我在konsole和xterm里都进行了测试,发现TERM的默认值是xterm-256color。当时有人给出了一个解答:

  TERM=linux emacs -nw # this makes arrow keys work

来源在这里

然而,这也不管用!终端里的TERM环境变量和emacs里的值不一致。当时我以为这是终端的问题,因为对于escape的处理,终端有更高的优先级。然而,在GUI里面它的值也是dumb。

emacs 23 NEWS 提到

** Changes related to multiple-terminal (multi-tty) support *** $TERM is now set to ‘dumb’ for subprocesses. If you want to know the $TERM inherited by Emacs you will have to look inside initial-environment.

对此@Chingyat 已经提到过了。至于是哪里把它设成dumb的,参考startup.el:852

    ;; Subprocesses of Emacs do not have direct access to the terminal, so
    ;; unless told otherwise they should only assume a dumb terminal.
    ;; We are careful to do it late (after term-setup-hook), although the
    ;; new multi-tty code does not use $TERM any more there anyway.
    (setenv "TERM" "dumb")

之前我在坛子里提过一个相关问题如何在emacsclient -e求值的表达式中打印到当前终端的输出流

看起来当前不管是tui还是gui都继承不到父进程的环境变量。关于emacs如何使用TERM变量进行初始化,参考Emacs On Terminal 理论上可以通过修改term/${TERM}.el的方式来进行tweak。

那么我怎么获取到那个显示TUI Emacs的终端的TERM环境变量呢?

如果你是想知道用的是哪个终端,使用 $TERM_PROGRAM

如果你一定要知道 $TERM 是什么,可以在 early-init.el 里加一行 (setq real-term-env-var (getenv "TERM")) 但是正如楼上有人所说,你很可能问了一个 xy problem, 应该有直接解决的解决方案。

想根据evil模式改TUI emacs的光标形状,我知道有evil-terminal-cursor-changer这个包,我是想自己做一个。

你既然都知道有这个包了,那就参考人家的代码怎么实现的呗。简单的看了一下,主要就是用 TERM_PROGRAM 还有 不同终端设置的特定环境变量 实现的。然后 fallback 就是 assume 是用了 xterm。