Emacs内からCygwin Bash Shellを実行するにはどうすればよいですか?
-
04-07-2019 - |
質問
WindowsでGNU Emacsを実行しているので、次のように入力します。
M-x shell
WindowsコマンドラインDOSシェルを起動します。ただし、代わりにEmacs内からCygwin Bashシェル(またはその他のWindows以外のシェル)を実行できるようにしたいと思います。どうすれば簡単にできますか?
解決
shell-file-name
は、シェルコマンドを実行するときにEmacsが使用するシェルを制御する変数です。
explicit-shell-file-name
は、どのシェル M-x shell
を起動するかを制御する変数です。
Kenの回答の変更両方とも必要な場合とそうでない場合があります。
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
を設定します。 ( Mx shell
は explicit-
PROGRAM -args
を使用することに注意してください。PROGRAMはシェルのパス名のファイル名部分です。シェルの設定時に .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"))))))
"-login"を渡す際の問題cjm 提案は、シェルが常にホームディレクトリで起動するためです。しかし、ファイルを編集しているときに「M-x shell」を押すと、そのファイルのディレクトリにシェルが必要になります。さらに、「M-x grep」でこのセットアップをテストしました。および「M-x 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でcmdを入力するとdosシェルが正常に機能するため、デフォルトでbashを使用するように設定します。
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
ただし、コマンドプロンプトが表示されないため、見当識が失われ、コマンドとその出力結果がすべて混ざり合ってしまいます。
また、何らかの不明な理由により、コマンドを入力してreturnキーを押すと、コマンド行の最後に改行文字(\ r)が追加され、bashエラーが発生します:
ls
bash: line 1:
回避策は、コマンドの最後にコメント文字(#)を手動で追加して、\ rテキストを効果的にコメントアウトすることです:
ls #
myfile,txt
foo.bar
anotherfile.txt
この全体的なアプローチは理想とはほど遠いですが、Windowsのネイティブシェルからbashにドロップして簡単な操作を行い、終了してWindowsでの作業を続ける場合に便利です。
ls\r': command not found
回避策は、コマンドの最後にコメント文字(#)を手動で追加して、\ rテキストを効果的にコメントアウトすることです:
<*>この全体的なアプローチは理想とはほど遠いですが、Windowsのネイティブシェルからbashにドロップして簡単な操作を行い、終了してWindowsでの作業を続ける場合に便利です。
EmacsW32を使用しています。 C-h a shell $
は、シェル起動コマンドのリストを提供し、cmd-shellコマンドとcygwin-shellコマンドは興味深いように見えます。両方のコマンドにはEmacsW32が必要です。メニューにもあります:ツール&gt; W&amp; 32シェル。
cygwin-shellを初めて実行し、Emacsでcygwinパスを設定していない場合は、[検索]ボタンを押してcygwinパスを設定できるカスタマイズページに移動します。
これらのアプローチは私にとってはうまくいかなかったので、次のようにしました:
(デフォルトでdosシェルを開くNTEmacsを使用しているため、おそらくemacsも同じように動作します)
SHELLという名前のWindows環境変数(「$ SHELL」ではなく「SHELL」)を作成し、cygwinインストールのbash.exeへのパスを指定します(c:\ programs \ cygwin \ bin \ bash.exeなど)
M-xシェルを実行すると、bashが開きます。
よろしく、
イノ
bashへの--login引数の回避に関する@Chris Jonesの回答に加えて、次のコマンドライン引数を設定しました。
(setq explicit-bash-args '("--noediting" "-i"))
-noeditingオプションはGNU readlineライブラリとの干渉を防ぎ、-iオプションはシェルが対話型であることを指定します。また、emacs固有のbashカスタマイズのために、ホームディレクトリの.emacs_bashファイルを使用します。