Emacs multi-term 无法正确显示特殊字符

52

这很奇怪。我在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)- 请参见下面的示例:

prompt example gnome-terminal/ansi-term

但是,在Emacs的multi-term下,它表现不佳,如下所示:

prompt example multi-term

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

我还尝试过:

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

更新(2014年1月29日):

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

TERM=xterm-256color

但这会引起另一个问题,我在此处报告了该问题:传递转义序列到emacs中ansi-term内嵌shell


在这里检查答案,看看是否有效。https://dev59.com/Wmox5IYBdhLWcg3w3YH- - Jesus Ramos
谢谢@mikyra。我目前在我的.zshrc中有export TERM='xterm-256color'。我应该将其更改为eterm-color吗? - Amelio Vazquez-Reina
不,不要使用 exportTERM=xterm-256color 就足够了。我也在 gnome-terminal 中使用它。如果将其“导出”,emacs 似乎会感到困惑,并且在 term-mode 中不会将其设置为 eterm-color,而是将其定义为 xterm-256color,这会给那些大量使用 ncurses 等程序的用户带来一些有趣的效果。 - mikyra
你最终解决了这个问题吗?你能发一条回复吗? - YuppieNetworking
2
TERM=xterm-256color 解决了我的问题。如果它导致其他问题,我也不会感到惊讶,但我不会去寻找 -- 我已经走过那条路,结果只有泪水。 - duma
显示剩余6条评论
1个回答

1
为什么它不能正确解释由git-prompt_info和其他命令返回的转义字符?
答案很可能是multi-term没有准备好接受这些转义序列,无论出于什么原因。这可能是配置问题、错误或有意为之。将模式设置为接受颜色,即TERM=xterm-256color,可以改善情况,因为它接受类似于终端仿真器之间使用的标准格式的颜色转义序列。
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开头的行,这是该颜色转义序列的一部分。

这里有更多信息,其中包含相关摘录:

因此,是你的终端模拟器理解颜色。你的终端模拟器理解\033[0;36m是青色,但是另一个终端模拟器可能会使用完全不同的字符集来表示青色(虽然没有正常的终端模拟器会违反标准并这样做)。这就是tput存在的原因。当你运行tput setaf 6时,tput将查找你的终端的转义代码以获取颜色6(青色)的输出。

我怀疑,在你的其他问题中,alt+balt+f无法工作的原因是由于这些转义序列的错误解释导致终端宽度计数出现了问题,这些转义序列应该是非打印或零宽度的。我没有深入研究multi-term,但解决方案可能涉及使用tput或类似工具来让它正确理解转义序列。

可能相关的故障排除信息


这是很多话,但并不特别有帮助(一个好的答案可能会指向文档,并指出相关部分是term.el(没有任何“xterm”)。 - Thomas Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接