У моєму .emacs
файлі у мене є команди, які мають сенс лише в графічному режимі (наприклад (set-frame-size (selected-frame) 166 100)
). Як запустити їх лише в графічному режимі, а не в термінальному (тобто emacs -nw
).
Дякую!
У моєму .emacs
файлі у мене є команди, які мають сенс лише в графічному режимі (наприклад (set-frame-size (selected-frame) 166 100)
). Як запустити їх лише в графічному режимі, а не в термінальному (тобто emacs -nw
).
Дякую!
Відповіді:
window-system
Змінні повідомляють програми Лиспа , що вікно системи Emacs працює під управлінням . Можливі значення такі
З док .
Редагувати : здається, що віконна система застаріла на користь 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))
Відповіді згадують window-system
і display-graphic-p
помиляються, але вони не дають повного уявлення.
Насправді один екземпляр Emacs може мати декілька кадрів, деякі з яких можуть бути на терміналі, а інші - у віконній системі. Тобто ви можете отримувати різні значення window-system
навіть у межах одного екземпляра Emacs.
Наприклад, ви можете запустити віконну систему Emacs, а потім підключитися до неї через emacsclient -t
термінал; отриманий термінальний кадр побачить значення nil
for 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
.
window-system - це змінна, визначена у `C вихідному коді '. Його значення x
Документація: Назва віконної системи, через яку відображається вибраний кадр. Значення є символом - наприклад, `x 'для X windows. Значення дорівнює нулю, якщо вибраний кадр знаходиться на текстовому терміналі.
В основному зробити:
(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, або старіші системи, де використовується послідовний термінал. Але в мене немає часу на це ;-)