Emacs multi-terme ne affichant pas correctement les caractères spéciaux

C’est étrange. J’ai défini l’invite suivante dans zsh :

 local user_host='%{$terminfo[bold]$fg[green]%}%n @ %m%{$reset_color%}' local current_dir='%{$terminfo[bold]$fg[blue]%} %~%{$reset_color%}' local git_branch='$(git_prompt_info)%{$reset_color%}' local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})" PROMPT="╭─${user_host} %D{[%a, %b %d %I:%M:%S]} ${current_dir} ${git_branch} ╰─%B$%b " RPS1="${return_code}" 

Cela fonctionne très bien sur gnome-terminal ainsi que dans un terminal ansi-term dans Emacs ( Mx ansi-term ) – voir l’exemple ci-dessous:

invite exemple gnome-terminal / ansi-term

Cependant, cela ne fonctionne pas bien sous multi-term dans Emacs comme vous pouvez le voir ci-dessous:

exemple rapide à court terme

Je pensais que multi-term serait capable d’interpréter le même ensemble de caractères d’échappement qu’un terminal comme gnome-terminal ou ansi-term . Pourquoi n’interprète-t-il pas correctement les caractères d’échappement renvoyés par git-prompt_info et d’autres?

J’ai aussi essayé:

  • Mx set-terminal-coding-system et le paramétrer sur utf-8-unix
  • TERM=eterm-color dans le terminal multi-term, ou avant d’appeler Emacs, etc.
  • TERM= dans le terminal multi-term, ou avant d’appeler Emacs, etc.
  • Supprimer toute export TERM de mon .zshrc

Mise à jour (29 janvier 2014):

La meilleure solution jusqu’à présent semble être de procéder comme suit:

TERM=xterm-256color

mais provoque un autre problème que j’ai signalé ici: Passer des séquences d’échappement à des shells dans ansi-term dans Emacs .

Pourquoi n’interprète-t-il pas correctement les caractères d’échappement renvoyés par git-prompt_info et d’autres?

La réponse est très probablement que multi-term n’est tout simplement pas prêt à accepter ces séquences d’échappement, dans ce format, quelle qu’en soit la raison. Cela peut être un problème de configuration, un bogue ou intentionnel. Définir le mode pour accepter les couleurs, c.-à-d. TERM=xterm-256color , améliore la situation car il accepte alors des séquences d’échappement de couleurs similaires au format standard utilisé par les émulateurs de terminaux, par exemple:

 RED='\033[0;31m' NC='\033[0m' # No Color echo "I ${RED}love${NC} Stack Overflow\n" # this output IS NOT interpreting the escapes echo -e "I ${RED}love${NC} Stack Overflow\n" # this output IS interpreting them 

code emprunté d’ici

la partie saillante est la [0;31m pour la couleur, qui est référencée dans le thread lié dans “Mise à jour 2” de votre autre question, demandant pourquoi les lignes sont imprimées commençant par 4m qui fait partie de cette séquence d’échappement de couleur.

Voici plus d’ infos , avec un extrait pertinent:

Ainsi, votre émulateur de terminal comprend les couleurs. Votre émulateur de terminal comprend que \033[0;36m est un cyan, mais un autre émulateur de terminal peut utiliser un jeu de caractères entièrement différent pour le cyan (bien qu’aucun émulateur de terminal ne le fasse et le fasse). C’est la raison du tput . Lorsque vous exécutez tput setaf 6 , tput va rechercher les codes d’échappement de votre terminal pour la couleur 6 (cyan) et afficher ce code d’échappement.

Je soupçonne, dans votre autre question, que la raison pour laquelle alt + b et alt + f ne fonctionnent pas dans votre autre question est due au fait que le compte de la largeur du terminal est désactivé en raison d’une interprétation incorrecte de ces séquences d’échappement supposées non impression ou largeur nulle. Je n’ai pas beaucoup joué avec le multi-term mais la solution peut impliquer l’utilisation de tput ou similaire pour lui permettre de comprendre correctement les séquences d’échappement.

Informations de dépannage possibles