Как определить, что emacs находится в режиме терминала? - PullRequest
77 голосов
/ 26 апреля 2011

В моем файле .emacs есть команды, которые имеют смысл только в графическом режиме (например, (set-frame-size (selected-frame) 166 100)).Как мне запустить их только в графическом режиме, а не в режиме терминала (например, emacs -nw).

Спасибо!

Ответы [ 5 ]

96 голосов
/ 26 апреля 2011

Переменная window-system сообщает программам на Лиспе, под какой оконной системой работает Emacs.Возможные значения:

x
Emacs отображает фрейм, используя X.
w32
Emacs отображает фрейм с помощью собственного графического интерфейса MS-Windows.
ns
Emacs отображает фрейм с помощью интерфейса Nextstep (используется в GNUstep и Mac OSX).
pc
Emacs отображает кадр, используя прямую запись в MS-DOS.
nil
Emacs отображает фрейм на символьном терминале.

С Документ .

Редактировать : этокажется, что windows-system устарела в пользу display-graphic-p (источник: Ch f window-system RET на emacs 23.3.1).

(display-graphic-p &optional DISPLAY)

Return non-nil if DISPLAY is a graphic display.
Graphical displays are those which are capable of displaying several
frames and several different fonts at once.  This is true for displays
that use a window system such as X, and false for text-only terminals.
DISPLAY can be a display name, a frame, or nil (meaning the selected
frame's display).

Итак, что вы хотите сделать:

(if (display-graphic-p)
    (progn
    ;; if graphic
      (your)
      (code))
    ;; else (optional)
    (your)
    (code))

И если у вас нет предложения else, вы можете просто:

;; more readable :)
(when (display-graphic-p)
    (your)
    (code))
42 голосов
/ 27 апреля 2011

Ответы, в которых упоминаются window-system и display-graphic-p, не являются неправильными, но они не дают полной картины.

В действительности, один экземпляр Emacs может иметь несколько кадров, некоторые из которых могутбыть на терминале, и другие из которых могут быть в оконной системе.То есть вы можете получить различные значения window-system даже в пределах одного экземпляра Emacs.

Например, вы можете запустить Emacs оконной системы и затем подключиться к нему через emacsclient -t в терминале.;результирующий кадр терминала увидит значение nil для window-system.Точно так же вы можете запустить emacs в режиме демона, а затем сказать ему создать графический фрейм.

В результате этого избегайте помещения в ваш .emacs кода, который зависит от window-system.Вместо этого поместите код, подобный вашему примеру set-frame-size, в функцию ловушки, которая запускается после создания кадра:

(add-hook 'after-make-frame-functions
  (lambda ()
    (if window-system
      (set-frame-size (selected-frame) 166 100)))))

Обратите внимание, что ловушка 'after-make-frame-functions не запускается для исходного кадра, поэтому частонеобходимо также добавить связанные с фреймами функции перехвата, подобные описанным выше, в 'after-init-hook.

8 голосов
/ 26 апреля 2011

window-system - это переменная, определенная в `C исходном коде '.Его значение равно x

Документация: Имя оконной системы, через которую отображается выбранный кадр.Значение является символом - например, `x 'для X окон.Значение равно нулю, если выбранный кадр находится на текстовом терминале.

В основном выполните:

(if window-system
    (progn
      (something)
      (something-else)))
6 голосов
/ 26 апреля 2011

Если это в режиме Gui, то верно следующее:

(если window-system)

2 голосов
/ 12 июня 2011

Я определил дополнительную функцию, чтобы обернуть функциональность имени окна, потому что я использую Emacs везде, то есть из терминала и в графическом режиме, а также в Linux и MacOS:

(defun window-system-name()
  (cond ((eq system-type 'gnu/linux) (if (display-graphic-p) "x"   "nox"))
    ((eq system-type 'darwin)    (if (display-graphic-p) "mac" "nox"))
    (t (error "Unsupported window-system") nil)))

Это может быть расширено, чтобы охватить другие системы, такие как Windows или более старые системы, где используется последовательный терминал. Но у меня нет времени на это ;-)

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