2011-07-10 2 views
6

È possibile visualizzare se i tasti Bloc Maiusc e Bloc Num sono attivati ​​in Emacs? Il motivo per cui lo chiedo è perché sono un dattilografo con una sola mano e uso un FrogPad. Il dispositivo a 20 tasti utilizza più sequenze di tasti MAIUSC per avere la piena funzionalità di una tastiera qwerty standard. Trovo estremamente utile visualizzare lo stato dei tasti Maiusc, Bloc Maiusc e Numlock all'interno di emacs. Ho cercato su Google questo e sono riuscito a trovare solo i post relativi alle chiavi di rimappatura. È possibile?Visualizza lo stato di Bloc Maiusc, Bloc Num e Chiavi Maiusc in Emacs

+2

E 'possibile nella versione X11 di emacs, nel senso che il server X fornirà Emacs con tali informazioni. Il codice terminale è così lontano dal resto di Emacs, tuttavia, che è improbabile che sia accessibile a livello di Lisp. (Ad esempio, Emacs non conosce la differenza tra il tasto Return e Control-m in X, anche se il server X le fornisce queste informazioni. Sono tradotte in "Newline" prima che qualcosa possa dare un'occhiata. Questo perché i terminali in stile console * non possono * distinguere tra i due casi.) – jrockway

risposta

0

Quando si esegue emacs in X Server, è possibile scrivere un programma C, lo stato di MAIUSC, BLOC MAIUSC e BLOC NUM, quando si verifica il cambiamento, stamparlo su stdout. In emacs, esegui questo programma come processo esterno, elabora l'output utilizzando il filtro di processo e infine visualizza lo stato Shift, Caps e Numlock in modalità-line.

2

Il più basso livello di input da tastiera ricevuto da Emacs Lisp è il keyboard event, che combina un codice di base con on/off impostazioni dei modificatori emacs (meta, control, shift, hyper, super e alt). A causa di questa combinazione, sembra che non ci sia modo per imparare il codice Lisp quando, per esempio, tieni premuto il tasto Maiusc. Si noti inoltre che non vi è alcuna rappresentazione di BLOC MAIUSC o BLOC NUM.

Su una nota a margine, emacs distingue infatti tra newline e C-m, ma a un livello molto basso nel codice Lisp, il primo è mappato a quest'ultimo. Vedi lisp/term/x-win.el (di solito si trova sotto /usr/share/emacs/NN.X) se si desidera veramente i dettagli cruenti.

Quindi, da all'interno di emacs lisp, credo che sia impossibile fare ciò che si desidera.

Tuttavia, è possibile incorporare il testo da comandi esterni nella riga della modalità emacs e aggiornarlo regolarmente. Quindi, in linea di principio, è possibile trovare un comando linux che restituisce lo stato Caps Lock, Maiusc e Numlock, e periodicamente lo inietta nella riga di comando. Questo probabilmente non soddisfa le tue esigenze, dal momento che non aggiornerà la modeline in tempo reale mentre premi shift, capslock e numlock. Ma se vuoi perseguire questo, controlla le implementazioni di display-time-mode e display-battery-mode.

+0

+1 per la punta del display della batteria; fa molto di più che visualizzare solo lo stato della batteria, quindi probabilmente vale la pena indagare se stai cercando idee su come implementarlo (se non lo fa già). – tripleee

0

Non è possibile nel portatile Emacs, ma se si sta utilizzando 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" "")))