Цвета Emacs устанавливаются по-разному, когда TERM является «screen-256color» и «xterm-256color»,

Я использую Emacs в терминале, и обнаруживаю, что когда переменная среды TERM изменяется между screen-256color и xterm-256color , цвета по умолчанию в Emacs устанавливаются по-разному.

Чтобы быть ясным, я получаю полную поддержку 256-битной цветовой поддержки в обеих ситуациях (работает с byobu/tmux и работает с Gnome Terminal соответственно), но Emacs применяет разные цвета, так что, когда я смотрю на один и тот же файл Python, синтаксис подсветка использует разные цвета в каждом. Когда я вручную меняю цвета с помощью color-theme-select на ту же тему, они затем используют одни и те же цвета. Проблема в том, что я понятия не имею, как начинаются цвета, и что более важно, почему они установлены по-разному.

Это поведение остается постоянным, когда я принуждаю byobu использовать TERM = xterm-256color , поэтому не похоже, что это проблема с любым из эмуляторов терминала.

Как я могу гарантировать, что Emacs использует одни и те же цвета в каждой ситуации?

3

2 ответы

Проблема в том, что я понятия не имею, как начинаются цвета, и что более важно, почему они установлены по-другому.

Возможно, это обсуждение в StackOverflow имеет значение - некоторые детализированные ответы на то, что происходит.


В моем случае был способ emacs обнаружил цвет фона . Он имеет резерв для xterm - * , но не screen - * , и использовал черный фон, тогда как на самом деле белый (не судите).

Обходной путь также указан в связанном ответе - настройка правильного цвета фона вручную (по сравнению с сообщением emacs "лежит" путем изменения TERM ), путем оценки ( Alt + x eval , или Alt +: ):

(let ((frame-background-mode 'light)) (frame-set-background-mode nil))
3
добавлено

Я вряд ли эксперт в этом, но я считаю, что это не обязательно связано с Emacs, а скорее с возможностями терминала.

Например, вы можете увидеть различные возможности терминала с помощью infocmp -I -r -T xterm-256colили и infocmp -I -r -T screen-256colили . Я сделал быстрое сравнение между ними и отметил, что xterm-256colили обладает значительным количеством дополнительных возможностей.

После некоторых догадок я считаю, что происходит то, что Emacs находит initc capabilitiy и использует его для предоставления большего количества оттенков определенного цвета для темы по умолчанию. См. Например, этот вопрос:

https://stackoverflow.com/questions/ 2814478/как-может-я-выход-разные-оттенки-о-зелено-к-терминал

Я не уверен, что вы можете полностью контролировать это поведение из Emacs, но, как вы заметили, вы можете использовать colили-theme-select , чтобы изменить поведение. Временное исправление может состоять в том, чтобы просто использовать (load-theme "theme" t) в вашем .emacs , чтобы заставить тему, которую вы имели в виду.

Другим вариантом может быть установка вручную переменных среды TERMINFO или TERMCAP, указывающих на файл с соответствующими возможностями терминала.

Например, вы можете:

expилиt TERMINFO="$HOME/.terminfo"
infocmp -I -r -T xterm-256colили > $TERMINFO

или

expилиt TERMCAP="$HOME/.termcap"
infocmp -C -r -T xterm-256colили > $TERMCAP

This fилиces Emacs to use the terminal capabilities you had in mind. It may also have other side-effects but I haven't seen any yet.

I don't know why tmux/byobu seems to ignилиe fилиcing TERM as you describe. In tmux however, I know that you can use set-option -g xterm-256colили to fилиce the terminal to use. I don't know about byobu however.

1
добавлено
Боюсь, я не могу дать полный ответ. У меня был (очень) краткий взгляд в источнике Emacs (src/term.c), и, похоже, он делает разные вещи в зависимости от этих возможностей, так что это, вероятно, то, что происходит.
добавлено автор Nick Retallack, источник
А теперь интересно, что xterm-256color имеет больше возможностей. Странно, что это не соответствует тому, что я вижу по цвету. Когда я играю со всеми различными цветовыми палитрами в эмуляторе терминала (Guake), Emacs, работающий с screen-256color , реагирует гораздо более динамически, чем Emacs, работающий под xterm-256color . В последнем случае меньше way меньше изменений внешнего вида палитр. Настолько, что половина из них выглядит одинаково. Таким образом, внешний вид выглядит почти таким, как screen-256color дает больше возможностей.
добавлено автор Craig B., источник
О, это было не то, что byobu игнорировал TERM. Я пытался сказать, что когда я устанавливаю TERM на xterm-256color byobu, он действительно чтит его, а также отображает те же цвета, что и я, для этого значения TERM на других неэкранированных терминалах. Который говорит нам, что это не бебу делать что-то странное.
добавлено автор Craig B., источник
Еще одно дополнение: цвета выглядят постоянными между двумя для частей терминала, которые не запускают Emacs. Возможно, как вы полагаете, это связано с тем, как Emacs инициализирует цвета, когда TERM - xterm-256color. Честно говоря, если у меня нет странной настройки, похоже, что это неправильно. Я загрузил emacs без моего файла инициализации, и он все еще делает это.
добавлено автор Craig B., источник