Comment puis-je corriger mon invite en mode shell emacs?

13

Je fais de la programmation sur la machine d'un collègue. Il a une version d'emacs (23.1.1) que je n'ai jamais utilisée auparavant. Mon problème est que lorsque je passe en mode shell, mon invite bash ressemble à ceci:

^[]0;jay@socrates:~^G[jay@socrates]$ 

Je me suis PS1mis à '[\u@\h]\$ 'mon .bashrc. Il est censé ressembler à ceci:

[jay@socrates]$

Voici à quoi cela ressemble dans un shell régulier. J'ai également vérifié que PS1 est réglé sur la valeur correcte dans le shell emacs, donc maintenant je n'ai plus d'idées. Comment puis-je obtenir mon invite pour ressembler à ce que je veux?

J'ai vu quelques suggestions à utiliser termou à la eshellplace de shell. terma le même problème d'invite que ci-dessus, et eshellignore complètement mon PS1donc ça n'aide pas vraiment.

Jay Conrod
la source

Réponses:

13

Votre shell essaie de définir le titre / en-tête de l'XTerm (ou d'une autre console). Il y a plusieurs façons de procéder.

Assurez-vous d'abord que la PS1 est vraiment ce que vous pensez qu'elle est

echo $PS1 | less -E

Cela vous dira s'il y a des caractères de contrôle dans l'invite, moins les rendra drôles. En supposant que votre invite est exactement comme vous le dites, il s'agit probablement de la variable d'environnement PROMPT_COMMAND. Vous pouvez voir cela de la même manière ...

echo $PROMPT_COMMAND | less -E

Si la commande d'invite est le problème, vous pouvez simplement la désactiver. Dans les deux cas, ces variables sont en cours de configuration quelque part et ne doivent pas être définies pour mettre à jour l'en-tête XTerm, si vous n'êtes pas dans un XTerm!

Vous pouvez regarder dans le bashrc "standard" (/ etc / bashrc). Vous devriez voir du code qui vérifie un shell itératif (PS1 est défini), puis vérifie xterm (en regardant la variable $ TERM), et fait quelque chose de différent là-bas que pour les autres types de terminaux.

Je soupçonne quelque part dans l'initialisation bash est une configuration codée en dur, qui ne devrait être effectuée que sur des programmes de console compatibles xterm. Lisez man bash pour trouver une liste complète des fichiers que vous pouvez rechercher et parcourir.

Si tout ce qui précède échoue, essayez

printenv | less

Et voyez si vous pouvez trouver quelque chose de suspect là-dedans, puis recherchez où il est réglé. Publiez-le ici si vous ne pouvez pas le résoudre.

Peter
la source
1
PROMPT_COMMAND était le problème. Je ne sais pas où il est réglé, mais j'ai ajouté une ligne à mon ~ / .bashrc pour le désactiver, et cela fonctionne. Merci!
Jay Conrod
PROMPT_COMMAND me tuait aussi. J'utilise MobaXTerm et il a une invite bash particulièrement compliquée qui était une combinaison de PS1 et PROMPT_COMMAND.
Steve Broberg
5

J'ai rencontré exactement le même problème et cela est dû à PROMPT_COMMAND. J'aime le titre xterm. J'ai donc ajouté la ligne suivante dans ~ / .emacs_bash

export PROMPT_COMMAND=""
SG1
la source
2

Cela peut être lié au type de terminal du shell emacs par rapport à votre shell normal. Vérifiez à quoi la TERMvariable d'environnement est définie dans les deux shells. S'ils sont différents, vous devriez pouvoir modifier le type de terminal du shell emacs ou utiliser une définition PS1 différente pour le type de terminal emacs dans .bashrc.

Vous pouvez également essayer M-x ansi-term(et ansi-color-for-comint-mode-onsi vous avez des invites de couleur).

luapyad
la source
1
ansi-color-for-comint-mode-on m'a aidé!
User1
1

Cela a été très bien répondu sur le site stackoverflow. par Daniel Poe.

Voici sa réponse.

Vous pouvez utiliser AnsiTerm qui prend en charge les couleurs ou vous pouvez activer AnsiColor pour le shell normal:

(autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
Communauté
la source