window-system
Zmienna mówi programów Lisp jaki system okno Emacs jest uruchomiona w ramach. Możliwe wartości to
- x
- Emacs wyświetla ramkę używając X.
- w32
- Emacs wyświetla ramkę używając natywnego GUI MS-Windows.
- ns
- Emacs wyświetla ramkę używając interfejsu Nextstep (używanego w GNUstep i Mac OS X).
- szt
- Emacs wyświetla ramkę używając bezpośrednich zapisów ekranowych MS-DOS.
- zero
- Emacs wyświetla ramkę na terminalu znakowym.
Z doc .
Edycja : wygląda na to, że window-system jest przestarzały na rzecz display-graphic-p
(źródło: Ch f window-system RET na 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).
Więc to, co chcesz zrobić, to:
(if (display-graphic-p)
(progn
(your)
(code))
(your)
(code))
A jeśli nie masz klauzuli else, możesz po prostu:
(when (display-graphic-p)
(your)
(code))
Odpowiedzi wspominają
window-system
idisplay-graphic-p
nie są błędne, ale nie dają pełnego obrazu.W rzeczywistości pojedyncza instancja Emacsa może mieć wiele ramek, z których niektóre mogą znajdować się na terminalu, a inne w systemie okienkowym. Oznacza to, że możesz uzyskać różne wartości
window-system
nawet w ramach jednej instancji Emacsa.Na przykład, możesz uruchomić system okienkowy Emacs, a następnie połączyć się z nim przez
emacsclient -t
terminal; wynikowa ramka terminala będzie miała wartośćnil
forwindow-system
. Podobnie, możesz uruchomić emacsa w trybie demona, a następnie powiedzieć mu, aby utworzył ramkę graficzną.W związku z tym unikaj umieszczania w swoim .emacs kodu, od którego zależy
window-system
. Zamiast tego umieść kod, taki jakset-frame-size
przykład, w funkcji przechwytującej, która działa po utworzeniu ramki:(add-hook 'after-make-frame-functions (lambda () (if window-system (set-frame-size (selected-frame) 166 100)))))
Zwróć uwagę, że
'after-make-frame-functions
hak nie jest uruchamiany dla początkowej klatki, więc często konieczne jest również dodanie funkcji zaczepienia związanych z ramkami, takich jak te powyżej'after-init-hook
.źródło
split-window-horizontally
dzieli aktualnie aktywny panel („okno”) w bieżącym oknie („ramka”) na dwa panele („okna”).'after-init-hook
.Zasadniczo wykonaj:
(if window-system (progn (something) (something-else)))
źródło
Jeśli jest w trybie Gui, to prawda jest następująca.
(jeśli system okienny)
źródło
Zdefiniowałem dodatkową funkcję do zawijania funkcjonalności nazwy okna, ponieważ używam Emacsa wszędzie, tj. Z terminala i w trybie graficznym oraz w Linuksie i 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)))
Można go rozszerzyć, aby objąć inne systemy, takie jak Windows lub starsze systemy, w których używany jest terminal szeregowy. Ale nie mam na to czasu ;-)
źródło