2011-07-10 13 views
6

Czy można wyświetlić, czy przyciski Caps Lock i Num Lock są włączone w Emacs? Powodem, dla którego pytam, jest to, że jestem maszynistą jednoręczną i używam FrogPad. 20-klawiszowe urządzenie używa wielu sekwencji klawiszy shift, aby mieć pełną funkcjonalność standardowej klawiatury qwerty. Byłoby mi niezmiernie miło wyświetlać status zmiany, klawisza Caps Lock i klawiszy numlock w emacs. Mam googleed to i może znaleźć tylko posty dotyczące zmiany kluczy. Czy to możliwe?Wyświetlenie stanu blokad caps, num lock i klawiszy shift w Emacs

+2

Jest to możliwe w wersji X11 Emacs, w tym sensie, że serwer X zapewni emacsowi z tej informacji. Jednak kod terminalu jest tak daleki od reszty Emacsa, że ​​jest mało prawdopodobne, aby był dostępny na poziomie Lisp. (Na przykład, Emacs nie zna różnicy między klawiszem Return a Control-m w X, mimo że serwer X podaje te informacje, ale są one tłumaczone na "Newline", zanim cokolwiek stanie się możliwe. Wynika to z tego, że terminale * w konsoli nie mogą * rozróżniać dwóch przypadków.) – jrockway

Odpowiedz

0

Po uruchomieniu emacsa na X Server, możesz napisać program C, status ciągłego monitorowania Shift, Caps i Numlock, kiedy zmiana nastąpi, wydrukuj ją na standardowe wyjście. W emacs uruchom ten program jako proces zewnętrzny, przetwórz jego dane wyjściowe za pomocą filtru procesu, a na koniec wyświetl stan Shift, Caps i Numlock w trybie mode-line.

2

Najniższy poziom wejścia klawiatury otrzymanych przez Emacs Lisp jest keyboard event, który łączy w sobie kod podstawowy z ON/OFF ustawienia modyfikatorów Emacs (meta, control, shift, hyper, super i alt). Z powodu tej kombinacji wydaje się, że nie można nauczyć się kodu lisp, gdy np. Naciśniesz i przytrzymasz klawisz Shift. Zauważ także, że nie ma reprezentacji CAPS LOCK ani NUM LOCK.

Na marginesie, emacs faktycznie odróżnia newline i C-m, ale na bardzo niskim poziomie w kodzie seplenienia, ten pierwszy jest przypisany do drugiego. Zobacz lisp/term/x-win.el (zwykle znajduje się pod /usr/share/emacs/NN.X), jeśli naprawdę chcesz poznać szczegóły.

Tak więc, od w ramach emacs lisp, uważam, że niemożliwe jest robienie tego, co chcesz.

Możliwe jest jednak osadzanie tekstu z zewnętrznych poleceń w linii trybu emacs i regularne aktualizowanie. Tak więc, w zasadzie można znaleźć polecenie linuxa, które zwraca status caps lock, shift i numlock i periodycznie wstrzykuje je do linii poleceń. To prawdopodobnie nie spełnia twoich potrzeb, ponieważ nie zaktualizuje modeliny w czasie rzeczywistym, gdy naciśniesz shift, capslock i numlock. Ale jeśli chcesz tego dokonać, sprawdź implementacje display-time-mode i display-battery-mode.

+0

+1 dla końcówki wyświetlacza baterii; robi więcej niż tylko wyświetla stan baterii, więc prawdopodobnie warto zbadać, jeśli szukasz pomysłów, jak to wdrożyć (jeśli w rzeczywistości tak się nie dzieje). – tripleee

0

To nie jest możliwe w przenośnych Emacs, ale jeśli używasz 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" ""))) 
Powiązane problemy