J'aime construire une solution à ces problèmes de manière incrémentielle. Si vous voulez juste essayer ma réponse, passez au bloc de code defun
à la fin. Je vais dans le tampon *scratch*
, dans lisp-interaction-mode
pour essayer ces extraits de code. Vous pouvez taper C-j
après une expression et Emacs l'exécutera et insérera les résultats dans le tampon.
La fonction apropos
recherche les symboles correspondant à certains modèles, y compris les expressions régulières. Ainsi, nous pouvons trouver tous les symboles commençant par comme « inspiration- » si:
(apropos "^inspiration-\*" t)
Mais ce résultat a une liste pour chaque symbole avec d'autres informations. Nous pouvons jeter cela et juste prendre le nom du symbole, qui vient en premier, en utilisant la fonction first
:
(mapcar #'first (apropos "^inspiration-\*" t))
Certains d'entre eux ne sont pas des fonctions, donc retirons toutes celles qui échouent au test functionp
:
(let ((symbols (mapcar #'first (apropos "^inspiration-\*" t))))
(remove-if-not #'functionp symbols))
Maintenant, choisissons au hasard l'un d'entre eux. Je passe de let
à let*
car let*
me permet de faire référence à des définitions antérieures dans la même initialisation, par ex. en utilisant symbols
lors de la définition functions
.
(let* ((symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(nth number functions))
Maintenant, nous allons transformer en une nouvelle fonction Lisp (et il ne faut pas avoir le début du nom avec inspiration-
). Je vais le marquer comme interactive
de sorte que vous pouvez l'exécuter via M-x use-random-inspiration
en plus de l'utiliser dans un autre code elisp. L'autre grand changement est d'utiliser funcall
pour exécuter réellement la fonction choisie au hasard:
(defun use-random-inspiration()
(interactive)
(let* ((symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(funcall (nth number functions))))
ajouter Pour que votre fichier $HOME/.emacs
et l'essayer.
EDIT: Évitez la mémoire tampon Apropos pop-up
(defun use-random-inspiration()
(interactive)
(let* ((pop-up-windows nil)
(symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(funcall (nth number functions)))
(kill-buffer (get-buffer "*Apropos*")))
Harold - je vous remercie. C'est exactement ce dont j'avais besoin. J'ai trouvé des "mapatoms" et j'ai commencé à essayer de construire quelque chose avec ça mais je ne savais pas que c'était une route lente à paver. C'est beaucoup plus simple. – qrest
Il s'avère que le seul problème que j'ai est que la fonction apropos ouvre une nouvelle fenêtre dans le tampon * Apropos *. Je ne vois pas un moyen de le supprimer, mais pouvez-vous? – qrest
M'a pris un moment pour comprendre que la fenêtre pop-up à propos. J'ai ajouté un correctif pour cela marqué comme un EDIT. Il s'avère que c'est un correctif en 2 parties. Tout d'abord, nous devons définir la variable pop-up-windows à zéro afin que l'écran ne soit pas divisé en deux. Cela fait que la fenêtre pop-up prend le contrôle de la fenêtre. Ensuite, nous pouvons tuer le tampon * Apropos * tout de suite pour retourner au tampon dans lequel nous étions. –