Как определить, что emacs находится в терминальном режиме?
в своем .emacs
file, у меня есть команды, которые имеют смысл только в графическом режиме (например,(set-frame-size (selected-frame) 166 100)
). Как я могу работать только в графическом режиме, а не в терминальном режиме (т. е. emacs -nw
).
спасибо!
5 ответов:
The
x Emacs отображает кадр с помощью X. С W32 Emacs отображает кадр с помощью собственного графического интерфейса MS-Windows. ns Emacs отображает кадр с помощью интерфейса Nextstep (используется в GNUstep и Mac OS X). pc Emacs-это отображение фрейма с помощью MS-DOS для прямой записи с экрана. Нил Emacs-это отображение фрейма на основе символов терминала.window-system
переменная сообщает Lisp-программам, под каким окном работает система Emacs. Возможные значения:С док.
Edit: похоже, что оконная система устарела в пользу
display-graphic-p
(источник: C-h 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
на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
крюк не запускается для начального кадра, поэтому часто необходимо также добавить связанные с кадром функции крючка, как это выше, чтобы'after-init-hook
.
window-system-это переменная, определенная в `C исходный код'. Его значение равно x
документация: название оконной системы через который проходит выбранный кадр отображается. Значение символа-для например, `x ' для X windows. Значение равно нулю, если выбранный кадр находится на только текстовый терминал.
в принципе сделать:
(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 или более старых систем, где используется последовательный терминал. Но у меня нет на это времени; -)