Làm thế nào để phát hiện emacs đang ở chế độ đầu cuối?


81

Trong .emacstệp của tôi , tôi có các lệnh chỉ có ý nghĩa trong chế độ đồ họa (như (set-frame-size (selected-frame) 166 100)). Làm cách nào để tôi chạy chúng chỉ ở chế độ đồ họa chứ không phải ở chế độ đầu cuối (tức là emacs -nw).

Cảm ơn!

Câu trả lời:


101

Các window-systembiến kể chương trình Lisp gì hệ thống cửa sổ Emacs đang chạy dưới. Các giá trị có thể là

x
Emacs đang hiển thị khung bằng X.
w32
Emacs đang hiển thị khung bằng MS-Windows GUI gốc.
ns
Emacs đang hiển thị khung bằng giao diện Nextstep (được sử dụng trên GNUstep và Mac OS X).
máy tính
Emacs đang hiển thị khung bằng cách ghi màn hình trực tiếp MS-DOS.
không
Emacs đang hiển thị khung trên thiết bị đầu cuối dựa trên ký tự.

Từ tài liệu .

Chỉnh sửa : có vẻ như window-system không được ủng hộ display-graphic-p(nguồn: Ch f window-system RET trên 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).

Vì vậy, những gì bạn muốn làm là:

(if (display-graphic-p)
    (progn
    ;; if graphic
      (your)
      (code))
    ;; else (optional)
    (your)
    (code))

Và nếu bạn không có mệnh đề khác, bạn chỉ có thể:

;; more readable :)
(when (display-graphic-p)
    (your)
    (code))

(window-system) == "ns" trên máy mac
nicolas

43

Các câu trả lời đề cập window-systemdisplay-graphic-pkhông sai, nhưng chúng không nói lên bức tranh hoàn chỉnh.

Trong thực tế, một cá thể Emacs đơn lẻ có thể có nhiều khung, một số có thể nằm trên một thiết bị đầu cuối và những khung khác có thể nằm trên hệ thống cửa sổ. Có nghĩa là, bạn có thể nhận được các giá trị khác nhau window-systemngay cả trong một phiên bản Emacs duy nhất.

Ví dụ: bạn có thể khởi động Emacs hệ thống cửa sổ và sau đó kết nối với nó qua emacsclient -tmột thiết bị đầu cuối; khung đầu cuối kết quả sẽ thấy giá trị là nilfor window-system. Tương tự, bạn có thể khởi động emac ở chế độ daemon, sau đó yêu cầu nó tạo một khung đồ họa.

Do đó, tránh đặt mã vào .emac của bạn mà phụ thuộc vào window-system. Thay vào đó, hãy đặt mã như set-frame-sizeví dụ của bạn trong một hàm hook chạy sau khi một khung được tạo:

(add-hook 'after-make-frame-functions
  (lambda ()
    (if window-system
      (set-frame-size (selected-frame) 166 100)))))

Lưu ý rằng 'after-make-frame-functionshook không chạy cho khung ban đầu, vì vậy, thường cũng cần thêm các hàm hook liên quan đến khung như ở trên vào 'after-init-hook.


Cảm ơn! Tôi không rõ về thuật ngữ, nhưng nếu tôi chạy (chia cửa sổ theo chiều ngang), thì điều đó có tạo ra một khung mới và do đó gọi ra điều này không? Hay điều này chỉ chạy khi tạo một cửa sổ hoàn toàn mới gắn với phiên bản này (như bằng cách sử dụng emacsclient)?
sligocki

6
Thuật ngữ Emacs sử dụng "frame" có nghĩa là những gì bạn thường gọi là "cửa sổ" và nó sử dụng "cửa sổ" để biểu thị những gì bạn thường gọi là "ngăn". Khó hiểu, nhưng bạn sẽ quen với nó. Hy vọng rằng sẽ giúp. :-)
sanityinc

4
Và, để trả lời câu hỏi của bạn một cách rõ ràng: split-window-horizontallychia ngăn hiện đang hoạt động ("cửa sổ") trong cửa sổ hiện tại ("khung") thành hai ngăn ("cửa sổ").
sanityinc

2
Điều này sẽ không hoạt động vì: after-make-frame-functions chạy sau khi khung được tạo. Điều này không áp dụng cho khung emacs ban đầu (khi khởi động) vì .emacs của bạn được đọc sau khi khung đã được tạo. stackoverflow.com/questions/875667/…
Rubycut

1
@Rubycut đã đồng ý. Tôi nên đề cập rằng thường cần thêm các hàm hook liên quan đến khung như thế 'after-init-hook.
sanityinc

8

window-system là một biến được định nghĩa trong mã nguồn C. Giá trị của nó là x

Tài liệu: Tên của hệ thống cửa sổ mà qua đó khung đã chọn được hiển thị. Giá trị là một ký hiệu - ví dụ: `x 'cho cửa sổ X. Giá trị bằng 0 nếu khung được chọn nằm trên đầu cuối chỉ văn bản.

Về cơ bản làm một:

(if window-system
    (progn
      (something)
      (something-else)))

không dùng nữa để ủng hộ display-graphic-p
ivo Welch


2

Tôi đã xác định một chức năng bổ sung để bao bọc chức năng tên cửa sổ vì tôi đang sử dụng Emacs ở mọi nơi, tức là từ thiết bị đầu cuối và trong chế độ đồ họa và trong Linux và 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)))

Nó có thể được mở rộng để bao gồm các hệ thống khác như Windows hoặc các hệ thống cũ hơn sử dụng thiết bị đầu cuối nối tiếp. Nhưng tôi không có thời gian để làm như vậy ;-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.