【问题标题】:How do I tell a shell that it is running from within Emacs?如何告诉 shell 它是在 Emacs 中运行的?
【发布时间】:2011-08-20 06:11:38
【问题描述】:

我有一个程序,它使用 ansi 终端代码来做一些花哨的事情,比如在终端中运行时擦除行。当它在 Emacs 中运行时,显然会搞砸缓冲区。

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

我将这个程序作为 Makefile 的一部分执行,无论是从终端还是在 Emacs 中使用编译模式。

那么有没有办法让编译模式设置一个环境变量(或类似的东西),以便在 Makefile 中轻松捕获以在适当时使用该选项?

在 make 命令中手动添加一个额外的参数(在任何一种情况下)是我试图避免的。

【问题讨论】:

    标签: emacs environment-variables


    【解决方案1】:

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

    ~ $ echo $INSIDE_EMACS
    24.0.50.3,comint
    ~ $ 
    

    当我在 Emacs 中的 Bourne shell 中时也是这样(使用 'ansi-term'):

    sh-3.2$ echo $INSIDE_EMACS
    24.0.50.3,term:0.96
    sh-3.2$ 
    

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

    ~ $ echo $INSIDE_EMACS
    
    ~ $ 
    

    【讨论】:

    • 我没有在我的 xemacs 中看到它。
    【解决方案2】:

    EMACS 在M-x shell 会话中设置$EMACS 环境变量,因此您只需检查它(假设您没有无意中在shell 脚本中的其他地方定义EMACS):

    # from login shell
    echo $EMACS
    
    # within Emacs shell
    bash-4.2$ echo $EMACS
    t
    

    【讨论】:

    • 完美!正是我所希望的,但很难找到。
    • 我通过在 emacs 下运行的 shell 中查看 env 的输出就发现了这一点。
    • Foo Bah:你说的是“eshell”,但我认为你不是这个意思?实验性地M-x eshell 确实not 设置了EMACS 环境变量,而且您也不会看到带有eshell 的“bash” shell 提示符。但是,从 Emacs 开始的其他 shell 似乎确实存在该环境变量(M-x shellM-x termansi-term)。
    • 仅供参考:我注意到,如果我在 emacs 中的 M-x 术语模式中生成不同的终端程序(例如 xterm),则 $EMACS 和 $INSIDE_EMACS 都会在新的 xterm 会话中保持设置。似乎没有其他环境变量会延续到新的 xterm 会话。这看起来很奇怪。
    • 根据gnu.org/software/emacs/manual/html_node/emacs/…EMACS 变量已被弃用,“使用它的程序应该改用INSIDE_EMACS”。
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多