Мне нравится постепенно создавать решение этих проблем. Если вы просто хотите попробовать мой ответ, перейдите к блоку кода defun
в конце. Я иду в буфер *scratch*
, в lisp-interaction-mode
, чтобы попробовать эти фрагменты кода. Вы можете ввести C-j
после выражения, и Emacs запустит его и вставит результаты в буфер.
Функция apropos
ищет символы, соответствующие некоторому шаблону, включая регулярные выражения. Таким образом, мы можем найти все символы, начинающиеся с «вдохновения», например:
(apropos "^inspiration-\*" t)
Но у этого результата есть список для каждого символа с некоторой другой информацией. Мы можем отказаться от этого и просто взять имя символа, которое идет первым, используя функцию first
:
(mapcar #'first (apropos "^inspiration-\*" t))
Некоторые из них не являются функциями, поэтому давайте удалим все, которые не пройдут тест functionp
:
(let ((symbols (mapcar #'first (apropos "^inspiration-\*" t))))
(remove-if-not #'functionp symbols))
Теперь давайте случайным образом выберем один из них. Я переключаюсь с let
на let*
, потому что let*
позволяет мне ссылаться на более ранние определения в той же инициализации, например, используя symbols
при определении functions
.
(let* ((symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(nth number functions))
Теперь давайте превратим это в новую функцию lisp (и давайте не будем начинать имя с inspiration-
). Я отмечу его как interactive
, чтобы вы могли запустить его через M-x use-random-inspiration
в дополнение к использованию в другом коде elisp. Другое большое изменение заключается в использовании funcall
для фактического запуска случайно выбранной функции:
(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))))
Итак, добавьте это в файл $HOME/.emacs
и попробуйте.
РЕДАКТИРОВАТЬ: избегать всплывающего окна Apropos буфер
(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*")))