blog2geek.com
MichaAvatar de Micha

17 billets | Profil

Recherche Google

ce blog tous
Derniers billets Connexion
Archives

aime-emacs-hacks

17/07/2006

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.

 

> Rédiger un commentaire

14:59 18/07/2006 - inconnu

Hum, mais ça marche qu'avec emacs 22 encore non releasé, non ?

15:03 18/07/2006 - Micha

Ecoutez, non.

> Rédiger un commentaire