In meiner .emacs
Datei befinden sich Befehle, die nur im grafischen Modus (wie (set-frame-size (selected-frame) 166 100)
) sinnvoll sind . Wie führe ich diese nur im Grafikmodus und nicht im Terminalmodus (dh emacs -nw
) aus?
Vielen Dank!
Antworten:
Die window-system
Variable teilt Lisp-Programmen mit, unter welchem Fenstersystem Emacs ausgeführt wird. Die möglichen Werte sind
Aus dem Dokument .
Bearbeiten : Es scheint, dass das Fenstersystem zugunsten von display-graphic-p
(Quelle: Ch f Fenstersystem RET auf Emacs 23.3.1) veraltet ist.
(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).
Was Sie also tun möchten, ist:
(if (display-graphic-p)
(progn
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
Und wenn Sie keine else-Klausel haben, können Sie einfach:
;; more readable :)
(when (display-graphic-p)
(your)
(code))
Die Antworten erwähnen window-system
und display-graphic-p
sind nicht falsch, aber sie sagen nicht das vollständige Bild.
In der Realität kann eine einzelne Emacs-Instanz mehrere Frames haben, von denen sich einige auf einem Terminal und andere auf einem Fenstersystem befinden können. Das heißt, Sie können window-system
sogar innerhalb einer einzelnen Emacs-Instanz unterschiedliche Werte erhalten .
Sie können beispielsweise ein Emacs-Fenstersystem starten und dann über emacsclient -t
ein Terminal eine Verbindung dazu herstellen . Der resultierende Terminalrahmen sieht einen Wert von nil
für window-system
. Ebenso können Sie Emacs im Daemon-Modus starten und später anweisen, einen grafischen Rahmen zu erstellen.
Vermeiden Sie daher, Code in Ihre .emacs einzufügen, der davon abhängt window-system
. Fügen Sie stattdessen Code wie in Ihrem set-frame-size
Beispiel in eine Hook-Funktion ein, die ausgeführt wird, nachdem ein Frame erstellt wurde:
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
Beachten Sie, dass der 'after-make-frame-functions
Hook nicht für den ersten Frame ausgeführt wird. Daher ist es häufig erforderlich, auch rahmenbezogene Hook-Funktionen wie die oben genannten hinzuzufügen 'after-init-hook
.
split-window-horizontally
Teilt den aktuell aktiven Bereich ("Fenster") im aktuellen Fenster ("Rahmen") in zwei Bereiche ("Fenster") auf.
'after-init-hook
.
Fenstersystem ist eine Variable, die im C-Quellcode definiert ist. Sein Wert ist x
Dokumentation: Name des Fenstersystems, durch das der ausgewählte Rahmen angezeigt wird. Der Wert ist ein Symbol - zum Beispiel "x" für X-Fenster. Der Wert ist Null, wenn sich der ausgewählte Frame auf einem Nur-Text-Terminal befindet.
Grundsätzlich machen Sie eine:
(if window-system
(progn
(something)
(something-else)))
Wenn es im Gui-Modus ist, dann wäre das Folgende wahr.
(wenn Fenstersystem)
Ich habe eine zusätzliche Funktion zum Umschließen der Fensternamenfunktion definiert, da ich Emacs überall verwende, dh vom Terminal und im Grafikmodus sowie unter Linux und 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)))
Es kann auf andere Systeme wie Windows oder ältere Systeme ausgedehnt werden, auf denen ein serielles Terminal verwendet wird. Dafür habe ich aber keine Zeit ;-)