WindowsのEmacsでのGit Bash


9

Git for Windowsに付属のBashシェルを実行できます。私はこれを私の中に入れました.emacs

(defun git-bash () (interactive)
  (let ((explicit-shell-file-name "D:/Program Files/git/bin/bash"))
    (call-interactively 'shell)))

その後M-x git-bash、ほら、bashが実行されていますが、奇妙です。

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
^[]0;MINGW64:/c/Users/M??rton^G
MĂĄrton@Marci MINGW64 /c/Users/MĂĄrton
$ 

そして^[]、実行するすべてのコマンドの後に、で始まるその行を出力します。また、エンコーディングはめちゃくちゃです。どうすればこれを修正でき.emacsますか?

回答:


10

^[]ノイズは、あなたのシェルプロンプトで、様々な端末制御文字から来ています。試してみてくださいecho $PS1全配列を確認するために、そして例えばを試すexport PS1='$ 'シンプルなプロンプト文字列は、その特定の問題を取り除くことを確認します。

エンコーディングについては、utf-8を優先エンコーディングにしてみてください。

(prefer-coding-system 'utf-8)

プロンプトを設定する

EmacsはINSIDE_EMACS変数を設定するため、Emacsで実行されている場合にのみPS1を設定する.bash_profileを作成できます。

私のマシンでテストすると、プロンプトの最初の行に問題のある制御文字が含まれています。これで〜/ .bash_profileを作成しました。

if [ -n "$INSIDE_EMACS" ]; then
    export PS1='\[\033[32m\]\u@\h \[\033[33m\]\w\[\033[36m\]`__git_ps1`\[\033[0m\]\n$ '
fi

これは、デフォルトでgit-bashが設定していたものに基づいてプロンプトを設定しますが、最初の行(\ n改行まで)を削除しました。また、MINGW64をプロンプトに表示する$ MSYSTEMも削除しました。表示する必要はありません。残っているのは、user @ host、現在のディレクトリ、およびgit repoです。制御文字は、Emacsが適切に表示する色を設定します。(プロンプトの設定の詳細については、bashのマニュアルを参照してください。)

Emacsでは、シェルをgit-bashに設定しました:

(setq explicit-shell-file-name "C:/git-for-windows/bin/bash.exe")
(setq explicit-bash.exe-args '("--login" "-i"))

この設定を使用しても、最初のioctlエラーメッセージは表示されますが、それ以外の場合は期待どおりに機能し、エンコーディングはutf-8です。


うまくいきました、ありがとう!(私には不可解ですが)PS1回線は何をしますか?シェルバッファーエンコーディングを自動的にutf-8に設定するのに役立ちますか?(MĂĄrton必ずお読みくださいMárton
marczellm 2016年

私の例のPS1は、git-bashが設定したデフォルトの1つから派生しました。改行(\ n)までをすべて削除しました。これらの制御シーケンスを使用して、表示されているさまざまな情報のビット(現在のユーザー、ホスト、Gitリポジトリなど)の色を変更しています。詳細については、bash PS1ドキュメントを追跡する必要があります。utf-8の場合default-process-coding-system、Emacs で何が設定されていますか?
グルカ2016年

これはEmacsのマニュアルで見つかりました。「シェルのコーディングシステムを指定するには、Mxシェルの直前にコマンドCx RET cを使用できます。シェルでCx RET pと入力して、実行中のサブシェルのコーディングシステムを変更することもできます。バッファ。" (gnu.org/software/emacs/manual/html_node/emacs/…を参照)
glucas

その値は(undecided-dos . undecided-unix)です。バッファエンコーディングを開くときに毎回別のキーストロークを覚える必要がなく、バッファエンコーディングを自動的に設定する方法を探しています。多分私は新しい質問をする必要があります。
marczellm

私のはutf-8 dosとUNIXです。明示的には設定していませんが、次の設定があります。(prefer-coding-system 'utf-8)(setq-default buffer-file-coding-system' utf-8-unix)
glucas

1

このエラーは、スイッチの不一致を示しています。それはおそらく設定されて-icおり、あなたはちょうど必要です-c

(setq shell-command-switch "-c")

他のオプションは、次のようなコマンドでtty-bashにttyを提供することです(Windowsで同等のものはどれでも):

/sbin/getty -l bash -n 38400 tty0

最初の提案は何も変更しません。さらに、M-x list-processesそれが何の効果もなかったことを示します:プロセスコマンドはD:/Program Files/git/bin/bash --noediting -iです。あなたの2番目の提案は理解できません。
marczellm

1
これは、-iスイッチを削除しなかったためです。
Emacsユーザー

わかりましたので、どうすれば削除できますか?
marczellm

1
あなたが使っているexplicit-shell-file-nameので、例えばを設定したいと思うでしょう(setq explicit-bash-args '("--login" "-i"))
グルカ2016年

1

これはOPとまったく同じではないことは知っていますが、興味深いオプションだと思います。git-bashコマンドラインからemacsを起動できます。これにより、emacsはシェルとしてgit-bashを想定します。

bashプロンプトから次のように入力します

bla@host MINGW64 ~/ $ emacs .&

次に、emacsではMx "shell"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.