web-dev-qa-db-ja.com

Emacs内からCygwinBash Shellを実行するにはどうすればよいですか?

私はWindowsでGNU Emacsを実行しているので、次のように入力します:

M-x Shell

windowsコマンドラインDOSシェルを起動します。ただし、代わりにEmacs内からCygwin Bashシェル(またはその他のWindows以外のシェル)を実行できるようにしたいと思います。どうすればこれを簡単に行うことができますか?

38
Ray Vega

Shell-file-nameは、Shellコマンドを実行するときにShellEmacsが使用する変数を制御します。

explicit-Shell-file-nameは、どのシェルM-x 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)))

新しいCygwinセッションを開始しているので、おそらく--login引数をbashに渡すこともできます。 explicit-bash-argsを設定することでそれを行うことができます。 (M-x Shellexplicit-PROGRAM-argsを使用することに注意してください。ここで、PROGRAMはシェルのパス名のファイル名部分です。そのため、シェルを設定するときに.exeを含めないでください。

42
cjm

これに対して私が見つけた最善の解決策は次のとおりです。

;; 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 として渡す場合の問題は、シェルが常にホームディレクトリで開始されることです。ただし、ファイルを編集しているときに「M-x Shell」を押すと、そのファイルのディレクトリにシェルが必要になります。さらに、このセットアップを「M-xgrep」と「M-xcompile」でテストしました。ここにある他の例は、ディレクトリとPATHの問題のために機能しないのではないかと疑っています。

このelispスニペットは〜/ .emacsファイルに属しています。 MinGWの代わりにCygwinを使用する場合は、最初の文字列をC:/ cygwin/bin/bashに変更します。 2番目の文字列はWindowsPATHの前に付加されます(そのPATHを適切に一意の形式に変換した後)。 Cygwinでは、おそらく「〜/ bin:/ usr/local/bin:/ usr/bin:」または同様のものが必要です。

7
Chris Jones

私は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"))
6
Ken Gentle

私はEmacsW32を使用しています。 C-h a Shell$は、シェル起動コマンドのリストを提供し、コマンドcmd-Shellおよびcygwin-Shellは面白そうです。どちらのコマンドにもEmacsW32が必要です。それらはメニューにもあります:ツール> W&32シェル

Cygwin-Shellを初めて実行し、Emacsでcygwinパスを設定していない場合は、[カスタマイズ]ページが表示され、[検索]ボタンを押してcygwinパスを設定できます。

2
Yoo

Emacs * Shell *バッファー内のデフォルトのWindowsコマンドラインシェルから直接bashを実行できます。

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

C:\temp>bash
bash     

ただし、コマンドプロンプトが表示されないため、方向が乱れ、コマンドとその出力結果がすべて混ざり合う可能性があります。

さらに、なんらかの理由で、コマンドを入力してreturnキーを押すと、コマンドステートメントの最後に戻り行の文字(\ r)が追加され、bashエラーが発生します。

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

回避策は、すべてのコマンドの最後にコメント文字(#)を手動で追加して、\ rテキストを効果的にコメントアウトすることです。

ls #
myfile,txt
foo.bar
anotherfile.txt

この全体的なアプローチは理想からはほど遠いですが、Windowsのネイティブシェルからbashにアクセスして簡単な操作を実行し、終了してWindowsでの作業を続行する場合に役立つことがあります。

2
Ray Vega

これらのアプローチは私にはうまくいかなかったので、私はそれを次の方法で手に入れました:

(私はデフォルトでDOSシェルを開くNTEmacsを使用しているので、おそらくあなたのemacsは同じように動作します)

Shellという名前のWindows環境変数(「$ Shell」ではなく「Shell」)を作成し、cygwinインストールのbash.exeへのパスを指定します(例:c:\ programs\cygwin\bin\bash.exe)

M-x Shellを実行すると、bashが開きます。

よろしく、

イノ

1
Inno

--login引数をbashに回避することについての@ChrisJonesの回答に加えて、次のコマンドライン引数を設定しました。

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

--noeditingオプションは、GNU readlineライブラリへの干渉を防ぎ、-iオプションは、シェルがインタラクティブであることを指定します。また、ホームディレクトリの.emacs_bashファイルをemacs固有のbashのカスタマイズに使用します。 。

0
mcheema