代码之家  ›  专栏  ›  技术社区  ›  Rohith

在Emacs中,当使用m-x comint run时,如何自定义用于启动进程的shell

  •  0
  • Rohith  · 技术社区  · 16 年前

    我在Windows上运行Emacs。我使用cygwin,我也安装了ruby和rdebug的cygwin版本。当我调用m-x comint run enter rdebug enter时,我注意到它正试图通过Microsoft命令提示符运行rdebug.bat,而不是使用bash来运行rdebug(不使用.bat)。 我希望comint run使用bash调用任何被要求启动的进程。我能怎么做吗?

    如果您对我为什么要这样做感兴趣,请参阅下面的长篇故事: Ideas for troubleshooting emacs error: "apply: Spawning child process: exec format error"

    小进展

    我在elisp代码中为comint运行做了一些深入的研究,看起来它最终调用了start进程——不幸的是,这里我陷入了困境,因为start进程是在C源代码中定义的函数。出于某种原因,启动过程似乎忽略了显式shell文件名和shell文件名的值。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Jörgen Lundberg    16 年前

    我的.emacs里有这个

    (setenv "SHELL" "C:/cygwin/bin/bash.exe")
    (setq shell-file-name "C:/cygwin/bin/bash.exe")
    (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t)
    

    我不是Elisp黑客,我从很久以前的某个地方复制并粘贴了这段代码。我不知道它是否对你有帮助。但至少在我做“m-x shell”时它会运行bash。

        2
  •  1
  •   Community Mohan Dere    9 年前

    J·伦德伯格 answer 当然可以,但是Emacs首先查看变量的值 explicit-shell-file-name 确定运行哪个shell interactive inferior shell (检查链接以获取文档)。所以,确定的答案是:

    (setq explicit-shell-file-name "C:/cygwin/bin/bash.exe")
    
        3
  •  1
  •   Rohith    16 年前

    尽管进行了大量的elisp调试,但我还是无法找到一种方法来定制使用cygwin bash的启动过程。现在我回顾一下,这对我来说是有意义的:假设Emacs使用start进程来启动它内部也需要的不同进程,start进程总是需要调用一个shell,这个shell依赖于底层操作系统,而不是任何用户自定义。

        4
  •  1
  •   Make Mark    15 年前

    Emacs start-process 据我所知,根本不使用任何shell,它直接启动您指定的程序,而不使用中间过程。当然,如果您指定一个批处理文件(.bat),它将使用Microsoft命令shell执行。

    如果有多个同名文件(一个以.bat结尾,另一个不以.bat结尾),我建议您通过指定完整路径来确保执行正确的文件。不是Emacs,而是Windows启动命令shell来解释Emacs要求它执行的批处理文件。