Benim içinde .emacs
dosyanın, sadece grafik modu (gibi mantıklı komutları var (set-frame-size (selected-frame) 166 100)
). Bunları yalnızca grafik kipte ve uçbirim kipinde değil (yani emacs -nw
) nasıl çalıştırırım .
Teşekkürler!
Yanıtlar:
window-system
Değişken Emacs altında çalışan hangi pencere sistemi Lisp programları söyler. Olası değerler
Gönderen doc .
Düzenleme : pencere sistemi kullanımdan kaldırılmış gibi görünüyor display-graphic-p
(kaynak: Ch f pencere sistemi RET 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).
Yani yapmak istediğiniz şey:
(if (display-graphic-p)
(progn
;; if graphic
(your)
(code))
;; else (optional)
(your)
(code))
Ve başka bir cümleniz yoksa, şunları yapabilirsiniz:
;; more readable :)
(when (display-graphic-p)
(your)
(code))
Cevaplar söz window-system
ve display-graphic-p
yanlış değildir, ancak bunlar tam resmini söyleme.
Gerçekte, tek bir Emacs örneği birden çok çerçeveye sahip olabilir, bunlardan bazıları bir terminalde, diğerleri ise bir pencere sisteminde olabilir. Yani, farklı değerler elde edebilirsiniz.window-system
tek bir Emacs örneği içinde bile .
Örneğin, bir pencere sistemi Emacs'ı başlatabilir ve daha sonra emacsclient -t
bir terminal aracılığıyla ona bağlanabilirsiniz ; Elde edilen uç çerçeve bir değeri görür nil
içinwindow-system
. Benzer şekilde, emacs'i daemon modunda başlatabilir ve daha sonra ona bir grafik çerçeve oluşturmasını söyleyebilirsiniz.
Bunun bir sonucu olarak, .emac'lerinize bağlı olan kodu koymaktan kaçının window-system
. Bunun yerine, set-frame-size
bir çerçeve oluşturulduktan sonra çalışan bir hook işlevine örneğiniz gibi kodu yerleştirin :
(add-hook 'after-make-frame-functions
(lambda ()
(if window-system
(set-frame-size (selected-frame) 166 100)))))
'after-make-frame-functions
Kancanın ilk çerçeve için çalışmadığını unutmayın , bu nedenle yukarıdaki gibi çerçeveyle ilgili kanca işlevlerinin de eklenmesi genellikle gereklidir 'after-init-hook
.
split-window-horizontally
geçerli pencerede ("çerçeve") mevcut durumda etkin olan bölmeyi ("pencere") iki bölmeye ("pencere") böler.
'after-init-hook
.
pencere sistemi, `` C kaynak kodunda '' tanımlanan bir değişkendir. Değeri x
Dokümantasyon: Seçilen çerçevenin görüntülendiği pencere sisteminin adı. Değer bir semboldür - örneğin, X pencereleri için "x". Seçilen çerçeve yalnızca metin terminalindeyse değer sıfırdır.
Temel olarak şunları yapın:
(if window-system
(progn
(something)
(something-else)))
Gui modundaysa, aşağıdaki doğru olacaktır.
(pencere sistemi ise)
Pencere adı işlevini sarmak için ekstra bir işlev tanımladım çünkü Emacs'i her yerde, yani terminalden ve grafik modunda ve Linux ve MacOS'ta kullanıyorum:
(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)))
Windows gibi diğer sistemleri veya bir seri terminalin kullanıldığı eski sistemleri kapsayacak şekilde genişletilebilir. Ama bunu yapacak vaktim yok ;-)