salir - ¿Cómo detectar que emacs está en modo terminal?
como usar emacs (5)
window-system es una variable definida en `C source code ''. Su valor es x
Documentación: Nombre del sistema de ventana 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 un terminal de solo texto.
Básicamente haz a:
(if window-system
(progn
(something)
(something-else)))
En mi archivo .emacs
, tengo comandos que solo tienen sentido en modo gráfico (como (set-frame-size (selected-frame) 166 100)
). ¿Cómo puedo ejecutar estos solo en modo gráfico y no en modo terminal (es decir, emacs -nw
).
¡Gracias!
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 el 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 usa un terminal en serie. Pero no tengo tiempo para hacerlo ;-)
La variable del window-system
le dice a los programas Lisp con qué sistema de ventana se está ejecutando Emacs. Los posibles valores son
- X
- Emacs está mostrando el cuadro usando X.
- w32
- Emacs está mostrando el marco usando la GUI nativa de MS-Windows.
- ns
- Emacs muestra el marco utilizando la interfaz Nextstep (utilizada en GNUstep y Mac OS X).
- ordenador personal
- Emacs muestra el marco utilizando escrituras de pantalla directa de MS-DOS.
- nulo
- Emacs está mostrando el marco en un terminal basado 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))
Las respuestas que mencionan window-system
y display-graphic-p
no son incorrectas, pero no cuentan la imagen completa.
En realidad, una sola instancia de Emacs puede tener múltiples marcos, algunos de los cuales podrían estar en un terminal, y otros podrían estar en un sistema de ventanas. Es decir, puede obtener diferentes valores de window-system
de window-system
incluso dentro de una única instancia de Emacs.
Por ejemplo, puede iniciar un sistema de ventana Emacs y luego conectarse a él a través de emacsclient -t
en un terminal; el cuadro de terminal resultante verá un valor de nil
para window-system
. Del mismo modo, puede iniciar emacs en el modo demonio, y luego decirle que cree un marco gráfico.
Como resultado de esto, evite poner código en sus archivos .emacs que depende window-system
. En su lugar, coloque un código como el ejemplo de set-frame-size
en una función de enlace que se ejecuta después de crear 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
no se ejecuta para el fotograma inicial, por lo que a menudo también es necesario agregar funciones de enganche relacionadas con el fotograma como la anterior a ''after-init-hook
.
Si está en modo Gui, entonces lo siguiente sería verdadero.
(si el sistema de ventanas)