Git Bash dans emacs sur Windows

9

Je peux exécuter le shell Bash fourni avec Git pour Windows. Je mets ceci dans mon .emacs:

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

M-x git-bashEt puis voila, bash s'exécute mais avec une certaine bizarrerie:

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
$ 

et il imprime cette ligne, en commençant par ^[], après chaque commande que j'exécute. De plus, l'encodage est foiré. Comment puis-je résoudre ce problème .emacs?

marczellm
la source

Réponses:

10

Le ^[]bruit provient de divers caractères de contrôle de terminal dans votre invite de shell. Essayez echo $PS1de voir la séquence complète, et essayez par exemple export PS1='$ 'de voir qu'une chaîne d'invite plus simple supprime ce problème particulier.

Pour l'encodage, vous pouvez essayer de faire de utf-8 votre encodage préféré:

(prefer-coding-system 'utf-8)

Configuration de l'invite

Emacs définit la variable INSIDE_EMACS afin que vous puissiez créer un .bash_profile qui définit PS1 uniquement lors de l'exécution dans Emacs.

En testant sur ma machine, la première ligne de l'invite présente les caractères de contrôle problématiques. J'ai créé un ~ / .bash_profile avec ceci.

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

Cela définit l'invite en fonction de ce que git-bash définissait par défaut, mais j'ai supprimé la première ligne (jusqu'au \ n saut de ligne). J'ai également supprimé le $ MSYSTEM qui met MINGW64 dans l'invite - je n'ai pas besoin de voir cela. Il ne reste que l'utilisateur @ host, le répertoire courant et le dépôt git. Les caractères de contrôle définissent les couleurs qu'Emacs affiche correctement pour moi. (Pour plus de détails sur la configuration de votre invite, reportez-vous au manuel bash .)

Dans Emacs, j'ai défini le shell sur git-bash:

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

Avec cette configuration, je vois toujours le message d'erreur ioctl initial, mais sinon les choses fonctionnent comme prévu et l'encodage est utf-8.

glucas
la source
Cela fonctionne, merci! Que fait cette ligne PS1 (pour moi cryptique)? Pouvez-vous aider à définir automatiquement l'encodage du tampon shell sur utf-8? (à MĂĄrtonlire Márton)
marczellm
La PS1 dans mon exemple était dérivée de celle par défaut que git-bash avait définie. Je viens de tout supprimer jusqu'au saut de ligne (\ n). Il utilise ces séquences de contrôle pour changer la couleur des différents bits d'informations affichés - l'utilisateur actuel, l'hôte, le dépôt git, etc. Je devrais retrouver le doc bash PS1 pour plus de détails. Pour utf-8, quel est le default-process-coding-systemréglage de votre Emacs?
glucas
J'ai trouvé ceci dans le manuel Emacs: "Pour spécifier un système de codage pour le shell, vous pouvez utiliser la commande Cx RET c juste avant le shell Mx. Vous pouvez également changer le système de codage pour un sous-shell en cours d'exécution en tapant Cx RET p dans le shell tampon." (voir gnu.org/software/emacs/manual/html_node/emacs/… )
glucas
Sa valeur est (undecided-dos . undecided-unix). Je cherche un moyen de définir l'encodage du tampon automatiquement au lieu de devoir se souvenir d'un autre ensemble de touches à chaque ouverture. Je devrais peut-être poser une nouvelle question.
marczellm
Le mien est utf-8 dos et UNIX. Je ne le définis pas explicitement mais j'ai ces paramètres: (prefer-coding-system 'utf-8) (setq-default buffer-file-coding-system' utf-8-unix)
glucas
1

Cette erreur indique un commutateur non compatible. Il est probablement réglé sur -icet vous avez juste besoin de -c:

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

L'autre option est de fournir tty à git-bash avec une commande similaire à (quel que soit l'équivalent de Windows):

/sbin/getty -l bash -n 38400 tty0
Utilisateur Emacs
la source
Votre première suggestion ne change rien. De plus, M-x list-processesmontre que cela n'a eu aucun effet: la commande process est D:/Program Files/git/bin/bash --noediting -i. Votre deuxième suggestion, je ne peux pas la comprendre.
marczellm
1
C'est parce que vous n'avez pas supprimé le commutateur -i.
Emacs User
D'accord, alors comment puis-je le supprimer?
marczellm
1
Vous utilisez explicit-shell-file-namedonc je crois que vous voudriez définir par exemple (setq explicit-bash-args '("--login" "-i")).
glucas
1

Je sais que ce n'est pas exactement la même chose que l'OP, mais je pense que c'est une option intéressante. Vous pouvez démarrer emacs à partir de la ligne de commande git-bash. Cela obligera emacs à assumer git-bash comme shell.

Entrez quelque chose comme ce qui suit à partir de votre invite bash

bla@host MINGW64 ~/ $ emacs .&

Ensuite, dans emacs, Mx "shell"

jamars
la source