Emacs多项不能正确显示特殊字符

这很奇怪 我在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}" 

它在gnome-terminal以及Emacs的ansi-termterminal( Mx ansi-term )中效果很好 – 请参阅下面的示例:

提示示例gnome-terminal / ansi-term

但是,在Emacs的multi-term下,它不能正常工作,如下所示:

提示示例多项

我认为multi-term将能够解释像gnome-terminalansi-term这样的terminal相同的一组转义字符。 为什么它没有正确解释git-prompt_info和其他人返回的转义字符?

我也试过了:

  • Mx set-terminal-coding-system并将其设置为utf-8-unix
  • TERM=eterm-color多任期terminal中的TERM=eterm-color ,或在调用Emacs之前等
  • TERM=在多任期terminal中,或在调用Emacs之前等
  • 从我的.zshrc删除任何export TERM

更新(2014年1月29日):

到目前为止,最好的解决scheme似乎是要做到以下几点:

TERM=xterm-256color

但导致另一个我在这里报告的问题: 在Emacs的ansi-term中传递转义序列到shell 。

为什么它没有正确解释git-prompt_info和其他人返回的转义字符?

答案很可能是multi-term不准备以任何理由接受这种格式的转义序列。 这可能是一个configuration问题,错误或故意。 将模式设置为接受颜色(即TERM=xterm-256color )改善了这种情况,因为它接受类似于terminal仿真器中使用的标准格式的颜色转义序列,例如:

 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 

从这里借用的代码

突出部分是颜色[0;31m ,在另一个问题的“更新2”中的链接线程中引用,询问为什么以4m开始的行是打印出来的,这是该颜色转义序列的一部分。

以下是更多信息 ,并附有相关摘录:

因此,它是理解颜色的terminal模拟器。 你的terminal仿真器明白\033[0;36m是青色的,但另一个terminal仿真器可能使用一组完全不同的字符来进行青色(尽pipe没有一个合理的terminal仿真器会标榜这个标准。 这是tput的原因。 当您运行tput setaf 6tput将查找您的terminal的颜色6(青色)的转义码,并输出该转义码。

我怀疑在你的另一个问题中, alt + balt + f在你的另一个问题中没有起作用的原因是由于terminal宽度计数被closures,因为这些转义序列被错误地解释,打印或零宽度。 我并没有把multi-term混淆很多,但解决scheme可能涉及到使用tput或类似的方法来正确理解转义序列。

可能的相关疑难解答

Interesting Posts