Comment détecter que emacs est en mode terminal?

Dans mon fichier .emacs , j’ai des commandes qui n’ont de sens qu’en mode graphique (comme (set-frame-size (selected-frame) 166 100) ). Comment puis-je les exécuter uniquement en mode graphique et non en mode terminal (par exemple, emacs -nw ).

Merci!

La variable window-system indique aux programmes Lisp sous quel système de fenêtres Emacs est exécuté. Les valeurs possibles sont

X
Emacs affiche le cadre en utilisant X.
w32
Emacs affiche le cadre en utilisant l’interface graphique MS-Windows native.
ns
Emacs affiche le cadre en utilisant l’interface Nextstep (utilisée sur GNUstep et Mac OS X).
pc
Emacs affiche le cadre à l’aide d’écritures directes MS-DOS.
néant
Emacs affiche la trame sur un terminal basé sur des caractères.

De la doc .

Edit : il semble que window-system soit déconseillé au profit de display-graphic-p (source: Ch 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 sont pas fausses, mais elles ne donnent pas une image complète.

En réalité, une seule instance d’Emacs peut avoir plusieurs images, certaines pouvant être sur un terminal et d’autres sur un système de fenêtres. C’est-à-dire que vous pouvez obtenir différentes valeurs de window-system même dans une seule instance d’Emacs.

Par exemple, vous pouvez lancer un système de fenêtres Emacs, puis vous y connecter via emacsclient -t dans un terminal; le cadre de terminal résultant verra une valeur nil pour le window-system de window-system . De même, vous pouvez lancer emacs en mode démon, puis lui indiquer de créer une image graphique.

Par conséquent, évitez de mettre du code dans votre fichier .emacs qui dépend du window-system . Au lieu de cela, placez le code comme votre exemple set-frame-size dans une fonction hook qui s’exécute après la création d’une image:

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

Notez que le 'after-make-frame-functions hook 'after-make-frame-functions ” n’est pas exécuté pour l’image initiale, il est donc souvent nécessaire d’append également des fonctions de hook liées au frame comme ci-dessus à 'after-init-hook .

window-system est une variable définie dans le 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 les fenêtres X. La valeur est nulle si la trame sélectionnée est sur un terminal uniquement textuel.

Fondamentalement faire un:

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

Si c’est en mode Gui, alors ce serait vrai.

(si window-system)

J’ai défini une fonction supplémentaire pour envelopper la fonctionnalité de nom de la 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 à d’autres systèmes tels que Windows ou des systèmes plus anciens sur lesquels un terminal série est utilisé. Mais je n’ai pas le temps de le faire 😉