Git Bash trong emacs trên Windows


9

Tôi có thể chạy shell Bash đi kèm với Git cho Windows. Tôi đặt cái này trong .emacs:

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

Sau đó M-x git-bashvà voila, bash đang chạy nhưng với một số điều kỳ lạ:

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
$ 

và nó in dòng đó, bắt đầu bằng ^[], sau mỗi lệnh tôi chạy. Ngoài ra mã hóa bị rối tung. Làm thế nào tôi có thể sửa lỗi này .emacs?

Câu trả lời:


10

Các ^[]tiếng ồn đến từ ký tự điều khiển thiết bị đầu cuối khác nhau tại dấu nhắc shell của bạn. Hãy thử echo $PS1xem toàn bộ chuỗi và thử ví dụ export PS1='$ 'để thấy rằng một chuỗi nhắc đơn giản hơn sẽ loại bỏ vấn đề cụ thể đó.

Đối với mã hóa, bạn có thể thử tạo utf-8 mã hóa ưa thích của mình:

(prefer-coding-system 'utf-8)

Thiết lập lời nhắc

Emacs đặt biến INSIDE_EMACS để bạn có thể tạo .bash_profile chỉ đặt PS1 khi chạy trong Emacs.

Kiểm tra trên máy của tôi, dòng đầu tiên của dấu nhắc có các ký tự điều khiển có vấn đề. Tôi đã tạo một ~ / .bash_profile bằng cái này.

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

Điều này đặt lời nhắc dựa trên những gì git-bash được đặt theo mặc định, nhưng tôi đã xóa dòng đầu tiên (tối đa đến ngắt dòng \ n). Tôi cũng đã xóa $ MSYSTEM, đặt MINGW64 trong dấu nhắc - tôi không cần phải thấy điều đó. Những gì còn lại là user @ host, thư mục hiện tại và git repo. Các ký tự điều khiển đặt màu mà Emacs hiển thị đúng cho tôi. (Để biết chi tiết về cách thiết lập lời nhắc của bạn, hãy tham khảo hướng dẫn sử dụng bash .)

Trong Emacs tôi đặt shell thành git-bash:

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

Với thiết lập này, tôi vẫn thấy thông báo lỗi ioctl ban đầu, nhưng nếu không thì mọi thứ hoạt động như mong đợi và mã hóa là utf-8.


Đó là công việc, cảm ơn! Điều đó (với tôi khó hiểu) dòng PS1 làm gì? Bạn có thể giúp tự động thiết lập mã hóa bộ đệm shell thành utf-8 không? ( MĂĄrtonnên đọc Márton)
marczellm

PS1 trong ví dụ của tôi được lấy từ một git-bash mặc định đã được đặt. Tôi vừa xóa mọi thứ cho đến khi ngắt dòng (\ n). Đó là sử dụng các chuỗi điều khiển đó để thay đổi màu của các bit thông tin khác nhau được hiển thị - người dùng hiện tại, máy chủ lưu trữ, git repo, v.v. Tôi phải theo dõi tài liệu bash PS1 để biết chi tiết. Đối với utf-8, những gì được default-process-coding-systemđặt trong Emacs của bạn?
glucas

Tôi đã tìm thấy điều này trong hướng dẫn sử dụng Emacs: "Để chỉ định hệ thống mã hóa cho shell, bạn có thể sử dụng lệnh Cx RET c ngay trước shell Mx. Bạn cũng có thể thay đổi hệ thống mã hóa cho một lớp con đang chạy bằng cách nhập Cx RET p vào trình bao đệm." (xem gnu.org/software/emacs/manual/html_node/emacs/NH )
glucas

Giá trị của nó là (undecided-dos . undecided-unix). Tôi đang tìm cách để tự động mã hóa bộ đệm thay vì phải nhớ một bộ tổ hợp phím khác mỗi lần khi mở nó. Có lẽ tôi nên hỏi một câu hỏi mới.
marczellm

Của tôi là utf-8 dos và UNIX. Tôi không đặt nó một cách rõ ràng nhưng tôi có các thiết lập này: (thích mã hóa hệ thống 'utf-8) (setq mặc định đệm-file mã hóa hệ thống' utf-8-unix)
glucas

1

Lỗi này chỉ ra một công tắc không khớp. Nó có thể được đặt thành -icvà bạn chỉ cần -c:

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

Tùy chọn khác là cung cấp tty cho git-bash với một lệnh tương tự (bất cứ thứ gì tương đương với windows):

/sbin/getty -l bash -n 38400 tty0

Đề nghị đầu tiên của bạn không thay đổi bất cứ điều gì. Hơn nữa, M-x list-processescho thấy rằng nó không có bất kỳ tác dụng: lệnh process là D:/Program Files/git/bin/bash --noediting -i. Đề nghị thứ hai của bạn tôi không thể hiểu.
marczellm

1
Đó là bởi vì bạn đã không loại bỏ công tắc -i.
Người dùng Emacs

Được rồi, vậy làm cách nào để loại bỏ nó?
marczellm

1
Bạn đang sử dụng explicit-shell-file-namevì vậy tôi tin rằng bạn sẽ muốn đặt ví dụ (setq explicit-bash-args '("--login" "-i")).
glucas

1

Tôi biết điều này không hoàn toàn giống với OP, nhưng tôi nghĩ đó là một lựa chọn thú vị. Bạn có thể bắt đầu emacs từ dòng lệnh git-bash. Nó sẽ làm cho emacs giả sử git-bash là vỏ.

Nhập một cái gì đó như sau từ dấu nhắc của bạn

bla@host MINGW64 ~/ $ emacs .&

Sau đó, trong emacs, Mx "vỏ"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.