общая переменная среды для установки темного или светлого фона терминала

Я написал несколько отладчиков, которые могут раскрасить текст исходного кода, показанный в сеансе терминала. Они все понимают, что некоторые терминалы имеют темный фон, а некоторые имеют светлый фон, и, конечно, цвета должны быть разными в зависимости от схемы терминала.

Досадно, что нужно установить другую схему, когда ваш терминал не соответствует фону по умолчанию, поэтому я хотел бы найти способ понять это автоматически. Предложения? (Все они поддерживают опции --highlight={light|dark|plain} )

Одним простым механизмом было бы отключить переменную среды. Для моих профилей оболочки я использовал DARK_BACKGROUND_COLOR , но если уже есть какое-то имя по умолчанию, например, для PAGER , EDITOR , SHELL , HOME и т. Д. Я бы хотел использовать это.

Существует ли такое соглашение об имени среды? Другие предложения?

3 Solutions collect form web for “общая переменная среды для установки темного или светлого фона терминала”

Здесь ничего нет. Вы свободны в своем собственном соглашении.

Несколько программ (например, xterm ) могут предоставить приложение с установленными в настоящее время цветами переднего и заднего плана (см. «Динамические цвета» ). Но помимо приложений, таких как xtermcontrol , очень немногие используют его. Emacs запрашивает текущий цвет фона, чтобы установить его параметр терминала background-mode , который определяет, применять ли «темную» или «светлую» версию цветовой темы. С другой стороны, Vim, который может использовать управляющие последовательности xterm для количества цветов и строк, отправленных специальными ключами (см. «Request Termcap / Terminfo String» в XTerm Control Sequences ), не обнаруживает смысла переднего плана / фона цвета.

Такого соглашения нет. Кроме того, переменная среды не является хорошим способом сообщать информацию о терминале, потому что значение может быть устаревшим, если программа запускает другой эмулятор терминала, который не обновляет эту переменную, или если программа подключается к нескольким терминалам.

(Переменная окружения TERM не страдает от этих проблем, потому что она универсальна: каждый эмулятор терминала устанавливает ее, и каждая программа знает об этом. Проблемы возникают только при частичной поддержке переменной).

Правильный способ получить информацию – это запросить терминал. В мире unix это делается путем записи escape-последовательности, которую терминал интерпретирует как «отправить некоторые данные, которые отвечают на мой запрос». Как объясняет Томас Дики , у xterm есть такая контрольная последовательность , OSC 11 ; ? BEL OSC 11 ; ? BEL OSC 11 ; ? BEL (заданные текстовые параметры, параметр 11 = цвет фона текста, значение ? Означает запрос вместо набора). Напишите \e]11;?\a на терминал (где \e – escape-символ ( ^[ ), а \a – символ колокола ( ^G )), а xterm отвечает строкой типа \e]11;rgb:0000/0000/0000\a (это черный фон). К сожалению, несколько других эмуляторов терминала поддерживают эту escape-последовательность.

Rxvt устанавливает переменную окружения COLORFGBG в строку, такую ​​как 7;0 где 7 – цвет переднего плана (7 – светло-серый), а 0 – цвет фона (черный). Konsole также поддерживает это.

Emacs пытается определить, имеет ли терминал светлый или темный фон, чтобы установить параметр терминала background-mode . Начиная с версии Emacs 24.5 существует три метода автоматического выбора режима фона:

  • В xterm Emacs использует escape-последовательность OSC 11 , как описано выше.
  • В rxvt Emacs использует COLORFGBG окружения COLORFGBG как описано выше.
  • На консолях DOS и Windows Emacs использует интерфейсы, специфичные для ОС, для получения информации о терминале; эти интерфейсы играют ту же роль, что и escape-последовательность OSC 11 .

Это исключает многие терминалы, однако есть некоторый прогресс: библиотека vte, в которой задействованы многие терминальные эмуляторы, такие как gnome-terminal, guake, terminator, xfce4-terminal, …, реализует отчет OSC 11 как xterm с версии 0.35.2 . Вы можете обнаружить терминалы на базе VTE, проверив переменную окружения VTE_VERSION ; значение – это число, вы хотите 3502 и выше.

Если вы хотите стандартизировать способ сообщить информацию в приложения, то поддержка на стороне терминала может не иметь значения: ведь вы знаете, предпочитаете ли вы светлые или темные фоны. Тогда вы можете также выровнять с rxvt и использовать COLORFGBG , так как это единственный интерфейс, который кто-то уже использует и который вы можете использовать независимо от любой поддержки терминала. Интерфейс COLORFGBG ограничен: он предназначен для мира с 16 цветами, и все согласны с отображением от номеров цветов к цветам (по крайней мере приблизительно, точные оттенки отличаются). Konsole поддерживает более 16 цветов, но использует приближение при представлении COLORFGBG : он приближается к цветам переднего и заднего цветов одним из 16 стандартных цветов. Если все, о чем вы заботитесь, это light vs dark, это не проблема, просто установите COLORFGBG на 15;0 для легкого текста на темном фоне или 0;15 для темного текста на светлом фоне.

Основываясь на хорошо продуманных ответах Томаса Дики и Жиля, я собрал этот сценарий в github .

Суть заключается в использовании xterm-совместимого цветового запроса, и на основе значений цвета RGB, если фон темный. Если это не сработает, попробуйте интерпретировать COLORFGBG и не использовать эти предустановленные значения по умолчанию для различных терминалов. Например, xterm – это светлый фон по умолчанию.

Код для предустановленных значений по умолчанию и интерполяция темных / светлых RGB были получены из кода GNU emacs (как было предложено Жилем).

Я еще не добавил какой-либо конкретный код MS Windows, но люди должны быть свободны отправлять запросы на загрузку, чтобы обработать это или добавить любые другие исправления.

  • Официальный стандарт / соглашение для расширения файла для сценариев оболочки для источника
  • В чем разница между sh и ./ при вызове сценария оболочки?
  • запустить сценарий при выключении в Debain
  • Fork Bomb: Почему вывод трубопровода в другую копию ботинка Fork работает, если не возвращается Output?
  • Вставка многострочного текста в несколько файлов через командную строку
  • Сохранение цветного выхода независимо от источника
  • Запуск сценариев компиляции только в том случае, если исходный файл более поздний, чем скомпилированная программа
  • Как добавить данные в буфер в сценарии оболочки?
  • Полностью вывести команду буфера перед тем, как подключиться к другой команде?
  • Распечатайте сообщение с левой стороны трубы
  • Как проверить, является ли вывод команды пустой или пустой?
  • Linux и Unix - лучшая ОС в мире.