В моем файле .emacs
у меня есть команды, которые имеют смысл только в графическом режиме (например, (set-frame-size (selected-frame) 166 100)
). Как запустить их только в графическом режиме, а не в режиме терминала (т.е. emacs -nw
).
Спасибо!
В моем файле .emacs
у меня есть команды, которые имеют смысл только в графическом режиме (например, (set-frame-size (selected-frame) 166 100)
). Как запустить их только в графическом режиме, а не в режиме терминала (т.е. emacs -nw
).
Спасибо!
Переменная window-system
сообщает Lisp программам, в какой оконной системе Emacs работает. Возможные значения:
Из документ.
Изменить: кажется, что оконная система устарела в пользу display-graphic-p
(источник: C-h f оконная система 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 display).
Итак, что вы хотите сделать:
(if (display-graphic-p)
(progn
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
И если у вас нет предложения else, вы можете просто:
;; more readable :)
(when (display-graphic-p)
(your)
(code))
Ответы, в которых упоминаются window-system
и display-graphic-p
, не ошибаются, но они не сообщают полное изображение.
В действительности, один экземпляр Emacs может иметь несколько фреймов, некоторые из которых могут быть на терминале, а другие из них могут быть в оконной системе. То есть вы можете получать разные значения window-system
даже в одном экземпляре Emacs.
Например, вы можете запустить системную систему Emacs и затем подключиться к ней через emacsclient -t
в терминале; результирующая оконечная рама будет видеть значение nil
для window-system
. Аналогично, вы можете запустить emacs в режиме демона, а затем сообщить ему, чтобы создать графический фрейм.
В результате этого избегайте помещать код в ваш .emacs, который зависит от window-system
. Вместо этого поместите код как ваш пример set-frame-size
в функцию hook, которая запускается после создания фрейма:
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
Обратите внимание, что крючок 'after-make-frame-functions
не запускается для исходного кадра, поэтому часто необходимо также добавлять связанные с кадром функции hook, как указано выше, в 'after-init-hook
.
Если это в режиме Gui, тогда будет верно следующее.
(если оконная система)
window-system - это переменная, определенная в `C исходный код '. Его значение равно x
Документация: название оконной системы через который выбранный кадр отображается. Значение - символ - для instance, `x 'для X окон. Значение равен нулю, если выбранный кадр находится на только текст-терминал.
В основном выполните:
(if window-system
(progn
(something)
(something-else)))
Я определил дополнительную функцию, чтобы обернуть функциональность имени окна, потому что я использую 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 или более старые системы, где используется последовательный терминал. Но у меня нет времени на это;-)