Git Bash di emacs di Windows

9

Saya bisa menjalankan shell Bash yang datang dengan Git untuk Windows. Saya menempatkan ini di .emacs:

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

Lalu M-x git-bashdan voila, bash berjalan tetapi dengan sedikit keanehan:

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
$ 

dan itu mencetak baris itu, dimulai dengan ^[], setelah setiap perintah saya jalankan. Pengkodean juga kacau. Bagaimana saya bisa memperbaikinya .emacs?

marczellm
sumber

Jawaban:

10

The ^[]kebisingan yang datang dari berbagai karakter kontrol terminal dalam prompt shell Anda. Cobalah echo $PS1untuk melihat urutan penuh, dan coba misalnya export PS1='$ 'untuk melihat bahwa string prompt yang lebih sederhana menghilangkan masalah tertentu.

Untuk penyandian, Anda dapat mencoba membuat utf-8 penyandian pilihan Anda:

(prefer-coding-system 'utf-8)

Menyiapkan prompt

Emacs menetapkan variabel INSIDE_EMACS sehingga Anda bisa membuat .bash_profile yang menetapkan PS1 hanya saat dijalankan di Emacs.

Menguji pada mesin saya, baris pertama prompt memiliki karakter kontrol yang bermasalah. Saya membuat ~ / .bash_profile dengan ini.

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

Ini menetapkan prompt berdasarkan apa yang diatur git-bash secara default, tapi saya menghapus baris pertama (hingga \ n break baris). Saya juga menghapus $ MSYSTEM yang menempatkan MINGW64 di prompt - Saya tidak perlu melihatnya. Yang tersisa adalah user @ host, direktori saat ini, dan git repo. Karakter kontrol mengatur warna yang ditampilkan Emacs dengan benar untuk saya. (Untuk detail tentang pengaturan prompt Anda, lihat manual bash .)

Di Emacs saya mengatur shell ke git-bash:

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

Dengan pengaturan ini saya masih melihat pesan kesalahan ioctl awal, tetapi hal-hal lain berfungsi seperti yang diharapkan dan pengkodeannya utf-8.

glukas
sumber
Itu berhasil, terima kasih! Apa yang dilakukan (bagi saya samar) garis PS1 lakukan? Dapatkah Anda membantu secara otomatis mengatur penyandian shell buffer ke utf-8? ( MĂĄrtonharus membaca Márton)
marczellm
PS1 dalam contoh saya berasal dari default yang telah ditetapkan git-bash. Saya baru saja menghapus semuanya hingga jeda baris (\ n). Ini menggunakan urutan kontrol tersebut untuk mengubah warna dari berbagai bit informasi yang ditampilkan - pengguna saat ini, host, git repo, dll. Saya harus melacak doc bash PS1 untuk detailnya. Untuk utf-8, apa yang default-process-coding-systemdiatur dalam Emacs Anda?
glukas
Saya menemukan ini di manual Emacs: "Untuk menentukan sistem pengkodean untuk shell, Anda dapat menggunakan perintah Cx RET c segera sebelum shell Mx. Anda juga dapat mengubah sistem pengkodean untuk subkulit yang sedang berjalan dengan mengetikkan Cx RET p di dalam shell penyangga." (lihat gnu.org/software/emacs/manual/html_node/emacs/… )
glucas
Nilainya adalah (undecided-dos . undecided-unix). Saya mencari cara untuk mengatur penyandian buffer secara otomatis daripada harus mengingat set penekanan tombol lain setiap kali ketika membukanya. Mungkin saya harus mengajukan pertanyaan baru.
marczellm
Milik saya utf-8 dos dan UNIX. Saya tidak mengaturnya secara eksplisit tetapi saya memiliki pengaturan ini: (prefer-coding-system 'utf-8) (setq-default buffer-file-coding-system' utf-8-unix)
glucas
1

Kesalahan ini menunjuk ke saklar yang tidak cocok. Mungkin diatur ke -icdan Anda hanya perlu -c:

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

Opsi lainnya adalah menyediakan tty to git-bash dengan perintah yang mirip (apa pun yang setara dengan windows):

/sbin/getty -l bash -n 38400 tty0
Pengguna Emacs
sumber
Saran pertama Anda tidak mengubah apa pun. Selain itu, M-x list-processesmenunjukkan bahwa itu tidak memiliki efek apa pun: perintah proses adalah D:/Program Files/git/bin/bash --noediting -i. Saran kedua Anda, saya tidak bisa mengerti.
marczellm
1
Itu karena Anda tidak menghapus saklar -i.
Pengguna Emacs
Oke, jadi bagaimana cara menghapusnya?
marczellm
1
Anda menggunakan explicit-shell-file-namejadi saya yakin Anda ingin mengatur mis (setq explicit-bash-args '("--login" "-i")).
glucas
1

Saya tahu ini tidak persis sama dengan OP, tapi saya pikir ini pilihan yang menarik. Anda dapat memulai emacs dari baris perintah git-bash. Itu akan membuat emacs menganggap git-bash sebagai shell.

Masukkan sesuatu seperti berikut ini dari bash prompt Anda

bla@host MINGW64 ~/ $ emacs .&

Kemudian, di emacs, Mx "shell"

jamar
sumber