True Color (24 бита) в Terminal Emacs

Я ищу хороший способ иметь 24-битный цвет в emacs при использовании эмулятора графического терминала. Konsole, например, поддерживает escape-коды для истинного цвета, как описано здесь: https://github.com/robertknight/konsole/blob/master/user-doc/README.moreColors

Моя проблема в том, что я не понимаю, как emacs переводит информацию о лице в escape-последовательности для терминала. Мне также не удалось узнать, присутствует ли где-то поддержка 24-битного цвета, и возможно ли вообще реализовать это с помощью emacs lisp. То, что я прошу, — это указатель на соответствующую документацию по Emacs или обоснованное мнение о том, возможно ли в данный момент иметь истинный цвет в terminal-emacs.


person grep    schedule 03.02.2013    source источник


Ответы (5)


Я использую xterm-frobs.el чтобы получить поддержку 256 цветовых терминов (в терминалах, совместимых с xterm, таких как konsole). я использую настройку TERM "xterm-256color". Поддержки 256 цветов в целом было более чем достаточно для меня, так как я не использую такое количество цветов в своей цветовой схеме. вышеупомянутый файл пытается опросить терминал, чтобы узнать, сколько цветов он поддерживает. я не знаю, должен ли он (или может быть адаптирован) поддерживать истинный цвет в консоли.

ОБНОВЛЕНИЕ: обратите внимание, что начиная с версии 26.1, emacs теперь поддерживает терминалы истинного цвета. Дополнительные сведения см. в ответе ниже.

person jtahlborn    schedule 03.02.2013

Это было недавно включено в emacs 26.1 (28 мая 2018 г.),

С этим файлом: terminfo-24bit.src

# Use colon separators.
xterm-24bit|xterm with 24-bit direct color mode,
  use=xterm-256color,
  setb24=\E[48:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
  setf24=\E[38:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm,
# Use semicolon separators.
xterm-24bits|xterm with 24-bit direct color mode,
  use=xterm-256color,
  setb24=\E[48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,
  setf24=\E[38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%dm,

Бегать:

tic -x -o ~/.terminfo terminfo-24bit.src

Теперь вы можете запустить emacs с истинным цветом.

TERM=xterm-24bit emacs -nw

См. часто задаваемые вопросы: https://www.gnu.org/software/emacs/manual/html_node/efaq/Colors-on-a-TTY.html

person ideasman42    schedule 29.05.2018
comment
Emacs возвращается к отсутствию цветов, когда я использую описанный выше подход. Это с emacs 26.1. Что я могу делать неправильно? я - person charliesneath; 19.07.2020
comment
Это может зависеть от вашего терминала, у меня это работает с gnome-terminal, urxvt и st. - person ideasman42; 20.07.2020

Насколько я знаю, для этого нет встроенной поддержки, так как 24-битное цветовое пространство в терминале довольно редко (!?). Однако, учитывая, что Emacs открыт для вас, вы можете добавить свой собственный терминал support, вы можете попробовать написать пакет, аналогичный xterm-frobs.el.

Кстати, если вам нужна только хорошая цветовая тема в терминале, вы можете попробовать мой пакет https://github.com/tungd/color-theme-closed, который переводит цветовую тему графического интерфейса в терминал.

person tungd    schedule 04.02.2013
comment
Действительно, насколько мне известно, только Konsole и (на основе Konsole) Yakuake поддерживают 24-битные цвета. Впрочем, для меня это не большая проблема, так как она есть на большинстве машин, на которых я работаю. - person grep; 05.02.2013
comment
Моя первоначальная проблема заключалась в том, что сокращение цветов emacs до конечных цветов (16 или 256 цветов) делает некоторые лица чрезвычайно трудными для чтения. И поскольку я хочу использовать светлую и темную цветовую тему, ручная настройка оскорбительных цветов становится сложной. Ваш пакет выглядит многообещающе, я проверю его на своей установке. - person grep; 05.02.2013

Это осуществимо, но это невозможно сделать только в ELisp.

Вот прекрасный список патчей для различных версий emacs и tmux, чтобы сделать жизнь trucolor возможной:

https://gist.github.com/choppsv1

person djsadinoff    schedule 11.01.2016
comment
Почему требуется tmux, чтобы сделать это возможным в Emacs? - person charliesneath; 20.07.2020

Есть 3 способа включить 24-битный цвет в emacs:
(код взят из term.c emacs)

(Примечание: простой способ проверить, работают ли цвета, — это проверить M-x list-colors-display)

Правильный метод — установить для TERM значение, которое поддерживает прямой цвет (через возможность RGB terminfo), если он доступен для вашего терминала (или просто попробуйте xterm-direct).
Обычно они называются (terminalName)-direct (xterm-direct, vte-direct и т. д.)
например: TERM=xterm-direct emacs, или правильно установите TERM, настроив свой терминал.

Редактировать:< /strong> В реализации xterm-direct (и связанных с ней) есть изъян. Некоторые оттенки синего обрабатываются как индексированные цвета (из-за использования одних и тех же последовательностей для rgb и индексированного цвета) и не будут отображаться правильно. Я рекомендую использовать второй способ.

/* Standard support for 24-bit colors.  */
else if (tigetflag ("RGB") > 0)
  {
    /* ...  */
    tty->TN_max_colors = 16777216;
  }

Другой вариант — использовать файл terminfo с нестандартными возможностями terminfo setf24 и setb24 (см. ответ https://stackoverflow.com/a/50577683/6232794). Возможно, этот метод поддерживается в более старых версиях emacs, чем два других.

const char *fg = tigetstr ("setf24");
const char *bg = tigetstr ("setb24");
/* Non-standard support for 24-bit colors. */
if (fg && bg
    && fg != (char *) (intptr_t) -1
    && bg != (char *) (intptr_t) -1)
  {
    tty->TS_set_foreground = fg;
    tty->TS_set_background = bg;
    tty->TN_max_colors = 16777216;
  }

В крайнем случае вы можете установить переменную среды COLORTERM в значение truecolor, что может работать с вашим терминалом.

/* Fall back to xterm+direct (semicolon version) if requested
   by the COLORTERM environment variable.  */
else if ((bg = getenv("COLORTERM")) != NULL
         && strcasecmp(bg, "truecolor") == 0)
  {
    tty->TS_set_foreground = "\033[%?%p1%{8}%<%t3%p1%d%e38;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%d%;m";
    tty->TS_set_background = "\033[%?%p1%{8}%<%t4%p1%d%e48;2;%p1%{65536}%/%d;%p1%{256}%/%{255}%&%d;%p1%{255}%&%d%;m";
    tty->TN_max_colors = 16777216;
  }                                                                                                                  
person 12Me21    schedule 27.12.2020