Come sciogliere veramente TUTTI i keybind globali?


8

Ci ho appena provato

(set 'global-map (make-sparse-keymap))

ma l'emissione C-hbmostra ancora tonnellate di schifezze, specialmente nella sezione Global Bindings :

Global Bindings:
key             binding
---             -------

C-@             set-mark-command
C-a             move-beginning-of-line
C-b             backward-char
C-d             delete-char
C-e             move-end-of-line
C-f             forward-char
C-g             keyboard-quit
C-h             help-command
TAB             indent-for-tab-command
C-k             kill-line
C-l             recenter-top-bottom
RET             newline
C-n             next-line
C-o             open-line
...             ...

e ce ne sono molti altri a venire.

Vorrei liberarmene completamente. Come posso eventualmente farlo in una semplice chiamata di funzione? Vorrei che la soluzione fosse una cancellazione totale, piuttosto che un ciclo che sta impostando tutte queste mappe nil. Grazie in anticipo.

NOTA: per favore, nessuna risposta per l'insegnamento o commenti spam come "Questi tasti sono essenziali per la produttività, non farlo!" . Ho un livello di emulazione altamente personalizzato per la modifica modale del testo qui, quindi non ho affatto bisogno di questi collegamenti predefiniti.


Sono curioso. Cosa c'è evil-modeche non va che devi scrivere il tuo livello di modifica modale?
Ma Do,

@Tu Do, lo è evil-mode, ma alcune delle sue funzionalità di livello superiore: operatori, oggetti di testo e alcuni comandi sono stati riscritti o estesi in qualche modo. Anche i suoi collegamenti predefiniti sono stati completamente cancellati e riorganizzati sulla tastiera sin dall'inizio. Questo tuttavia non ha nulla a che fare con la domanda.
Alexander Shukaev,

Stavo solo chiedendo curiosità. Ma grazie.
Ma Do,

Probabilmente dovresti usare una keymap non sparsa creata con make-keymap.
tarsius,

Risposte:


16

Tratto dal manuale Emacs Lisp (vedi Controllo delle mappe attive ):

(use-global-map (make-sparse-keymap))

Per citare il manuale: "È molto insolito cambiare la keymap globale". Nota di sicurezza: assicurati di poter salvare i buffer e successivamente uscire in modo pulito da Emacs con una mappa dei tasti diversa, altrimenti dovrai ucciderlo senza modifiche salvate.


Tu sei l'uomo!
Alexander Shukaev,

6

Sebbene le seguenti informazioni non siano una risposta diretta alla domanda (poiché ha già risposto a @wasamasa), credo ancora che sia un'aggiunta essenziale alla risposta. Il punto è che dopo l'emissione

(use-global-map (make-sparse-keymap))

si cancella completamente la sezione Global Bindings e, di conseguenza, non si può nemmeno più scrivere il testo! Nella stragrande maggioranza dei casi, uno ovviamente vorrebbe ripristinare la capacità di digitare il testo in quanto è comunque essenziale per qualsiasi editor di testo. Quindi, ecco l'unico modo per farlo:

(global-set-key [t] #'self-insert-command)
(let ((c ?\s))
  (while (< c ?\d)
    (global-set-key (vector c) #'self-insert-command)
    (setq c (1+ c)))
  (when (eq system-type 'ms-dos)
    (setq c 128)
    (while (< c 160)
      (global-set-key (vector c) #'self-insert-command)
      (setq c (1+ c))))
  (setq c 160)
  (while (< c 256)
    (global-set-key (vector c) #'self-insert-command)
    (setq c (1+ c))))

Solo perché voi ragazzi crediate che questo codice Emacs Lisp sia un modo corretto per farlo, fornirò la fonte che ho usato per produrlo. Per impostazione predefinita, la capacità di digitare il testo con l'attuale codepage ASCII a 8 bit è implementata cmds.cnell'unità di traduzione del codice sorgente di Emacs C:

  for (n = 040; n < 0177; n++)
    initial_define_key (global_map, n, "self-insert-command");
#ifdef MSDOS
  for (n = 0200; n < 0240; n++)
    initial_define_key (global_map, n, "self-insert-command");
#endif
  for (n = 0240; n < 0400; n++)
    initial_define_key (global_map, n, "self-insert-command");

Come puoi vedere, il codice Emacs Lisp sopra è la replica esatta di questo codice C, ad eccezione di una riga aggiuntiva:

(global-set-key [t] #'self-insert-command)

Consideralo un avvertimento, ma questa linea è importante avere! Altrimenti sarebbero disponibili solo 7 bit dell'attuale codepage ASCII (indipendentemente dal fatto che abbiamo inizializzato tutti gli 8 bit).


3
Questo sembra eccessivamente complesso. Perché non copiare i self-insert-commandbinding dalla keymap globale corrente? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SO- smetti di essere malvagio'

1
@Gilles, non vedo cosa trovi complesso in 3 loop, ma sentiti libero di andare per la tua strada se l'hai già testato. Inoltre, questo post ha più di un valore educativo, in modo che le persone che cancellano global-mapimmediatamente sappiano quale problema si troveranno ad affrontare e qual è la ricetta per risolverlo. Probabilmente impareranno qualcosa di nuovo su ASCII in generale e / o su come viene implementato in Emacs in particolare.
Alexander Shukaev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.