Git Bash en emacs en Windows


9

Puedo ejecutar el shell Bash que viene con Git para Windows. Puse esto en mi .emacs:

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

Entonces M-x git-bashy listo, bash se está ejecutando pero con cierta rareza:

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
$ 

e imprime esa línea, comenzando con ^[], después de cada comando que ejecuto. También la codificación está en mal estado. ¿Cómo puedo solucionar esto .emacs?

Respuestas:


10

El ^[]ruido proviene de varios caracteres de control de terminal en su indicador de shell. Intente echo $PS1ver la secuencia completa e intente, por ejemplo, export PS1='$ 'ver que una cadena de solicitud más simple elimine ese problema en particular.

Para la codificación, puede intentar que utf-8 sea su codificación preferida:

(prefer-coding-system 'utf-8)

Configurar el aviso

Emacs establece la variable INSIDE_EMACS para que pueda crear un .bash_profile que establezca PS1 solo cuando se ejecuta en Emacs.

Al probar en mi máquina, la primera línea del indicador tiene los caracteres de control problemáticos. Creé un ~ / .bash_profile con esto.

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

Esto establece el indicador en función de lo que git-bash estaba configurando de manera predeterminada, pero eliminé la primera línea (hasta el salto de línea \ n). También eliminé el $ MSYSTEM que pone MINGW64 en el indicador, no necesito ver eso. Lo que queda es el usuario @ host, el directorio actual y el repositorio de git. Los caracteres de control establecen los colores que Emacs muestra correctamente para mí. (Para obtener detalles sobre cómo configurar su solicitud, consulte el manual de bash ).

En Emacs configuro el shell para git-bash:

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

Con esta configuración, sigo viendo el mensaje de error inicial de ioctl, pero de lo contrario las cosas funcionan como se esperaba y la codificación es utf-8.


Eso funciona, gracias! ¿Qué hace esa (para mí críptica) línea PS1? ¿Puedes ayudar a configurar automáticamente la codificación del búfer de shell en utf-8? ( MĂĄrtondebería leer Márton)
marczellm

La PS1 en mi ejemplo se derivó del valor predeterminado que había establecido un git-bash. Acabo de eliminar todo hasta el salto de línea (\ n). Está utilizando esas secuencias de control para cambiar el color de los diversos bits de información que se muestran: el usuario actual, el host, el repositorio de git, etc. Tendría que rastrear el documento bash PS1 para obtener más detalles. Para utf-8, ¿qué está default-process-coding-systemconfigurado en su Emacs?
glucas

Encontré esto en el manual de Emacs: "Para especificar un sistema de codificación para el shell, puede usar el comando Cx RET c inmediatamente antes del shell Mx. También puede cambiar el sistema de codificación para un subshell en ejecución escribiendo Cx RET p en el shell buffer." (ver gnu.org/software/emacs/manual/html_node/emacs/… )
glucas

Su valor es (undecided-dos . undecided-unix). Estoy buscando una manera de configurar la codificación del búfer automáticamente en lugar de tener que recordar otro conjunto de teclas cada vez que lo abro. Tal vez debería hacer una nueva pregunta.
marczellm

El mío es utf-8 dos y UNIX. No lo configuro explícitamente, pero sí tengo esta configuración: (prefer-coding-system 'utf-8) (setq-default buffer-file-coding-system' utf-8-unix)
glucas

1

Este error apunta a un interruptor no coincidente. Probablemente esté configurado -icy solo necesita -c:

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

La otra opción es proporcionar tty a git-bash con un comando similar a (lo que sea equivalente a Windows):

/sbin/getty -l bash -n 38400 tty0

Su primera sugerencia no cambia nada. Además, M-x list-processesmuestra que no tuvo ningún efecto: el comando de proceso es D:/Program Files/git/bin/bash --noediting -i. Su segunda sugerencia no puedo entender.
marczellm

1
Esto se debe a que no eliminó el modificador -i.
Usuario de Emacs

Bien, entonces, ¿cómo lo elimino?
marczellm

1
Lo estás usando, explicit-shell-file-nameasí que creo que te gustaría configurar, por ejemplo (setq explicit-bash-args '("--login" "-i")).
glucas

1

Sé que esto no es exactamente lo mismo que el OP, pero creo que es una opción interesante. Puede iniciar emacs desde la línea de comandos de git-bash. Hará que emacs asuma git-bash como el shell.

Ingrese algo como lo siguiente desde su solicitud de bash

bla@host MINGW64 ~/ $ emacs .&

Luego, en emacs, Mx "shell"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.