Trong .emacs
tệ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:
Các window-system
biế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à
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))
Các câu trả lời đề cập window-system
và display-graphic-p
khô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-system
ngay 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 -t
một thiết bị đầu cuối; khung đầu cuối kết quả sẽ thấy giá trị là nil
for 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-size
ví 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-functions
hook 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
.
split-window-horizontally
chia 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ổ").
'after-init-hook
.
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)))
Nếu nó ở chế độ Gui, thì điều sau sẽ đúng.
(nếu hệ thống cửa sổ)
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 ;-)