2008-10-24 118 views
37

我在Windows上运行GNU Emacs的这样输入:如何从Emacs中运行Cygwin Bash Shell?

M-x shell 

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

回答

42

shell-file-name相关的部分是控制,当它想运行shell命令,外壳Emacs使用的变量。

explicit-shell-file-name是控制该壳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-程序-args,其中program是shell的路径名的文件名部分,这就是为什么设置外壳时,你应该不包括.exe

+2

您的e-lisp比我的要好 - 我学会了足够让它按照我以前想要的方式运行,并且忘记了它的大部分含义。我认为我的代码最初是从某个常见问题解答中复制出来的...... – 2008-10-24 23:07:57

+0

+1,弓向Yoda大师挥动括号。你的e-lisp会把我从水里吹出来。 – 2009-05-14 12:15:48

6

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

下面是​​

;; 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")) 
2

您可以从默认的Windows命令行直接运行的bash您的Emacs内壳*壳*缓冲液:

Microsoft Windows XP [Version 5.1.2600] 
(C) Copyright 1985-2001 Microsoft Corp. 

C:\temp>bash 
bash  

然而,没有命令提示是可见的,其可以是迷失方向导致的命令及其输出结果中的所有混合在一起

此外,对于一些unkno。 WN原因,如果你输入一个命令并回车,返回行字符(\ r)附加到您的命令语句的结束导致一个bash错误:

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

一种解决方法是手动添加评论字符(#)在每个有效地注释掉\ r文本命令的末尾:

ls # 
myfile,txt 
foo.bar 
anotherfile.txt 

这一总的做法是远远不够理想,但如果你想放入的bash从Windows的本机外壳可能是有用的做一些快速操作,然后退出以继续在Windows中工作。

5

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

如果您使用Emacs shell模式,并希望双方的bash,有时在cmd,将它设置为默认使用bash,因为你可以在键入CMD庆典,所得DOS外壳工作得很好。

如果您设置Emacs使用cmd作为shell(这是NT emacs安装的方式),那么dos shell可以正常工作,但是如果您键入bash或bash -i来运行bash shell,则生成的shell不会“ t工作正确 - 请参阅答案0.

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

1

由于这些方法并没有为我工作,我得到它通过以下方式:

(我使用的默认情况下打开一个DOS外壳NTEmacs,所以也许你的emacs的行为相同)

创建一个名为SHELL('SHELL''''''SHELL')的Windows环境变量并为其指定cygwin安装的bash.exe路径(例如c:\ programs \ cygwin \ bin \ bash.exe)

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

问候,

的Inno

2

我使用EmacsW32。 C-h a shell$给出了一个shell启动命令列表,命令cmd-shell和cygwin-shell看起来很有趣。这两个命令都需要EmacsW32。它们也在菜单中找到:工具> W & 32壳体

如果您是第一次运行cygwin-shell,并且您没有在Emacs中设置cygwin路径,它会引导您进入定制页面,您可以通过按下查找按钮来设置cygwin路径。

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总是会在你的home目录中启动的问题。但是如果你正在编辑一个文件并且你点击了“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:”或类似的东西。

0

除了@克里斯·琼斯关于避免--login参数bash的答案,我设置以下命令行参数:

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

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