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

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

Спасибо!

Ответ 1

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

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

Ответ 2

Ответы, в которых упоминаются 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.

Ответ 3

Если это в режиме Gui, тогда будет верно следующее.

(если оконная система)

Ответ 4

window-system - это переменная, определенная в `C исходный код '. Его значение равно x

Документация: название оконной системы через который выбранный кадр отображается. Значение - символ - для instance, `x 'для X окон. Значение равен нулю, если выбранный кадр находится на только текст-терминал.

В основном выполните:

(if window-system
    (progn
      (something)
      (something-else)))

Ответ 5

Я определил дополнительную функцию, чтобы обернуть функциональность имени окна, потому что я использую 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 или более старые системы, где используется последовательный терминал. Но у меня нет времени на это;-)