Оценка случайной функции elisp в Emacs - PullRequest
3 голосов
/ 31 августа 2010

Итак, я получаю удовольствие от этого веб-сайта, который создает случайные темы для Emacs . Я сохранял полученные файлы .el и загружал их при запуске Emacs. Каждая цветовая тема может быть запущена путем оценки выражения elisp с префиксом inspiration-.

К сожалению, я не знаю, elisp. Может ли кто-нибудь помочь мне понять, как я мог бы написать функцию, которая проверяет, какие «преимуще- ственные» префиксные функции доступны, и случайным образом оценивать одну из них?

Ответы [ 3 ]

6 голосов
/ 31 августа 2010

Мне нравится постепенно создавать решение этих проблем. Если вы просто хотите попробовать мой ответ, перейдите к блоку кода 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*")))
4 голосов
/ 31 августа 2010

Я работал над ответом на это, когда Гарольд избил меня до удара. Но его ответ заставил меня задуматься. Я не знал о генераторе тем Inspiration прежде, и мне действительно нравится эта идея! Так что, хотя это не то, о чем вы просили, тем не менее, это может быть интересно тем, кто читает этот вопрос. Он выбирает случайную тему на сайте Inspiration, загружает ее в буфер, оценивает и выполняет результирующую функцию после удаления буфера.

По сути, это случайные цветовые темы. Я еще не разобрался со схемой случайной нумерации для светлых и темных, но если я это сделаю, это можно легко превратить в пару функций random-dark и random-light. То, что вы могли бы затем запустить на основе загруженного времени восхода и захода солнца для вашего времени и долготы ... =)

(defun random-inspiration ()
  "Downloads a random Inspiration theme and evaluates it."
  (interactive)
  (let* ((num (number-to-string (random 1000000)))
         (buffer (url-retrieve-synchronously
                  (concat "http://inspiration.sweyla.com/code/emacs/inspiration"
                          num
                          ".el"))))
    (save-excursion
      (set-buffer buffer)
      (goto-char (point-min))
      (re-search-forward "^$" nil 'move)
      (eval-region (point) (point-max))
      (kill-buffer (current-buffer))
      (funcall (intern-soft (concat "inspiration-" num))))))
0 голосов
/ 01 сентября 2010

На самом деле это не ответ, но после того, как я нашел генератор тем вдохновения, я действительно хотел найти хороший способ их настройки ...

Итак, я сделал это ... http://jasonm23.github.com/

...