Du plus simple binding
Ah ! Vous codez en Lisp, et vous êtes un homme heureux.
Mais vous avez une furieuse envie que l'appuie sur la combinaison C-c p vous donne une paire de parenthèse, allez savoir pourquoi [1].
Donc vous définissez quelque chose comme ça :
(global-set-key [(control c) (p)] 'mafonction)
ou bien
(global-set-key (kbd "C-c p") 'mafonction)
ou encore
(global-set-key [?\C-c ?p] 'mafonction)
Pour la suite, on utilisera seulement le premier formalisme.
Tout d'abord, codons mafonction.
(defun mafonction ()
(insert "()")
(backward-char))
Aaaahah ! Cela ne marchera pas. Il FAUT que mafonction soit interactive, donc contienne comme premier « appel », interactive :
(defun mafonction ()
(interactive)
(insert "()")
(backward-char))
Cela dit, définir une fonction pour ça c'est sûrement pas forcément nécessaire. Une lambda fonction, fonction anonyme (non nommée) à grosse saveur fonctionnelle, suffit largement:
(global-set-key [(control c) (p)] (lambda () (interactive)
(insert "()")
(backward-char)))
On est content, ça marche, mais quelle nécessité d'avoir ce binding créé pour tous les modes ? (global-set-key) a en effet un impact GLOBAL !
Et bien les « local map », les mapping locaux, sont là pour ça. Pour un mode foo-mode, il y a de forte chance pour qu'il définisse une map foo-mode-map.
Il suffit alors de faire cela :
(require 'lisp-mode)
(define-key emacs-lisp-mode-map [(control c) (p)]
(lambda () (interactive)
(insert "()")
(backward-char)))
Et c'est gagné, et proprement :-)
Donc n'oubliez pas les règles :
- Il existe plein de notation pour décrire une séquence de touche,
- Il s'agit de fonction interactive,
- Mieux vaut utiliser une fonction anonyme généralement,
- Utilisez les maps locales.
Footnotes:
[1] D'autant que c'est ce que fait M-(, mais bah.
- Micha
- 23:50
- > Lien permanent
- > Commentaires
- > Abus ?




