Git Bash no emacs no Windows

9

Eu posso executar o shell Bash que acompanha o Git for Windows. Coloquei isso no meu .emacs:

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

Então, M-x git-bashe pronto, o bash está em execução, mas com alguma estranheza:

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 essa linha, começando com ^[], após cada comando que corro. Além disso, a codificação está confusa. Como posso corrigir isso .emacs?

marczellm
fonte

Respostas:

10

O ^[]ruído é proveniente de vários caracteres de controle de terminal no prompt do shell. Tente echo $PS1ver a sequência completa e, por exemplo, export PS1='$ 'verifique se uma sequência de prompt mais simples remove esse problema específico.

Para a codificação, você pode tentar fazer do utf-8 sua codificação preferida:

(prefer-coding-system 'utf-8)

Configurando o prompt

O Emacs define a variável INSIDE_EMACS para que você possa criar um .bash_profile que define o PS1 somente quando executado no Emacs.

Testando na minha máquina, a primeira linha do prompt possui os caracteres de controle problemáticos. Eu criei um ~ / .bash_profile com isso.

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

Isso define o prompt com base no que o git-bash estava configurando por padrão, mas eu removi a primeira linha (até a \ n quebra de linha). Também removi o $ MSYSTEM, que coloca o MINGW64 no prompt - não preciso ver isso. O que resta é o usuário @ host, diretório atual e repositório git. Os caracteres de controle definem as cores que o Emacs exibe corretamente para mim. (Para detalhes sobre como configurar seu prompt, consulte o manual do bash .)

No Emacs, defino o shell para git-bash:

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

Com essa configuração, ainda estou vendo a mensagem de erro inicial do ioctl, mas, caso contrário, as coisas funcionam como esperado e a codificação é utf-8.

glucas
fonte
Isso funciona, obrigado! O que essa linha PS1 (para mim enigmática) faz? Você pode ajudar a definir automaticamente a codificação do buffer do shell para utf-8? ( MĂĄrtonDeve ler Márton)
marczellm
O PS1 no meu exemplo foi derivado do padrão que um git-bash havia definido. Acabei de excluir tudo até a quebra de linha (\ n). Ele está usando essas seqüências de controle para alterar a cor dos vários bits de informações mostrados - o usuário atual, o host, o repositório Git etc. Eu teria que rastrear o documento do PS1 do bash para obter detalhes. Para o utf-8, o que está default-process-coding-systemdefinido no seu Emacs?
glucas
Encontrei isso no manual do Emacs: "Para especificar um sistema de codificação para o shell, você pode usar o comando Cx RET c imediatamente antes do Mx shell. Você também pode alterar o sistema de codificação para um subshell em execução digitando Cx RET p no shell amortecedor." (consulte gnu.org/software/emacs/manual/html_node/emacs/… )
glucas
O seu valor é (undecided-dos . undecided-unix). Estou procurando uma maneira de definir a codificação de buffer automaticamente, em vez de ter que lembrar de outro conjunto de teclas sempre que abri-lo. Talvez eu deva fazer uma nova pergunta.
Marczellm 5/05
O meu é utf-8 dos e UNIX. Eu não o defini explicitamente, mas tenho as seguintes configurações: (prefer-coding-system 'utf-8) (setq-default-buffer-file-coding-system' utf-8-unix)
glucas
1

Este erro aponta para uma opção incompatível. Provavelmente está definido como -ice você precisa apenas de -c:

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

A outra opção é fornecer ao comando tty to git-bash um comando semelhante a (o que for equivalente ao Windows):

/sbin/getty -l bash -n 38400 tty0
Usuário Emacs
fonte
Sua primeira sugestão não muda nada. Além disso, M-x list-processesmostra que não teve nenhum efeito: o comando process é D:/Program Files/git/bin/bash --noediting -i. Sua segunda sugestão, não consigo entender.
Marczellm
11
Isso porque você não removeu a opção -i.
Usuário Emacs
Ok, então como faço para removê-lo?
Marczellm
11
Você está usando, explicit-shell-file-nameentão eu acredito que você gostaria de definir, por exemplo (setq explicit-bash-args '("--login" "-i")).
glucas 04/04
1

Eu sei que isso não é exatamente o mesmo que o OP, mas acho que é uma opção interessante. Você pode iniciar o emacs a partir da linha de comando git-bash. Isso fará com que o emacs assuma o git-bash como o shell.

Digite algo como o seguinte no seu prompt do bash

bla@host MINGW64 ~/ $ emacs .&

Então, no emacs, o Mx "shell"

jamars
fonte