2011-07-10 70 views
6

Có thể hiển thị xem các khóa caps lock và num lock có được bật trong Emacs không? Lý do tại sao tôi hỏi là bởi vì tôi là một người đánh máy một tay và sử dụng FrogPad. Thiết bị 20 phím sử dụng nhiều chuỗi phím shift để có đầy đủ chức năng của bàn phím qwerty chuẩn. Tôi sẽ tìm thấy nó cực kỳ hữu ích để hiển thị trạng thái của các phím shift, caps lock và numlock bên trong emacs. Tôi đã googled này và chỉ có thể tìm thấy bài viết liên quan đến các phím remapping. Điều này thậm chí có thể?Hiển thị trạng thái của các phím caps lock, num lock và shift trong Emacs

+2

Có thể trong phiên bản X11 của emacs, theo nghĩa là máy chủ X sẽ cung cấp emacs với thông tin đó. Mã thiết bị đầu cuối là quá xa so với phần còn lại của Emacs, mặc dù, điều này là khó có thể truy cập ở cấp Lisp. (Ví dụ, Emacs không biết sự khác biệt giữa phím Return và Control-m trong X, mặc dù X server cung cấp cho nó thông tin này. Chúng được dịch sang "Newline" trước khi bất cứ điều gì có cơ hội để xem xét. Điều này là do các thiết bị đầu cuối kiểu bàn điều khiển * không thể * phân biệt giữa hai trường hợp.) – jrockway

Trả lời

0

Khi chạy các emacs trong X Server, bạn có thể viết chương trình C, liên tục theo dõi trạng thái Shift, Caps và Numlock, khi thay đổi xảy ra, in nó thành stdout. Trong các emacs, chạy chương trình này như là quá trình bên ngoài, xử lý đầu ra của nó bằng cách sử dụng bộ lọc xử lý, và cuối cùng hiển thị trạng thái Shift, Caps và Numlock trong chế độ dòng.

2

Mức thấp nhất của đầu vào bàn phím nhận được Emacs Lisp là keyboard event, kết hợp một mã cơ bản với on/off các thiết lập của các bổ emacs (meta, control, shift, hyper, super, và alt). Do sự kết hợp này, dường như không có cách nào để mã lisp tìm hiểu khi bạn, ví dụ, bấm và giữ phím shift. Cũng lưu ý rằng không có đại diện tại tất cả các CAPS LOCK hoặc NUM LOCK.

Trên một lưu ý phụ, các emacs thực tế phân biệt giữa newlineC-m, nhưng ở mức rất thấp trong mã lisp, trước đây được ánh xạ tới sau. Xem lisp/term/x-win.el (thường được tìm thấy dưới /usr/share/emacs/NN.X) nếu bạn thực sự muốn biết chi tiết đẫm máu.

Vì vậy, từ trong vòng emacs lisp, tôi tin rằng không thể làm những gì bạn muốn.

Tuy nhiên, bạn có thể nhúng văn bản từ các lệnh bên ngoài vào dòng chế độ emacs và để cập nhật thường xuyên. Vì vậy, về nguyên tắc bạn có thể tìm thấy một lệnh linux trả về caps lock, shift, và numlock status, và periodicaly inject vào dòng lệnh. Điều này có thể không thực sự đáp ứng nhu cầu của bạn, vì nó sẽ không cập nhật mô hình trong thời gian thực khi bạn nhấn shift, capslock và numlock. Nhưng nếu bạn muốn theo đuổi điều này, hãy xem các triển khai của display-time-modedisplay-battery-mode.

+0

+1 cho đầu hiển thị pin; nó làm nhiều hơn là chỉ hiển thị tình trạng pin, do đó, có lẽ là giá trị điều tra nếu bạn đang tìm kiếm ý tưởng cho làm thế nào để thực hiện điều này (nếu nó không trong thực tế làm điều đó đã). – tripleee

0

Đó là không thể trong di Emacs, nhưng nếu bạn đang sử dụng X11:

(require 'dash) 
(require 's) 

(defun x-led-mask() 
    "Get the current status of the LED mask from X." 
    (with-temp-buffer 
    (call-process "xset" nil t nil "q") 
    (let ((led-mask-string 
      (->> (buffer-string) 
       s-lines 
       (--first (s-contains? "LED mask" it)) 
       s-split-words 
       -last-item))) 
     (string-to-number led-mask-string 16)))) 

(defun caps-lock-on (led-mask) 
    "Return non-nil if caps lock is on." 
    (eq (logand led-mask 1) 1)) 

(define-minor-mode caps-lock-show-mode 
    "Display whether caps lock is on." 
    :global t 
    :lighter (:eval (if (caps-lock-on (x-led-mask)) " CAPS-LOCK" ""))) 
Các vấn đề liên quan