2011-09-30 30 views
6

Tôi muốn gọi một số chức năng khi tôi chạy emacsclient trong một trình giả lập thiết bị đầu cuối. Mã tôi đã làm việc khi Emacs được bắt đầu trong một thiết bị đầu cuối chỉ văn bản. Khi tôi bắt đầu Emacs trong chế độ đồ họa và chạy emacsclient -t trong một thiết bị đầu cuối, các chức năng không chạy vì vậy tôi không thể sử dụng chuột trong trình giả lập thiết bị đầu cuối.ngay cả khi emacsclient được bắt đầu trong một thiết bị đầu cuối, hệ thống cửa sổ là không-nil

Đây là mã trong câu hỏi:

(defun my-terminal-config (&optional frame) 
    "Establish settings for the current terminal." 
    (message (format "%s" window-system)) ;; "ns" (Mac OS X) when Emacs is started graphically 
    (message (format "%s" (display-graphic-p))) ;; nil when Emacs is started graphically 
    (unless (display-graphic-p) 
    ;; enable mouse reporting for terminal emulators 
    (xterm-mouse-mode 1) 
    (global-set-key [mouse-4] '(lambda() 
           (interactive) 
           (scroll-down 1))) 
    (global-set-key [mouse-5] '(lambda() 
           (interactive) 
           (scroll-up 1))))) 
(add-hook 'after-make-frame-functions 'my-terminal-config) 

Đây là một tình huống kỳ lạ. Emacsclient kết nối với máy chủ và tạo ra một khung mới, nhưng vì máy chủ đang chạy trong một môi trường đồ họa, nó báo cáo hệ thống cửa sổ là "ns" trong khi trong một môi trường đầu cuối nó sẽ là số không. Vì vậy khi tôi chạy emacsclient -t trong một thiết bị đầu cuối, các báo cáo chuột cho phép chức năng không chạy. Khi emacsclient đang chạy, nếu tôi tạo một khung hình mới với C-x 5 2, thì báo cáo chuột cho phép các chức năng sẽ chạy vì hệ thống cửa sổ sẽ không nằm trong khung đó.

Dường như khi trộn khung giữa thiết bị đầu cuối và hệ thống cửa sổ, giá trị window-system sẽ luôn là giá trị của máy chủ Emacs.

Có cách nào để tôi có thể chạy Emacs bằng đồ họa và emacsclient ở chế độ văn bản và có chức năng chuột chạy ở đó không? Nói cách khác, có thể phát hiện ra rằng một khung được tạo ra sẽ kết thúc trong một môi trường đồ họa hoặc văn bản?

Có lẽ tôi chỉ đơn giản là luôn luôn chạy các chức năng đó khi khung được tạo bất kể giá trị của window-system?

+0

Thú vị vấn đề. Tôi đang sử dụng Emacs 23.2.1 trong Linux (RHEL) và khi tôi chạy emacsclient -t đối với một máy chủ đồ họa và kiểm tra hệ thống cửa sổ, nó là nil, trong khi X Emacs đồ họa là X. Nói cách khác, có vẻ như để hoạt động chính xác. Chi tiết về thiết lập của bạn là gì? –

+0

Tôi đang sử dụng Emacs 23.3 trong Mac OS X 10.6.8. Tôi có kết quả tương tự như vậy. Một khi emacsclient đang chạy window-system là nil, * nhưng bên trong * hook sau-make-frame-function nó là "ns". Dường như khung không có hệ thống cửa sổ đích đến một thời gian sau khi móc được thực hiện. – hekevintran

+0

@hekevintran Bạn có thể đi qua một thời gian ngắn tại sao có quá nhiều câu hỏi từ người dùng Mac về việc sử dụng Emacs theo mô phỏng thiết bị đầu cuối? Kịch bản sử dụng chính xác là gì? Tôi thực sự tò mò vì tôi thấy những câu hỏi này rất nhiều. –

Trả lời

10

mẹo là window-systemdisplay-graphic-p hiện là khung cụ thể. bạn cần phải ở trong khung đó bên trong hàm hook của bạn (có vẻ như nó đã là trường hợp, nhưng tôi không nghĩ nó là). tôi đã để thêm video này vào đầu móc after-make-frame-functions của tôi (để làm cho cửa sổ hệ thống và hiển thị đồ họa-p cư xử một cách chính xác):

(select-frame frame) 
+1

Bạn đánh vào đầu! Một cách tốt hơn nữa là bạn có thể truyền trực tiếp khung hình hiển thị-đồ họa-p: (khung hiển thị-đồ họa-p). Cảm ơn các giải pháp. Nó đã khiến tôi khốn khổ. – hekevintran

Các vấn đề liên quan