Windows上的Emacs中的Git Bash


9

我可以运行Windows版Git随附的Bash shell。我把这个放在我的.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

Answers:


10

^[]噪声是从各种终端控制字符来在shell提示符。尝试echo $PS1查看完整的序列,然后尝试例如export PS1='$ '查看更简单的提示字符串来消除该特定问题。

对于编码,您可以尝试将utf-8设置为首选编码:

(prefer-coding-system 'utf-8)

设置提示

Emacs设置了INSIDE_EMACS变量,因此您可以创建一个.bash_profile,仅在Emacs中运行时才设置PS1。

在我的机器上测试,提示的第一行包含有问题的控制字符。我用这个创建了〜/ .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设置。我只是删除了所有内容,直到换行符(\ n)。它使用这些控制序列来更改所显示的各种信息的颜色-当前用户,主机,git repo等。我必须跟踪bash PS1文档以获取详细信息。对于utf-8,default-process-coding-system您的Emacs中设置了什么?
glucas

我在Emacs手册中发现了这一点:“要为shell指定编码系统,您可以在Mx shell之前立即使用命令Cx RET c。也可以通过在shell中键入Cx RET p来更改正在运行的子shell的编码系统。缓冲。” (见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

1

此错误表示交换机不匹配。它可能设置为-ic,您只需要-c

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

另一个选项是使用类似于以下命令的命令向git-bash提供tty(无论Windows是否等效):

/sbin/getty -l bash -n 38400 tty0

您的第一个建议没有任何改变。而且,M-x list-processes表明它没有任何作用:process命令是D:/Program Files/git/bin/bash --noediting -i。您无法理解的第二个建议。
marczellm '16

1
那是因为您没有删除-i开关。
Emacs用户

好的,如何删除它?
marczellm '16

1
您正在使用,explicit-shell-file-name所以我相信您希望设置例如(setq explicit-bash-args '("--login" "-i"))
glucas

1

我知道这与OP并不完全相同,但是我认为这是一个有趣的选择。您可以从git-bash命令行启动emacs。它将使emacs假定git-bash作为shell。

在bash提示符下输入如下内容

bla@host MINGW64 ~/ $ emacs .&

然后,在emacs中,Mx“ shell”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.