/ / Prečo nemôžem zmeniť viazanie klávesov paredit - emacs, klávesové skratky, elisp, paredit

Prečo nemôžem zmeniť paredit keybindings - emacs, keyboard-shortcuts, elisp, paredit

Snažím sa používať iba niekoľko funkcií z pareditu bez načítania všetkých viazaní klávesov. Pri pohľade na paredit.el bola jediná nájdená mapa klávesov paredit-mode-map, tak som to skúsil.

(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-M-left>") "paredit-backward)

Nezmenilo to viazanie klávesov (ako bolo skontrolované pomocou C-h k), ale zmenila sa premenná mapa paredit-mode.

Snažil som sa tiež

(eval-after-load "paredit"
"(progn
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-M-left>") "paredit-backward)))

a potom zapnutie a vypnutie pareditu s rovnakým výsledkom.

Predchádzajúce zmeny v klávesovej mape priamo mi fungovali vždy. Čo sa tu deje?

edit:

Podarilo sa mi zmeniť mapu takto:

; Remove old paredit bindings
(defun take-from-list (condp list)
"Returns elements in list satisfying condp"
(delq nil
(mapcar (lambda (x) (and (funcall condp x) x)) list)))
(setq minor-mode-map-alist
(take-from-list
(lambda (x) (not (eq (car x) "paredit-mode)))
minor-mode-map-alist))

; Create new paredit-mode-map
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-kp-enter>") "paredit-backward)

; Add the new paredit-mode-map to minor-mode-map-alist
(setq minor-mode-map-alist (append
(list (append (list "paredit-mode) paredit-mode-map))
minor-mode-map-alist))

Zdá sa teda, že premenná použitá na vyhľadávanie je minor-mode-map-alist. Som si istý, že existujú elegantnejšie spôsoby, ako zmeniť viazanie kláves, ale chcel som viac porozumieť tomu, ako fungujú viazanie klávesov v emacs.

odpovede:

4 pre odpoveď č. 1

Paredit používa iný spôsob definovania mapy klávesov. Zatiaľ čo väčšina menších režimov definuje mapu klávesov v definícii premennej, Paredit volá paredit-define-keys na top-level, a tým násilne inicializuje mapu klávesov.

Inými slovami, nemôžete zabrániť Pareditu v nastavovaní jeho väzieb. Musíte odstrániť všetky viazané klávesové skratky v klávesovej mape pomocou (define-key paredit-mode-map … nil) aby som sa ich zbavil.

edit: Nemôžete „resetovať“ klávesové mapy priradením novej klávesovej mapy k premennej. (setq paredit-mode-map …) zmení premennú paredit-mode-map, to bude nie zmeniť aktuálnu mapu klávesov, ktorá sa používa v režime Paredit.

Väzba tejto premennej sa iba vyhodnotí raz na definičný čas, teda pri hodnotení define-minor-mode. Toto makro interne volá add-minor-mode, a odovzdáva tejto funkcii súčasná hodnota premennej keymap. Každé ďalšie použitie režimu sa týka iba tejto mapy klávesov. Premenná keymap je nikdy viac vyhodnotená podradeným režimom, teda zmena jej väzby nemá vôbec žiadny vplyv.

Ak chcete zmeniť mapu klávesov, musíte premennú znova zviazať pred define-minor-mode sa vyhodnotí, to znamená pred načítaním príslušnej knižnice. Zmena v eval-after-load forma je teda úplne zbytočná.

Za normálnych okolností funguje zmena premennej mapy klávesov pred načítaním knižnice dobre, pretože väčšina režimov definuje mapu klávesov v tele defvar. defvar nezmení však hodnotu premennej, ak už má hodnotu. Ak teda premenná už má mapu klávesov, nedotkne sa ju.

Ako som však povedal, Paredit nerešpektuje tento vzor a namiesto toho násilne pridáva svoje väzby do mapy klávesov. Jeho zmena je preto zbytočná, pretože Paredit svoje väzby aj tak pridá.

Ako som už povedal, musíte existujúce mapy klávesov manuálne vyčistiť zrušením definície všetkých jej kľúčov.

TL; DR: Používajte Smartparens, naozaj! Pokrýva celý Paredit, je pružný, výkonný, rozšíriteľný, skrátka dobrý. A umožní vám zvoliť si akékoľvek viazanie klávesov, ktoré chcete.


3 pre odpoveď č. 2

Najskôr si prečítajte odpoveď lunaryorna. Toto je len objasnenie.

čo presne je rozbité s vašim kódom

(setq paredit-mode-map (make-sparse-keymap))

Toto nebude fungovať so žiadnym už načítaným režimom. paredit nie je zvláštny.

Pareditova neúcta k defvaru znamená, že je veľmi ťažké ho uvoľniť všetky kľúče, ako si prajete.


3 pre odpoveď № 3

Prečo si nevytvoríte svoj vlastný vedľajší režim?Jediné, čo režim Paredit robí, je poskytovať viazanie kľúčov, takže ak skryjete jeho mapu klávesov, neurobí to pre vás nič. Príkazy paredit sú k dispozícii bez ohľadu na to, či používate režim Paredit alebo nie. (Nikto vám „nenúti“ viazanie kláves!)

(defvar snowape-mode-map (make-sparse-keymap))
(define-minor-mode snowape-mode
"Minor mode for snowape"s favorite pareditoid key bindings.
\<snowape-mode-map>"
:lighter " Snowape")
(define-key snowape-mode-map (kbd "C-M-<left>") "paredit-backward)
...

Prípadne môžete jednoducho použiť local-set-key vo vašom obľúbenom režime háčiky:

(add-hook "lisp-mode-hook
(defun lisp-mode-snowape-setup ()
(local-set-key (kbd "C-M-<left>") "paredit-backward)))