我正在Windows上运行GNU Emacs,因此输入:
M-x shell
启动Windows命令行DOS shell.但是,我希望能够从Emacs中运行Cygwin Bash Shell(或任何其他非Windows shell).如何轻松完成?
shell-file-name
是控制Emacs在运行shell命令时使用的shell的变量.
explicit-shell-file-name
是控制哪个shell M-x shell
启动的变量.
Ken的答案改变了你可能想要或不想要的那些.
您还可以通过临时更改来启动不同shell的函数explicit-shell-file-name
:
(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
.(注意,M-x shell
使用explicit-
PROGRAM -args
,其中PROGRAM是shell路径名的文件名部分.这就是为什么你不应该包括.exe
设置shell时的原因.
我发现的最佳解决方案如下:
;; 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"测试了这个设置.我怀疑这里的其他示例不适用于那些由于目录和PATH问题.
此elisp代码段属于〜/ .emacs文件.如果要使用Cygwin而不是MinGW,请将第一个字符串更改为C:/ cygwin/bin/bash.第二个字符串被添加到您的Windows PATH之前(在将该PATH转换为适当的unixy形式之后); 在Cygwin你可能想要"〜/ bin:/ usr/local/bin:/ usr/bin:"或类似的东西.
我将XEmacs与Cygwin一起使用,并且可以相对轻松地从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工作正常,但如果你键入bash或bash -i来运行bash shell,结果shell不能正常工作 - 见答案0.
但是如果bash是emacs调用的"第一个"shell,它的工作正常.