Как получить удобочитаемое значение (например, RGB) от `\ e] 11;? \ A`?
Строка \e]11;?\a
Предположительно дает фоновый цвет текущего терминала, но я не нашел способ использовать эту информацию, чтобы получить цвет в формате, читаемом человеком (например, RGB).
Я попытался (невольно)
- Как сделать мигающий текст в bash?
- ANSI Цвета при использовании Systemd Service
- Захват цветов с копией буфера tmux (hardcopy)
- Графические консольные приложения в Emacs
- Emacs ansi-term с zsh: ошибка в технологическом фильтре. Недопустимое лицо: неуказано
print -P '\e]11;?\a'
но ничего не производит, или, по крайней мере, ничего не видно.
BTW, я знаю xtermcontrol --get-bg
, но когда я запускаю его на терминале, над которым я работаю, я получаю сообщение об ошибке:
xtermcontrol: --get-bg is unsupported or disallowed by this terminal. \ See also, TROUBLESHOOTING section of xtermcontrol(1) manpage.
(В TROUBLESHOOTING section
не было никаких действий).
Кстати, я преднамеренно пропустил подробности о терминале, который я использую, потому что я надеюсь найти общее решение, а не одно, которое работает только для конкретного терминала.
2 Solutions collect form web for “Как получить удобочитаемое значение (например, RGB) от `\ e] 11;? \ A`?”
В этом вопросе есть пара фундаментальных проблем:
-
Чтобы это приводило к общему решению, команда должна была поддерживаться ANSI X3.64 , базовым стандартом для всех современных терминалов , но, насколько я могу судить, это не ANSI-команда.
Я не уверен, потому что у меня нет копии этого стандарта, я не могу найти его в Интернете, и ANSI не продаст мне его . Все, что я могу найти в Интернете, – это «ссылки». Как я описываю в другом месте , в то время как X3.64 является корневым стандартом для всех распространенных современных терминалов, это наблюдение немного напоминает указание, что собаки происходят от волков: изучение волков, чтобы узнать о собаках, создает серьезные ограничения на объем вещей, которые вы можете учить.
Лучший ресурс, который я нашел, – это ссылка XTerm Control Sequences , поддерживаемая текущим поддерживающим
xterm
. Но это не нормативный стандарт, он просто описывает, что делает одна общая программа. Многие программы получены из исходного кодаxterm
, но, как и собаки из волков, многие из них значительно расходятся.Я подозреваю, что вы нашли бы, если бы вы преследовали его, что эта команда была введена xterm как расширение для ANSI X3.64, а ваш целевой терминал не поддерживает это конкретное расширение
xterm
, поэтомуxtermcontrol
терпит неудачу. -
Даже если ваш конкретный набор терминалов дает ответ на эту команду, я не вижу в вышеупомянутом документе, что вы собираетесь получить значение RGB. Вместо этого вы можете получить название цвета.
(Это то, что мы ожидаем от нормального стандарта, который часто игнорируется в документах функционального описания).
Кроме того, остерегайтесь, что даже если вы получите ответ R; G; B, ответ может отличаться. Если вы установили свой цвет с использованием более старых цветовых кодов ANSI X3.64, нет стандартного сообщения о том, к какому цвету RGB они относятся; действительно, каждая семейная терминальная программа
xterm
я когда-либо использовал, дает возможность изменить цвета RGB, используемые для цветовых кодов ANSI. Кроме того, вы можете изменить эти значения «на лету» в некоторых терминальных программах, так что два прогона программы, разделенные прогонкой сторонних программ, могут дать разные ответы, потому что цветовая схема теперь отличается.
В сети SE есть еще один ответ, который делает примерно то же самое, что и ваш оператор print
, но, как и ваша команда, команда echo
другого ответа не получает ответа от терминала OS X, который утверждает, что он является терминалом xterm-256color
. Это означает, что решение не работает даже для всех терминалов семейства xterm.
Я написал более надежную программу на C, которая диагностирует ошибку, если это произойдет, а если нет, отображает возвращаемые значения в печатной форме. Вы можете обнаружить, что это более подходящая база для расширения, чем команды оболочки:
#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> char reply[40]; size_t nr; void timeout(int sn) { if (nr > 0) { for (size_t i = 0; i < nr; ++i) { printf("Got char %d\n", reply[i]); } if (!sn) puts("WARNING: Buffer filled!"); } else { puts("No reply from terminal."); } exit(0); } int main(void) { signal(SIGALRM, timeout); alarm(1); printf("\e]11;?\a"); for (nr = 0; nr < sizeof(reply); ++nr) { reply[nr] = getchar(); } timeout(0); /* buffer filled before alarm() timer went off! */ return 0; }
-#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> char reply[40]; size_t nr; void timeout(int sn) { if (nr > 0) { for (size_t i = 0; i < nr; ++i) { printf("Got char %d\n", reply[i]); } if (!sn) puts("WARNING: Buffer filled!"); } else { puts("No reply from terminal."); } exit(0); } int main(void) { signal(SIGALRM, timeout); alarm(1); printf("\e]11;?\a"); for (nr = 0; nr < sizeof(reply); ++nr) { reply[nr] = getchar(); } timeout(0); /* buffer filled before alarm() timer went off! */ return 0; }
Во-первых, маловероятно, что какой-то альтернативный метод (кроме ответов на контрольные последовательности) может быть основой «общего решения» по запросу ОП, поскольку искомое свойство не (например) не поддается методам, использующим свойства окна ,
Далее, это пример управляющих последовательностей, которые реализованы в xterm, но не являются общедоступными. Об xtermcontrol
знает разработчик xtermcontrol
. На его странице обсуждаются последовательности управления xterm , комментарии, что их много ( множество ), и упоминает, что OSX Terminal.app поддерживает некоторые из них.
Сообщение об ошибке, сообщаемое OP, безусловно, достаточно ясно. xtermcontrol
программа, на которой OP пыталась запустить xtermcontrol
, не поддерживает эту функцию. Скорее всего, он не поддерживает сопоставимую функцию, которая может быть использована вместо этого.
На практике большинство контрольных последовательностей xterm не реализованы в других терминалах, независимо от использования их разработчиком «xterm» для описания терминала. См. Например, xterm FAQ Сравнение версий, путем подсчета элементов управления и часто задаваемых вопросов. Почему бы просто не использовать TERM для «xterm»? (отметив, что «производные от исходного кода xterm
» могут быть интерпретированы более чем одним способом).
Терминалы (возможно) большего интереса к OP не имеют полезной документации, на которой они реализуют управляющие последовательности. Таким образом, единственный способ найти, как «общее» решение у вас есть, – это исчерпывающее тестирование. Это кажется не очень общим.
Ответ на xtermcontrol
– это метод, используемый xtermcontrol
. ( Ответ нисходящего xrdb
не даст вам текущие настройки цвета от xterm
, только его начальные значения – возможно, даже не это.)