Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在emacs中,当使用M-x comint run时,如何自定义用于启动进程的shell_Shell_Emacs_Process_Cygwin_Invoke - Fatal编程技术网

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

在emacs中,当使用M-x comint run时,如何自定义用于启动进程的shell,shell,emacs,process,cygwin,invoke,Shell,Emacs,Process,Cygwin,Invoke,我在windows上运行emacs。我使用cygwin,还安装了cygwin版本的ruby和rdebug。当我调用M-x comint run ENTER rdebug ENTER时,我注意到它试图通过Microsoft命令提示符运行rdebug.bat,而不是使用bash来运行rdebug(没有.bat)。 我希望comint run能够使用bash来调用要求它启动的任何进程。有什么办法可以做到这一点吗 如果您对我这样做的原因感兴趣,请参阅这里的长话短说: 小进步 我在用于comint run

我在windows上运行emacs。我使用cygwin,还安装了cygwin版本的ruby和rdebug。当我调用M-x comint run ENTER rdebug ENTER时,我注意到它试图通过Microsoft命令提示符运行rdebug.bat,而不是使用bash来运行rdebug(没有.bat)。 我希望comint run能够使用bash来调用要求它启动的任何进程。有什么办法可以做到这一点吗

如果您对我这样做的原因感兴趣,请参阅这里的长话短说:

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

我的.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

(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。

Jörgen Lundberg的肯定会工作,但是Emacs首先查看变量
显式shell文件名的值来确定要运行哪个shell(查看文档链接)。因此,确定的答案是:

(setq explicit-shell-file-name "C:/cygwin/bin/bash.exe")
Jörgen Lundberg的方法肯定会奏效,但是Emacs首先会查看变量
显式shell文件名的值,以确定要运行哪个shell(查看文档链接)。因此,确定的答案是:

(setq explicit-shell-file-name "C:/cygwin/bin/bash.exe")

尽管进行了大量的elisp调试,但我无法找到一种方法来定制启动进程以使用cygwin bash。现在我回顾一下,这对我来说有点意义:假设emacs使用start process来启动内部所需的不同进程,则start process始终需要调用一个shell,该shell取决于底层操作系统,而不是任何用户自定义。

尽管进行了大量的elisp调试,我想不出一种方法来定制使用cygwin bash的启动过程。现在我回顾一下,这对我来说有点意义:假设emacs使用start process来启动内部所需的不同流程,启动进程总是需要调用依赖于底层操作系统而非任何用户自定义的shell。

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


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

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


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

不起作用-我已经将显式Shell文件名和Shell文件名设置为bash(实际上,M-x Shell正确调用bash)。但comint run似乎忽略了这些。不起作用-我已经将显式的shell文件名和shell文件名设置为bash(事实上,M-x shell正确地调用了bash)。但comint run似乎忽视了这些。