Dans mon .emacs
fichier, j'ai des commandes qui n'ont de sens qu'en mode graphique (comme (set-frame-size (selected-frame) 166 100)
). Comment les exécuter uniquement en mode graphique et non en mode terminal (c'est-à-dire emacs -nw
).
Merci!
Le window-system
variable indique aux programmes LISP sous quel système de fenêtre Emacs fonctionne. Les valeurs possibles sont
De le doc .
Edit : il semble que le système de fenêtres soit déconseillé au profit de display-graphic-p
(source: C-h f window-system RET sur 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).
Donc ce que vous voulez faire, c'est:
(if (display-graphic-p)
(progn
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
Et si vous n'avez pas de clause else, vous pouvez simplement:
;; more readable :)
(when (display-graphic-p)
(your)
(code))
Les réponses mentionnant window-system
et display-graphic-p
ne se trompent pas, mais ils ne donnent pas une image complète.
En réalité, une seule instance Emacs peut avoir plusieurs trames, dont certaines peuvent être sur un terminal, et d'autres peuvent être sur un système de fenêtres. Autrement dit, vous pouvez obtenir différentes valeurs de window-system
même au sein d'une seule instance Emacs.
Par exemple, vous pouvez démarrer un système de fenêtres Emacs, puis vous y connecter via emacsclient -t
dans un terminal; la trame terminale résultante verra une valeur de nil
pour window-system
. De même, vous pouvez démarrer emacs en mode démon, puis lui dire plus tard de créer un cadre graphique.
Par conséquent, évitez de mettre du code dans votre .emacs qui dépend de window-system
. Au lieu de cela, mettez du code comme votre set-frame-size
exemple dans une fonction hook qui s'exécute après la création d'un cadre:
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
Notez que le 'after-make-frame-functions
le hook n'est pas exécuté pour la trame initiale, il est donc souvent nécessaire d'ajouter également des fonctions de hook liées au frame comme celle ci-dessus à 'after-init-hook
.
window-system est une variable définie en "code source C". Sa valeur est x
Documentation: Nom du système de fenêtres à travers lequel le cadre sélectionné est affiché. La valeur est un symbole - par exemple, "x" pour X fenêtres. La valeur est nulle si le cadre sélectionné se trouve sur un terminal texte uniquement.
Faire essentiellement:
(if window-system
(progn
(something)
(something-else)))
Si c'est en mode Gui, alors ce qui suit serait vrai.
(si système de fenêtre)
J'ai défini une fonction supplémentaire pour encapsuler la fonctionnalité de nom de fenêtre car j'utilise Emacs partout, c'est-à-dire depuis le terminal et en mode graphique et sous Linux et 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)))
Il peut être étendu pour couvrir d'autres systèmes comme Windows ou des systèmes plus anciens où un terminal série est utilisé. Mais je n'ai pas le temps de le faire ;-)