我如何告诉外壳它正在Emacs中运行?

tho*_*i56 4 emacs environment-variables

我有一个程序使用ansi终端代码来执行一些花哨的工作,例如在终端中运行时擦除行。当从Emacs内部运行时,显然会弄乱缓冲区。

该程序有一个不使用这些选项的选项,因此我希望能够在Emacs中的shell中运行时打开该选项。

我从终端或在Emacs中使用编译模式将此程序作为Makefile的一部分执行。

那么,有没有一种方法可以让编译模式设置一个环境变量(或类似的变量),以便在合适的情况下很容易在Makefile中捕获它以使用该选项?

我试图避免在make命令中手动添加一个额外的参数(无论哪种情况)。

zev*_*zev 7

Emacs 也会设置 $INSIDE_EMACS 环境变量。如果您不仅需要知道您是否在 emacs 中运行 shell 会话,而且需要知道您使用的是哪个版本的 emacs 以及您如何运行 shell 会话(这对于知道您是否“有用”),这对您很有用在脚本中重新使用 ansi 控制字符)。这是我在 Emacs 中的 bash shell 中得到的结果(使用“shell”):

~ $ echo $INSIDE_EMACS
24.0.50.3,comint
~ $ 
Run Code Online (Sandbox Code Playgroud)

当我在 Emacs 中的 Bourne shell 中时也是如此(使用“ansi-term”):

sh-3.2$ echo $INSIDE_EMACS
24.0.50.3,term:0.96
sh-3.2$ 
Run Code Online (Sandbox Code Playgroud)

这是我从终端(不是在 Emacs 中)执行相同操作时得到的结果:

~ $ echo $INSIDE_EMACS

~ $ 
Run Code Online (Sandbox Code Playgroud)


Foo*_*Bah 5

EMACS $EMACSM-x shell会话中设置环境变量,因此您只需要检查一下即可(假设您不会无意间EMACS在shell脚本中的其他地方定义):

# from login shell
echo $EMACS

# within Emacs shell
bash-4.2$ echo $EMACS
t
Run Code Online (Sandbox Code Playgroud)

  • 我仅通过在emacs下运行的shell中查看`env`的输出就知道了这一点。 (3认同)
  • Foo Bah:您说“ eshell”,但我不认为您是真的意思吗?实验上,“ Mx eshell”没有“设置” EMACS环境变量,并且您也不会看到带有“ eshell”的“ bash” shell提示。但是,从Emacs开始的其他shell似乎确实存在该环境变量(“ Mx shell”和“ Mx term”或“ ansi-term”)。 (2认同)
  • 仅供参考:我注意到,如果从emacs的Mx term模式内生成另一个终端程序(例如xterm),则$ EMACS和$ INSIDE_EMACS都将在新的xterm会话中保持设置。似乎没有其他环境变量可以延续到新的xterm会话中。这看起来很奇怪。 (2认同)
  • 根据 http://www.gnu.org/software/emacs/manual/html_node/emacs/Interactive-Shell.html,不推荐使用 `EMACS` 变量,并且“使用它的程序应该改用`INSIDE_EMACS` ”。 (2认同)