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
) - см. пример ниже:
Тем не менее, он не работает хорошо под 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-последовательности.