W moim .emacs
pliku mam polecenia, które mają sens tylko w trybie graficznym (np (set-frame-size (selected-frame) 166 100)
.). Jak uruchomić je tylko w trybie graficznym, a nie w trybie terminala (tj emacs -nw
.).
Dzięki!
Odpowiedzi:
window-system
Zmienna mówi programów Lisp jaki system okno Emacs jest uruchomiona w ramach. Możliwe wartości to
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
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
A jeśli nie masz klauzuli else, możesz po prostu:
;; more readable :)
(when (display-graphic-p)
(your)
(code))
Odpowiedzi wspominają window-system
i display-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
for window-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 jak set-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
.
split-window-horizontally
dzieli aktualnie aktywny panel („okno”) w bieżącym oknie („ramka”) na dwa panele („okna”).
'after-init-hook
.
system-okna jest zmienną zdefiniowaną w `kodzie źródłowym C. ' Jego wartość to x
Dokumentacja: nazwa systemu okiennego, w którym wyświetlana jest wybrana rama. Wartość jest symbolem - na przykład `x 'dla X okien. Wartość jest zerowa, jeśli wybrana ramka znajduje się na terminalu zawierającym tylko tekst.
Zasadniczo wykonaj:
(if window-system
(progn
(something)
(something-else)))
Jeśli jest w trybie Gui, to prawda jest następująca.
(jeśli system okienny)
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 ;-)