我正在Windows上运行GNU Emacs,因此输入:
M-x shell
启动Windows命令行DOS shell。但是,我希望能够从Emacs中运行Cygwin Bash Shell(或任何其他非Windows shell)。如何轻松完成?
答案 0 :(得分:42)
shell-file-name
是控制Emacs在运行shell命令时使用的shell的变量。
explicit-shell-file-name
是控制哪个shell M-x shell
启动的变量。
Ken's answer会更改您可能想要或不想要的那些。
您还可以通过暂时更改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路径名的文件名部分。这就是设置shell时不应包含.exe
的原因。
答案 1 :(得分:7)
我发现的最佳解决方案如下:
;; 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 suggests传递的问题是你的shell总是会在你的主目录中启动。但是如果您正在编辑文件并且点击“M-x shell”,那么您希望shell位于该文件的目录中。此外,我用“M-x grep”和“M-x compile”测试了这个设置。我怀疑这里的其他示例不适用于目录和PATH问题。
此elisp代码段属于〜/ .emacs文件。如果要使用Cygwin而不是MinGW,请将第一个字符串更改为C:/ cygwin / bin / bash。第二个字符串被添加到您的Windows PATH之前(在将该PATH转换为适当的unixy形式之后);在Cygwin你可能想要“〜/ bin:/ usr / local / bin:/ usr / bin:”或类似的东西。
答案 2 :(得分:6)
我将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"))
答案 3 :(得分:5)
关于这个问题的一个更重要的暗示。
如果您使用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,那么它可以正常工作。
答案 4 :(得分:2)
您可以直接从Emacs * shell *缓冲区中的默认Windows命令行shell运行bash:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\temp>bash
bash
但是,没有可见的命令提示符,这可能会导致您的命令及其输出结果全部混合在一起。
此外,由于某些未知原因,如果输入命令并点击返回,则返回行字符(\ r)将附加到命令语句的末尾,从而导致出现bash错误:
ls
bash: line 1: $'ls\r': command not found
解决方法是在每个命令的末尾手动添加注释字符(#),以有效地注释\ r \ text:
ls #
myfile,txt
foo.bar
anotherfile.txt
这种整体方法远非理想,但如果您希望从Windows的本机shell中删除bash以执行一些快速操作,然后退出以继续在Windows中工作,则可能非常有用。
答案 5 :(得分:2)
我正在使用EmacsW32。 C-h a shell$
给出了一个shell启动命令列表,命令cmd-shell和cygwin-shell看起来很有趣。这两个命令都需要EmacsW32。它们也可以在菜单中找到:工具> W& 32 Shells 。
如果你是第一次运行cygwin-shell,并且你没有在Emacs中设置cygwin路径,它会引导你进入Customization页面,你可以通过按Find键来设置cygwin路径。
答案 6 :(得分:1)
由于这些方法对我不起作用,我得到了以下方式:
(我使用的NTEmacs默认打开一个dos shell,所以也许你的emacs行为相同)
创建一个名为SHELL的Windows环境变量('SHELL'而不是'$ SHELL')并为其提供cygwin安装的bash.exe路径(例如c:\ programs \ cygwin \ bin \ bash.exe)< / p>
现在做M-x shell时会打开一个bash。
此致
的Inno
答案 7 :(得分:0)
除了@Chris Jones关于避免使用bash的--login参数的答案之外,我还设置了以下命令行参数:
(setq explicit-bash-args '("--noediting" "-i"))
--noediting选项可防止干扰GNU readline库,-i选项指定shell是交互式的。我还在我的主目录中使用.emacs_bash文件来进行任何特定于emacs的bash自定义。