¿Cómo detectar que emacs está en modo terminal?

81

En mi .emacsarchivo, tengo comandos que solo tienen sentido en modo gráfico (como (set-frame-size (selected-frame) 166 100)). ¿Cómo ejecuto estos solo en modo gráfico y no en modo terminal (es decir emacs -nw)?

¡Gracias!

Sligocki
fuente

Respuestas:

101

La window-systemvariable le dice a los programas Lisp en qué sistema de ventanas se está ejecutando Emacs. Los posibles valores son

X
Emacs muestra el marco usando X.
w32
Emacs muestra el marco utilizando la GUI nativa de MS-Windows.
ns
Emacs muestra el marco usando la interfaz Nextstep (usada en GNUstep y Mac OS X).
ordenador personal
Emacs muestra el marco utilizando escrituras de pantalla directas de MS-DOS.
nulo
Emacs muestra el marco en una terminal basada en caracteres.

Del doc .

Editar : parece que el sistema de ventanas está en desuso en favor de display-graphic-p(fuente: Ch f window-system RET en 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).

Entonces, lo que quieres hacer es:

(if (display-graphic-p)
    (progn
    ;; if graphic
      (your)
      (code))
    ;; else (optional)
    (your)
    (code))

Y si no tiene una cláusula else, puede simplemente:

;; more readable :)
(when (display-graphic-p)
    (your)
    (code))
knarf
fuente
(sistema de ventanas) == "ns" en mi mac
nicolas
43

Las respuestas que mencionan window-systemy display-graphic-pno son incorrectas, pero no dan la imagen completa.

En realidad, una sola instancia de Emacs puede tener múltiples marcos, algunos de los cuales pueden estar en una terminal y otros en un sistema de ventanas. Es decir, puede obtener diferentes valores de window-systemincluso dentro de una sola instancia de Emacs.

Por ejemplo, puede iniciar un sistema de ventanas Emacs y luego conectarse a él a través emacsclient -tde una terminal; la trama terminal resultante verá un valor de nilfor window-system. De manera similar, puede iniciar emacs en modo daemon y luego decirle que cree un marco gráfico.

Como resultado de esto, evite poner código en su .emacs que dependa de window-system. En su lugar, coloque código como su set-frame-sizeejemplo en una función de enlace que se ejecuta después de que se crea un marco:

(add-hook 'after-make-frame-functions
  (lambda ()
    (if window-system
      (set-frame-size (selected-frame) 166 100)))))

Tenga en cuenta que el 'after-make-frame-functionsenlace no se ejecuta para el marco inicial, por lo que a menudo es necesario agregar también funciones de enlace relacionadas con el marco como la anterior a 'after-init-hook.

sanityinc
fuente
¡Gracias! No tengo clara la terminología, pero si ejecuto (ventana dividida-horizontalmente), ¿eso crea un nuevo marco y, por lo tanto, lo invoca? ¿O esto solo se ejecuta cuando se crea una ventana completamente nueva adjunta a esta instancia (como al usar emacsclient)?
sligocki
6
La terminología de Emacs usa "marco" para referirse a lo que normalmente llamaría una "ventana", y usa "ventana" para denotar lo que normalmente llamaría un "panel". Confuso, pero eventualmente te acostumbras. Espero que ayude. :-)
sanityinc
4
Y, para responder su pregunta explícitamente: split-window-horizontallydivide el panel actualmente activo ("ventana") en la ventana actual ("marco") en dos paneles ("ventanas").
sanityinc
2
Esto no funcionará ya que: after-make-frame-functions se ejecuta después de que se crea el marco. Esto no se aplica al marco emacs inicial (al inicio) porque su .emacs se lee después de que el marco ya está creado. stackoverflow.com/questions/875667/…
Rubycut
1
@Rubycut estuvo de acuerdo. Debería haber mencionado que a menudo es necesario agregar funciones de enlace relacionadas con el marco como esa a 'after-init-hook.
sanityinc
8

window-system es una variable definida en el "código fuente C". Su valor es x

Documentación: Nombre del sistema de ventanas a través del cual se muestra el marco seleccionado. El valor es un símbolo, por ejemplo, 'x' para X ventanas. El valor es nulo si el marco seleccionado está en una terminal de solo texto.

Básicamente haz un:

(if window-system
    (progn
      (something)
      (something-else)))
Bozhidar Batsov
fuente
obsoleto en favor de display-graphic-p
ivo Welch
6

Si está en modo Gui, entonces lo siguiente sería cierto.

(si es sistema de ventanas)

excepciones_uncaught
fuente
2

He definido una función adicional para ajustar la funcionalidad del nombre de la ventana porque estoy usando Emacs en todas partes, es decir, desde la terminal y en modo gráfico y en Linux y 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)))

Se puede ampliar para cubrir otros sistemas como Windows o sistemas más antiguos donde se utiliza un terminal en serie. Pero no tengo tiempo para hacerlo ;-)

paaguti
fuente