我如何从Emacs中运行Cygwin Bash Shell?

我在Windows上运行GNU Emacs,所以input:

Mx shell 

启动Windows命令行DOS shell。 不过,我希望能够在Emacs中运行Cygwin Bash Shell(或任何其他非Windows shell)。 这怎么能轻松完成呢?

shell-file-name是控制在Emacs运行shell命令时使用哪个shell的variables。

explicit-shell-file-name是控制哪个shell Mx shell启动的variables。

肯的​​答案改变了这两个,你可能会或可能不想要。

您还可以通过临时更改explicit-shell-file-name来启动其他shell。

 (defun cygwin-shell () "Run cygwin bash in shell mode." (interactive) (let ((explicit-shell-file-name "C:/cygwin/bin/bash")) (call-interactively 'shell))) 

你可能也想把--login参数传给bash,因为你正在开始一个新的Cygwin会话。 你可以通过设置explicit-bash-args来做到这一点。 (请注意, Mx shell使用explicit- PROGRAM -args ,其中PROGRAM是shellpath名的文件名部分,这就是为什么在设置shell时不应该包含.exe原因。

我发现这个最好的解决scheme如下:

 ;; When running in Windows, we want to use an alternate shell so we ;; can be more unixy. (setq shell-file-name "C:/MinGW/msys/1.0/bin/bash") (setq explicit-shell-file-name shell-file-name) (setenv "PATH" (concat ".:/usr/local/bin:/mingw/bin:/bin:" (replace-regexp-in-string " " "\\\\ " (replace-regexp-in-string "\\\\" "/" (replace-regexp-in-string "\\([A-Za-z]\\):" "/\\1" (getenv "PATH")))))) 

传递“–login”为cjm的问题就是你的shell总是从你的主目录开始。 但是如果你正在编辑一个文件,并且你点击了“Mx shell”,那么你需要你的shell在那个文件的目录下。 而且,我用“Mx grep”和“Mx compile”testing了这个设置。 我怀疑其他的例子在这里不能用于那些由于目录和PATH问题。

这个elisp片段属于你的〜/ .emacs文件。 如果要使用Cygwin而不是MinGW,请将第一个string更改为C:/ cygwin / bin / bash。 第二个string被预置到你的Windows PATH(把这个PATH转换成适当的unixyforms之后); 在Cygwin中,你可能想要“〜/ bin:/ usr / local / bin:/ usr / bin:”或类似的东西。

我用Cygwin使用XEmacs,并且可以相对容易地从XEmacs运行bash。

这里是init.el的相关部分

 ;; Let's use CYGWIN bash... ;; (setq binary-process-input t) (setq w32-quote-process-args ?\") (setq shell-file-name "bash") ;; or sh if you rename your bash executable to sh. (setenv "SHELL" shell-file-name) (setq explicit-shell-file-name shell-file-name) (setq explicit-sh-args '("-login" "-i")) 

关于这个问题的一个更重要的提示。

如果您使用Emacs shell模式并且有时需要bash和cmd,请将其设置为默认使用bash,因为您可以在bash中键入cmd,并且生成的dos shell工作得很好。

如果你设置Emacs使用cmd作为shell(这是NT emacs安装的方式),那么dos shell可以正常工作,但是如果你inputbash或者bash -i运行一个bash shell,那么最终的shell不能正常工作 – 见答案0。

但是,如果bash是emacs调用的“第一个”shell,那么它工作正常。

您可以直接从Emacs * shell *缓冲区中的默认Windows命令行shell运行bash:

 Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\temp>bash bash 

但是,不会显示命令提示符,这可能会导致您的命令和输出结果混合在一起。

另外,由于某种未知的原因,如果你input一个命令并且返回,那么你的命令语句的最后会附加一个返回行字符(\ r),导致一个bash错误:

 ls bash: line 1: $'ls\r': command not found 

解决方法是在每个命令的结尾手动添加注释字符(#),以便有效地注释\ r文本:

 ls # myfile,txt foo.bar anotherfile.txt 

这种总体方法并不理想,但如果您想从Windows的本机shell中进入bash以执行一些快速操作,然后退出以继续在Windows中工作,可能会非常有用。

我正在使用EmacsW32。 查看Ch a shell$提供了一个shell启动命令列表,命令cmd-shell和cygwin-shell看起来很有趣。 这两个命令都需要EmacsW32。 他们也可以在菜单中find: 工具> W&32壳

如果您是第一次运行cygwin-shell,并且您没有在Emacs中设置cygwinpath,则会引导您进入“自定义”页面,您可以通过按“查找”button来设置cygwinpath。

由于这些方法不适合我,我得到了以下方式:

(我使用NTEmacs默认打开一个dos shell,所以也许你的emacs的行为是一样的)

创build一个名为SHELL('SHELL'而不是'$ SHELL')的Windows环境variables,并为其指定cygwin安装的bash.exepath(例如c:\ programs \ cygwin \ bin \ bash.exe)

现在当做Mx shell时,会打开一个bash。

问候,

英诺

除了@Chris Jones关于避免bash的–login参数的回答,我设置了下面的命令行参数:

  (setq explicit-bash-args '("--noediting" "-i")) 

–noediting选项可防止干扰GNU readline库,-i选项指定shell是交互式的。 我也在我的主目录中使用.emacs_bash文件进行任何特定于emacs的bash自定义。