Windows で GNU Emacs を実行しているので、次のように入力します。
M-x shell
Windows コマンドライン DOS シェルを起動します。ただし、代わりに Emacs 内から Cygwin Bash シェル (またはその他の Windows 以外のシェル) を実行できるようにしたいと考えています。これはどのように簡単に行うことができますか?
Windows で GNU Emacs を実行しているので、次のように入力します。
M-x shell
Windows コマンドライン DOS シェルを起動します。ただし、代わりに Emacs 内から Cygwin Bash シェル (またはその他の Windows 以外のシェル) を実行できるようにしたいと考えています。これはどのように簡単に行うことができますか?
shell-file-name
シェル コマンドを実行するときに Emacs が使用するシェルを制御する変数です。
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)))
--login
新しい Cygwin セッションを開始するため、引数を bashに渡すことも必要になるでしょう。を設定することで実現できますexplicit-bash-args
。( PROGRAMをM-x shell
使用することに注意してください。ここで、 PROGRAM はシェルのパス名のファイル名部分です。これが、シェルを設定するときに を含めない理由です。explicit-
-args
.exe
これに対して私が見つけた最良の解決策は次のとおりです。
;; 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"))))))
cjmが示唆するように "--login" を渡す際の問題は、シェルが常にホーム ディレクトリで起動することです。しかし、ファイルを編集中に "Mx shell" をクリックすると、そのファイルのディレクトリにシェルが必要になります。さらに、このセットアップを「Mx grep」と「Mx compile」でテストしました。ここにある他の例は、ディレクトリと PATH の問題が原因で機能しないのではないかと思います。
この elisp スニペットは ~/.emacs ファイルに属しています。MinGW の代わりに Cygwin を使用する場合は、最初の文字列を C:/cygwin/bin/bash に変更します。2 番目の文字列は Windows PATH の前に追加されます (その PATH を適切な unixy 形式に変換した後)。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"))
この件に関するもう 1 つの重要なヒント。
Emacs シェル モードを使用していて、時々 bash と cmd の両方が必要な場合は、デフォルトで bash を使用するように設定します。これは、bash で cmd と入力すると、結果の dos シェルが問題なく動作するためです。
cmd をシェルとして使用するように Emacs をセットアップした場合 (NT emacs のインストール方法)、dos シェルは正常に動作しますが、bash または bash -i と入力して bash シェルを実行すると、結果のシェルは正しく動作しません -答え0を見てください。
しかし、bash が emacs が起動する「最初の」シェルである場合は問題なく動作します。
Emacs *shell* バッファ内のデフォルトの Windows コマンドライン シェルから 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 テキストを効果的にコメントアウトすることです。
ls #
myfile,txt
foo.bar
anotherfile.txt
この全体的なアプローチは理想的とは言えませんが、Windows のネイティブ シェルから bash にドロップしていくつかの簡単な操作を実行し、終了して Windows での作業を続行する場合に役立つ可能性があります。
EmacsW32 を使用しています。C-h a shell$
シェル起動コマンドのリストが表示され、コマンド cmd-shell と cygwin-shell が興味深いようです。どちらのコマンドにも EmacsW32 が必要です。メニューにもあります: Tools > W&32 Shells。
cygwin-shell を初めて実行する場合で、Emacs で cygwin パスを設定していない場合は、[検索] ボタンを押して cygwin パスを設定できるカスタマイズ ページに移動します。
これらのアプローチはうまくいかなかったので、次の方法で取得しました。
(デフォルトで dos シェルを開く NTEmacs を使用しているため、おそらくあなたの emacs も同じように動作します)
SHELL ('$SHELL' ではなく 'SHELL') という名前の Windows 環境変数を作成し、cygwin インストールの bash.exe へのパスを指定します (たとえば、c:\programs\cygwin\bin\bash.exe)。
Mx シェルを実行すると、bash が開きます。
よろしく、
いんの
--login引数をbashに回避することに関する@Chris Jonesの回答に加えて、次のコマンドライン引数を設定しました。
(setq explicit-bash-args '("--noediting" "-i"))
--noediting オプションは GNU readline ライブラリとの干渉を防ぎ、-i オプションはシェルがインタラクティブであることを指定します。また、ホーム ディレクトリにある .emacs_bash ファイルを使用して、emacs 固有の bash のカスタマイズを行います。