80 votes

Comment détecter qu'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 pas en mode terminal (c.-à-d. emacs -nw ).

Merci!

100voto

knarf Points 1069

L' window-system variable indique programmes Lisp ce système de fenêtre Emacs est en cours d'exécution en vertu de l'. Les valeurs possibles sont

x
    Emacs is displaying using X. 
pc
    Emacs is displaying using MSDOS.
w32
    Emacs is displaying using Windows NT or Windows 95.
nil
    Emacs is using a character-based terminal.

À partir d' ici.

Edit: il semble que la fenêtre-système est dépréciée en faveur de l' display-graphic-p (source: C-h f fenêtre-système 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 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:

;; more readable :)
(when (display-graphic-p)
    (your)
    (code))

42voto

sanityinc Points 9156

Les réponses mentionnant window-system et display-graphic-p ne sont pas mauvais, mais ils ne disent pas l'image complète.

En réalité, un seul exemple Emacs peut avoir plusieurs images, dont certaines pourraient être sur un terminal, et d'autres qui pourraient être sur un système de fenêtre. C'est-à-dire, vous pouvez obtenir différentes valeurs de window-system au sein d'une même Emacs instance.

Par exemple, vous pouvez démarrer une fenêtre-système d'Emacs puis de vous y connecter via emacsclient -t dans un terminal; le terminal cadre verrez une valeur de nil pour window-system. De même, vous pouvez commencer à emacs en mode démon, puis, plus tard, lui demander de créer un cadre graphique.

En conséquence de cela, éviter de mettre de code dans votre .emacs qui dépend window-system. Au lieu de cela, mettre le code comme votre set-frame-size exemple dans une fonction de raccordement qui court après une image est créée:

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

Notez que l' 'after-make-frame-functions crochet n'est pas exécuté pour la première image, il est donc souvent nécessaire d'ajouter les images liées au crochet, comme les fonctions que ci-dessus pour 'after-init-hook.

8voto

Bozhidar Batsov Points 23298

window-system est une variable définie dans le `code source C '. Sa valeur est x

Documentation: Nom du système de fenêtre à travers lequel le cadre sélectionné est affiché. La valeur est un symbole - par exemple, «x» pour X Windows. La valeur est nil si le cadre sélectionné est sur un terminal texte uniquement.

Fondamentalement faire un:

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

6voto

doc_180 Points 8017

Si son en mode Gui, alors ce qui suit serait vrai.

(si le système de fenêtre)

2voto

paaguti Points 21

J'ai défini une fonction supplémentaire pour envelopper la fonctionnalité de nom de fenêtre parce que j'utilise Emacs partout, c'est-à-dire depuis le terminal et en mode graphique, 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 ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X