Git Bash in emacs su Windows


9

Posso eseguire la shell Bash fornita con Git per Windows. Ho inserito questo nel mio .emacs:

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

Quindi M-x git-bashe voilà, bash sta correndo ma con qualche stranezza:

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 stampa quella riga, a cominciare da ^[], dopo ogni comando che eseguo. Anche la codifica è incasinata. Come posso risolvere questo problema .emacs?

Risposte:


10

Il ^[]rumore proviene da vari caratteri di controllo del terminale nel prompt della shell. Prova echo $PS1a vedere l'intera sequenza e prova ad esempio export PS1='$ 'a vedere che una stringa di prompt più semplice rimuove quel particolare problema.

Per la codifica, potresti provare a rendere utf-8 la tua codifica preferita:

(prefer-coding-system 'utf-8)

Impostazione del prompt

Emacs imposta la variabile INSIDE_EMACS in modo da poter creare un file .bash_profile che imposta PS1 solo durante l'esecuzione in Emacs.

Test sulla mia macchina, la prima riga del prompt presenta i caratteri di controllo problematici. Ho creato un ~ / .bash_profile con questo.

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

Questo imposta il prompt in base all'impostazione predefinita di git-bash, ma ho rimosso la prima riga (fino all'interruzione di linea \ n). Ho anche rimosso $ MSYSTEM che inserisce MINGW64 nel prompt - non ho bisogno di vederlo. Ciò che rimane è l'utente @host, la directory corrente e il repository git. I personaggi di controllo impostano i colori che Emacs visualizza correttamente per me. (Per i dettagli sulla configurazione del prompt, consultare il manuale di bash .)

In Emacs ho impostato la shell su git-bash:

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

Con questa configurazione sto ancora vedendo il messaggio di errore iniziale ioctl, ma per il resto le cose funzionano come previsto e la codifica è utf-8.


Funziona, grazie! Cosa fa quella (per me enigmatica) linea PS1? Potete aiutarmi a impostare automaticamente la codifica del buffer della shell su utf-8? ( MĂĄrtondovrebbe leggere Márton)
marczellm,

La PS1 nel mio esempio è stata derivata dall'impostazione predefinita impostata da git-bash. Ho appena eliminato tutto fino all'interruzione di riga (\ n). Sta usando quelle sequenze di controllo per cambiare il colore dei vari bit di informazione mostrati - l'utente corrente, l'host, il repository git, ecc. Dovrei rintracciare il documento di PS1 bash per i dettagli. Per utf-8, cosa è default-process-coding-systemimpostato in Emacs?
Glucas,

Ho trovato questo nel manuale di Emacs: "Per specificare un sistema di codifica per la shell, puoi usare il comando Cx RET c immediatamente prima della shell Mx. Puoi anche cambiare il sistema di codifica per una subshell in esecuzione digitando Cx RET p nella shell buffer." (vedi gnu.org/software/emacs/manual/html_node/emacs/… )
glucas

Il suo valore è (undecided-dos . undecided-unix). Sto cercando un modo per impostare automaticamente la codifica del buffer invece di dover ricordare un'altra serie di sequenze di tasti ogni volta che lo si apre. Forse dovrei fare una nuova domanda.
marczellm,

Il mio è utf-8 dos e UNIX. Non l'ho impostato esplicitamente ma ho queste impostazioni: (prefer-coding-system 'utf-8) (setq-default buffer-file-coding-system' utf-8-unix)
glucas

1

Questo errore indica un interruttore non corrispondente. Probabilmente è impostato su -iced è necessario solo -c:

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

L'altra opzione è fornire tty a git-bash con un comando simile a (qualunque sia l'equivalente di Windows):

/sbin/getty -l bash -n 38400 tty0

Il tuo primo suggerimento non cambia nulla. Inoltre, M-x list-processesmostra che non ha avuto alcun effetto: il comando process è D:/Program Files/git/bin/bash --noediting -i. Il tuo secondo suggerimento non riesco a capire.
marczellm,

1
Questo perché non hai rimosso l'opzione -i.
Utente Emacs

Okay, quindi come posso rimuoverlo?
marczellm,

1
Stai usando explicit-shell-file-namequindi credo che vorresti impostare ad es (setq explicit-bash-args '("--login" "-i")).
Glucas,

1

So che questo non è esattamente lo stesso dell'OP, ma penso che sia un'opzione interessante. Puoi avviare emacs dalla riga di comando git-bash. Farà emacs assumere git-bash come shell.

Inserisci qualcosa come il seguente dal tuo prompt di bash

bla@host MINGW64 ~/ $ emacs .&

Quindi, in emacs, Mx "shell"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.