Emac'lerin terminal modunda olduğu nasıl tespit edilir?


81

Benim içinde .emacsdosyanı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:


101

window-systemDeğişken Emacs altında çalışan hangi pencere sistemi Lisp programları söyler. Olası değerler

x
Emacs, çerçeveyi X kullanarak görüntülüyor.
w32
Emacs çerçeveyi yerel MS-Windows GUI kullanarak görüntülüyor.
ns
Emacs, çerçeveyi Nextstep arabirimini kullanarak görüntülüyor (GNUstep ve Mac OS X'te kullanılır).
pc
Emacs, çerçeveyi MS-DOS doğrudan ekran yazılarını kullanarak görüntülüyor.
sıfır
Emacs, çerçeveyi karakter tabanlı bir terminalde görüntülüyor.

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))

(pencere sistemi) == "ns"
nicolas

43

Cevaplar söz window-systemve display-graphic-pyanlış 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 -tbir terminal aracılığıyla ona bağlanabilirsiniz ; Elde edilen uç çerçeve bir değeri görür niliç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-sizebir ç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-functionsKancanı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.


Teşekkürler! Terminoloji konusunda net değilim, ancak çalıştırırsam (yatay bölme penceresi), bu yeni bir çerçeve oluşturur ve bu nedenle bunu başlatır mı? Yoksa bu yalnızca bu örneğe eklenen tamamen yeni bir pencere oluştururken mi çalışır (emacsclient kullanmak gibi)?
sligocki

6
Emacs terminolojisi, normalde "pencere" olarak adlandırdığınız şeyi ifade etmek için "çerçeve" kullanır ve normalde "bölme" olarak adlandırdığınız şeyi belirtmek için "pencere" kullanır. Kafa karıştırıcı, ama sonunda alışırsın. Umarım yardımcı olur. :-)
sanityinc

4
Ve sorunuzu açıkça cevaplamak için: split-window-horizontallygeçerli pencerede ("çerçeve") mevcut durumda etkin olan bölmeyi ("pencere") iki bölmeye ("pencere") böler.
sanityinc

2
Bu çalışmayacaktır çünkü: after-make-frame-functions, çerçeve oluşturulduktan sonra çalıştırılır. Bu, ilk emacs çerçevesi için geçerli değildir (başlangıçta), çünkü .emac'leriniz çerçeve zaten oluşturulduktan sonra okunur. stackoverflow.com/questions/875667/…
Rubycut

1
@Rubycut kabul etti. Bunun gibi çerçeveyle ilgili kanca işlevlerini eklemenin genellikle gerekli olduğunu söylemeliydim 'after-init-hook.
sanityinc

8

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)))

display-graphic-p lehine kullanımdan kaldırıldı
ivo Welch


2

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 ;-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.