Как определить, что emacs находится в терминальном режиме?


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

спасибо!

5 73

5 ответов:

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

x Emacs отображает кадр с помощью X. С W32 Emacs отображает кадр с помощью собственного графического интерфейса MS-Windows. ns Emacs отображает кадр с помощью интерфейса Nextstep (используется в GNUstep и Mac OS X). pc Emacs-это отображение фрейма с помощью MS-DOS для прямой записи с экрана. Нил 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)))

Если его в режиме 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 или более старых систем, где используется последовательный терминал. Но у меня нет на это времени; -)