Sono d'accordo con la risposta di Joe Casadonte che la strada da percorrere è definire la propria modalità minore (o maggiore).
Detto questo, la tua domanda è interessante.
Ecco una soluzione che richiede una sequenza di tasti, che accetta i tasti del prefisso e promuove quella mappa dei tasti al livello principale.
ad es. Si supponga il seguente mappa della tastiera:
M-g ESC Prefix Command
M-g g goto-line
M-g n next-error
M-g p previous-error
Quando si esegue M-x semi-modal-minor-mode
, vi verrà chiesto per alcune sequenze di tasti. Se si immette M-g n
, allora le seguenti combinazioni di tasti sono impostati:
ESC Prefix Command (same as M-g ESC)
g goto-line
n next-error
p previous-error
Così ora n
non auto-inserimento, ma salta per l'errore successivo. Guarda il codice qui sotto.
Nota: quando questa modalità secondaria è abilitata, <f12>
è associato a un comando che disabilita la modalità secondaria. Questo perché le associazioni di tasti potrebbero benissimo disabilitare Emacs (ad esempio, cosa succederebbe se ci fosse un nuovo keybinding per M-x
).
A cura di aggiungere questi pensieri: tampone la variabile modo minore è stato originariamente fatto locale, ma che non funziona a meno che non anche effettua il buffer variabile di minor-mode-alist locale (duh). Ma, anche tu (probabilmente) non vuoi questi binding nel minibuffer ... Quindi, non ho intenzione di testarlo b/c dipende davvero da cosa vuoi, ma ho aggiunto un commento al codice riflettendo questo pensiero
Senza ulteriori indugi:
(defvar semi-modal-minor-mode-keymap (make-sparse-keymap)
"keymap holding the prefix key's keymapping, not really used")
(defvar semi-modal-minor-mode-disable-key (kbd "<f12>")
"key to disable the minor mode")
(defun semi-modal-minor-mode-disable()
"disable the minor mode"
(interactive)
(semi-modal-minor-mode 0))
(define-minor-mode semi-modal-minor-mode
"local minor mode that prompts for a prefix key and promotes that keymap to the toplevel
e.g. If there are bindings like the following:
M-g ESC Prefix Command
M-g g goto-line
M-g n next-error
M-g p previous-error
And you enter 'M-g n' when prompted,
then the minor mode keymap has the bindings
g -> goto-line
n -> next-error
p -> previous-error
ESC -> Prefix Command (same as M-g ESC)
The variable semi-modal-minor-mode-disable-key is bound to disable the minor mode map.
This is provided because often the mappings make the keyboard unusable.
Use at your own risk."
nil " Semi" semi-modal-minor-mode-keymap
(make-local-variable 'semi-modal-minor-mode)
(make-local-variable 'minor-mode-map-alist)
(let ((pair-holding-keymap-to-modify (assq 'semi-modal-minor-mode minor-mode-map-alist)))
(setcdr pair-holding-keymap-to-modify (make-sparse-keymap))
(if semi-modal-minor-mode
(let (key
keymap)
;; all but last (b/c we want a prefix
(setq key (substring (read-key-sequence "Enter a full key combination, the prefix will be used: ") 0 -1))
(if (and (not (equal "" key))
(not (equal (kbd "C-g") key))
(let ((semi-modal-minor-mode nil))
(keymapp (setq keymap (key-binding key)))))
(progn
(setcdr pair-holding-keymap-to-modify (copy-keymap keymap))
(when semi-modal-minor-mode-disable-key
(define-key (cdr pair-holding-keymap-to-modify)
semi-modal-minor-mode-disable-key 'semi-modal-minor-mode-disable)))
(semi-modal-minor-mode 0))))))
Stai parlando di modalità secondarie o modalità principali? Puoi dare un esempio specifico? –
In realtà, sarei soddisfatto di qualcosa di ancora meno strutturato di questo: solo un modo per inserire un prefisso e farlo applicare a tutti i tasti che premo fino a quando non premo alcune serie speciali di tasti per uscire da quella modalità. – fdr