En mi .emacs
archivo, 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!
Respuestas:
La window-system
variable le dice a los programas Lisp en qué sistema de ventanas se está ejecutando Emacs. Los posibles valores son
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))
Las respuestas que mencionan window-system
y display-graphic-p
no 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-system
incluso 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 -t
de una terminal; la trama terminal resultante verá un valor de nil
for 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-size
ejemplo 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-functions
enlace 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
.
split-window-horizontally
divide el panel actualmente activo ("ventana") en la ventana actual ("marco") en dos paneles ("ventanas").
'after-init-hook
.
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)))
Si está en modo Gui, entonces lo siguiente sería cierto.
(si es sistema de ventanas)
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 ;-)