Терминальные цвета Emacs работают только с TERM = xterm-256color - PullRequest
32 голосов
/ 01 октября 2011

Я обнаружил, что терминальный emacs не отображает правильные цвета, если я явно не установил TERM = xterm-256color.Я использую gnome-терминал, и, насколько я понимаю, для TERM должно быть установлено значение gnome-256color.Точно так же я часто использую tmux, что не подходит для любого параметра TERM, кроме screen-256color.К сожалению, обе эти настройки (в их соответствующем контексте - gnome-terminal или tmux) приводят к тому, что emacs имеет неправильные цвета, тогда как vim отображает цвета правильно.Однако, если я export TERM=xterm-256color, цвета в emacs работают нормально.

Может кто-нибудь объяснить, что происходит, или предложить решение?

Обновление

Вот что яЯ имею дело с:

enter image description here

Я могу заставить цвета выглядеть правильно в терминале, добавив следующее к моему init.el:

(defun terminal-init-gnome ()
  "Terminal initialization function for gnome-terminal."

  ;; This is a dirty hack that I accidentally stumbled across:
  ;;  initializing "rxvt" first and _then_ "xterm" seems
  ;;  to make the colors work... although I have no idea why.
  (tty-run-terminal-initialization (selected-frame) "rxvt")

  (tty-run-terminal-initialization (selected-frame) "xterm"))

Это действительно очень неправильно, хотя.Этому должно быть логическое объяснение ...

PS

У меня очень мало знаний о terminfo и точной роли, которую $TERM играет в процессе поведения цветного терминала. Если всегда безопасно использовать xterm-256color (даже если $TERM "должно быть" gnome-256color или screen-256color), я пойду с этим.

Ответы [ 6 ]

23 голосов
/ 01 октября 2011

Может я чего-то не понимаю, купите, почему бы вам не запустить emacs вот так:

TERM=xterm-256color emacs -nw

Таким образом, Emacs имеет собственную настройку TERM, которая, как вы знаете, работает. Вы также можете сделать псевдоним или обернуть его в shell-скрипт.

18 голосов
/ 01 октября 2011

Терминалы - это особый тип устройства.Когда процесс отправляет на терминал специальные байтовые последовательности (называемые управляющими последовательностями), он выполняет некоторое действие (например, позиционирование курсора, изменение цвета и т. Д.).

Вы можете прочитать Коды терминала ANSI чтобы найти более подробную информацию о последовательностях управления.

Но терминалы появляются с 70-х годов, когда аппаратные средства были ограничены в своих возможностях, и терминал не может предоставить информацию о своих возможностях (то есть, какие последовательности он поддерживает).

$ TERM был использован для решения этой проблемы - он позволяет программам знать, что отправить в терминал, чтобы выполнить работу. termcap и terminfo - это базы данных, в которых хранится информация о возможностях терминала для многих $ TERM имен.Если ваш $ TERM отсутствует в базе данных, вы должны попросить администратора добавить его.

Все эмуляторы терминала наследуют эти ограничения от старых аппаратных терминалов.Поэтому им необходимо правильно установить $ TERM , а в БД terminfo / termcap ДОЛЖНЫ быть данные для этого терминала.Когда виртуальный терминал запускается, он устанавливает для вас переменную $ TERM (и внутри таких программ, как bash).Если $ TERM отсутствует в terminfo / termcap , вы можете быстро определить псевдоним от $ TERM до xterm-256color (вы можетев файле termcap приведены примеры того, как это сделать).

8 голосов
/ 03 октября 2011

Я не очень знаком с тем, как emacs точно обрабатывает разные терминалы.Но, просмотрев каталог lisp/term в источниках emacs, я обнаружил, что существование функции terminal-init-xxx позволяет добавить поддержку различных терминалов.Например, у меня есть:

(defun terminal-init-screen ()
  "Terminal initialization function for screen."
   ;; Use the xterm color initialization code.
   (xterm-register-default-colors)
   (tty-set-up-initial-frame-faces))

в моем .emacs, что добавляет поддержку screen-256color.Вы можете попытаться определить аналогичную функцию для gnome, переименовав вышеупомянутую функцию в terminal-init-gnome.

ПРИМЕЧАНИЕ. Если вам интересно, вы можете попытаться отследить вызовы из кода tty-run-terminal-initialization.Сначала он получает тип терминала с помощью функции tty-type, затем просматривает определенные места для загрузки соответствующего файла терминала, затем пытается найти соответствующую функцию terminal-init-xxx и, наконец, вызывает ее.Это может помочь вам определить правильное имя для gnome-terminal.


Похоже, если ваш TERM не указывает, что ваш терминал имеет 256 цветов, emacs будет использовать только 8. Изменение TERM на gnome-256color разрешил работать функции регистрации цвета.


В конце концов, есть способ обмануть.Когда я запускаю gnome-terminal, мой терминал по умолчанию настроен на xterm.Вместо изменения переменной TERM можно перенаправить xterm на другой терминал, скажем, gnome-256color.Просто создайте каталог $(HOME)/.terminfo/x, затем запустите ln -s /usr/share/terminfo/g/gnome-256color ~/.terminfo/x/xterm.Я думаю, что это лучше, чем установка TERM вручную в .bashrc, потому что он перенаправляет только определенный терминал на что-то другое.Для входа в консоль по-прежнему будет TERM как linux, а не xterm-256color.

6 голосов
/ 22 сентября 2013

Это поведение связано с логикой, которую EMACS использует для определения, является ли фон терминала темным или светлым. Запустите M-x list-colors-display с TERM, установленным либо xterm-256color, либо screen-256color, и вы увидите, что в списке точно такие же цвета. Как вы указали в комментариях, различие в цветовых схемах, которое вы наблюдали, связано с режимом фона рамки. Чтобы увидеть это, с вашим TERM, установленным на screen-256color, сравните цвета в

emacs -Q -nw --eval "(setq frame-background-mode 'light)"

и

emacs -Q -nw --eval "(setq frame-background-mode 'dark)"

Функция frame-set-background-modeframe.el) проверяет, соответствует ли тип терминала "^\\(xterm\\|\\rxvt\\|dtterm\\|eterm\\)", если в противном случае не может определить цвет фона.

В рамках текущего сеанса вы можете изменить цветовую схему на 'light, оценив

(let ((frame-background-mode 'light)) (frame-set-background-mode nil))
5 голосов
/ 19 марта 2018

Добавьте это к вашему ~/.emacs:

(add-to-list 'term-file-aliases
    '("st-256color" . "xterm-256color"))

Он сообщает emacs, что если он видит TERM=st-256color, то он должен инициализировать терминал, как если бы он видел TERM=xterm-256color.


Более длинный ответ:

Emacs показывает странные цвета, потому что считает, что ваш терминал может поддерживать только 8 цветов.В Emacs запустите M-x list-colors-display, чтобы увидеть доступные цвета.Правильное количество цветов определяется при специфической для терминала инициализации .В нем частично говорится:

Каждый тип терминала может иметь свою собственную библиотеку Lisp, которую Emacs загружает при работе на терминале этого типа.

На моем компьютере терминалспецифические файлы инициализации находятся в /usr/local/share/emacs/25.*/lisp/term.В нем есть файлы для xterm, rxvt, screen и т. Д., Но ничего для st.Нам нужно помочь Emacs найти правильный файл инициализации.Далее в документации сказано:

Если в списке ассоциаций term-file-aliases есть запись, соответствующая TERM, Emacs использует соответствующее значение вместо TERM

.этот список ассоциаций является рекомендуемым способом обработки неизвестных терминалов.Он работает без необходимости вручную переопределять переменную среды TERM.

3 голосов
/ 10 января 2012

В Ubuntu 10.04 я тоже заметил, что для запуска emacs -nw внутри byobu/tmux/screen использовались цвета, отличные от emacs -nw в обычном gnome-терминале.

Я обнаружил, что это потому, что byobu устанавливал TERM в screen-bce. Затем установка TERM в xterm (для меня в обычном gnome-terminal TERM=xterm) дала мне ту же подсветку синтаксиса, когда не запускался через byobu/screen.

Так что до сих пор не уверены, каково правильное решение.

Смотрите также этот пост: Подсветка синтаксиса в Emacs Python-режиме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...