Emacs multi-term неправильно отображает специальные символы

Это странно Я определил следующую подсказку в 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 а также в ansi-term терминал в Emacs (Mx ansi-term) - см. пример ниже:

подскажите пример gnome-terminal / ansi-term

Тем не менее, он не работает хорошо под multi-term в Emacs, как вы можете видеть ниже:

подскажите пример многолетнего

я думал multi-term будет способен интерпретировать тот же набор escape-символов, что и терминал, как gnome-terminal или же ansi-term делает. Почему он не интерпретирует escape-символы, возвращаемые git-prompt_info а другие правильно?

Я также попробовал:

  • Mx set-terminal-coding-system и установив его utf-8-unix
  • TERM=eterm-color в терминале с несколькими терминами или перед вызовом Emacs и т. д.
  • TERM= в терминале с несколькими терминами или перед вызовом Emacs и т. д.
  • Удаление любого export TERM от моего .zshrc

Обновление (29 января 2014 г.):

Наилучшее решение на данный момент заключается в следующем:

TERM=xterm-256color

но вызывает еще одну проблему, о которой я сообщил здесь: передача escape-последовательностей оболочкам внутри ansi-term в Emacs.

1 ответ

Почему он неправильно интерпретирует escape-символы, возвращаемые git-prompt_info и другими?

Скорее всего, ответ multi-term просто не готов принять эти escape-последовательности в этом формате по любой причине. Это может быть проблема конфигурации, ошибка или преднамеренное. Настройка режима приема цветов, т.е. 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 is cyan, но другой эмулятор терминала может использовать совершенно другой набор символов для cyan (хотя никакой нормальный эмулятор терминала не будет выставлять напоказ стандарт и делать это). Это причина tput, Когда ты бежишь tput setaf 6, tput собирается найти коды выхода вашего терминала для цвета 6 (голубой) и вывести этот код перехода.

Я подозреваю, что в вашем другом вопросе причина того, что alt+b и alt+f не работают в вашем другом вопросе, заключается в том, что счетчик ширины терминала отключен из-за неправильной интерпретации этих escape-последовательностей, которые должны быть не печать или нулевая ширина. Я не перепутал с multi-term много, но решение может включать использование tput или подобное, чтобы позволить ему правильно понять escape-последовательности.

Возможная информация по устранению неполадок

Другие вопросы по тегам