Emacs 多项未正确显示特殊字符

Posted

技术标签:

【中文标题】Emacs 多项未正确显示特殊字符【英文标题】:Emacs multi-term not displaying special characters correctly 【发布时间】:2013-02-24 13:33:44 【问题描述】:

这很奇怪。我在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-term 终端上运行良好 (M-x ansi-term) - 请参见下面的示例:

但是,它在 Emacs 中的 multi-term 下效果不佳,如下所示:

我认为multi-term 能够解释与gnome-terminalansi-term 等终端相同的转义字符集。为什么它不能正确解释git-prompt_info 和其他人返回的转义字符?

我也试过了:

M-x set-terminal-coding-system 并将其设置为 utf-8-unix TERM=eterm-color 在多端终端内,或者调用 Emacs 之前等。 TERM= 在多端终端内,或者调用 Emacs 之前等。 从我的.zshrc 中删除任何export TERM

更新(2014 年 1 月 29 日):

到目前为止,最好的解决方案似乎是执行以下操作:

TERM=xterm-256color

但导致我在这里报告的另一个问题:Passing escape sequences to shells within ansi-term in Emacs。

【问题讨论】:

在此处查看答案,看看是否有效。 ***.com/questions/8918910/… 感谢@JesusRamos 这对ansi-term 非常有用!出于某种原因,这对于 Emacs multi-term (应该扩展 ansi-term)是不够的......嗯 我停止使用多术语,而是自己使用M-x rename-buffer。这样就可以了:) 您可能需要检查两件事。 1. TERM 应该是 emacs 终端缓冲区中的 eterm-color。 2.编码系统应设置为utf-8-unixM-x set-terminal-coding-system。默认值可以在变量default-terminal-coding-system中设置 TERM=xterm-256color 解决了我的问题。如果它弄坏了其他东西,我不会感到惊讶,但我不会去寻找它——我一直在这条路上,它以泪水告终。 【参考方案1】:

为什么它不解释返回的转义字符 git-prompt_info 等正确吗?

答案很可能是multi-term 只是不准备接受那些转义序列,以这种格式,无论出于何种原因。这可能是配置问题、错误或故意的。将模式设置为接受颜色,即TERM=xterm-256color,可以改善这种情况,因为它随后接受类似于终端模拟器中使用的标准格式的颜色转义序列,例如:

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

code borrowed from here

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

这里有更多info,并附有相关摘录:

因此,理解颜色的是您的终端模拟器。您的 终端仿真器知道\033[0;36m 是青色,但另一个 终端模拟器可能使用完全不同的字符集 对于青色(尽管没有理智的终端模拟器会标榜标准 并做到这一点)。这就是tput 的原因。当您运行tput setaf 6 时,tput 将查找终端的转义码 颜色 6(青色),并输出转义码。

我怀疑,在你的另一个问题中, alt+balt+f 的原因是'在您的其他问题中不起作用是由于对这些应该是非打印或零宽度的转义序列的不正确解释而导致终端宽度计数关闭。我没有经常使用multi-term,但解决方案可能涉及使用tput 或类似的方法,以使其正确理解转义序列。

Possible relevant troubleshooting info

【讨论】:

这句话很多,但不是特别有用(一个好的答案可能指向documentation,并注意相关部分是term.el(没有“xterm”任何东西)。

以上是关于Emacs 多项未正确显示特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

BULK INSERT 后特殊字符显示不正确

mysql数据库中的特殊字符

在 RichTextBox 中显示特殊字符(韩文字母)

德语特殊字符 Ää、Öö、Üü、ß 在 LiveLink 或 opentext 中显示不正确

Rss提供视图,显示标题中编码的特殊字符

重新加载后带有特殊字符的jqGrid过滤器问题