È 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
risposta
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.
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
.
+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
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" "")))
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