В моем .emacs
файле есть команды, которые имеют смысл только в графическом режиме (например, (set-frame-size (selected-frame) 166 100)
). Как мне запустить их только в графическом режиме, а не в режиме терминала (т.е. emacs -nw
).
Благодаря!
Ответы:
window-system
Переменные сообщают программы Лиспа , что окно системы Emacs работает под управлением . Возможные значения:
Из док .
Изменить : кажется, что оконная система устарела в пользу display-graphic-p
(источник: Ch 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's 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
примеру, в функцию-перехватчик, которая запускается после создания кадра:
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
Обратите внимание, что 'after-make-frame-functions
ловушка не запускается для начального кадра, поэтому часто бывает необходимо добавить связанные с кадром функции ловушки, подобные приведенной выше, в 'after-init-hook
.
split-window-horizontally
разделяет активную в данный момент панель («окно») в текущем окне («фрейм») на две панели («окна»).
'after-init-hook
.
оконная система - это переменная, определенная в `исходном коде C '. Его значение x
Документация: Название оконной системы, через которую отображается выбранный фрейм. Значение представляет собой символ - например, `x 'для X окон. Значение равно нулю, если выбранный фрейм находится на текстовом терминале.
В основном делайте:
(if window-system
(progn
(something)
(something-else)))
Если он в режиме Gui, то будет верно следующее.
(если оконная система)
Я определил дополнительную функцию для обертывания функциональности имени окна, потому что я использую 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 или более старых систем, в которых используется последовательный терминал. Но у меня нет времени на это ;-)