Как передать член из списка в виде строки в другую функцию? - PullRequest
0 голосов
/ 23 февраля 2019

Это моя первая в истории программа elisp.Я пытаюсь сделать своего рода панель инструментов для отображения при запуске Emacs.Я следую за кодом со страницы запуска elisp startup.el :

(defun dashboard ()
  "Display a custom dashboard on startup"
  (let ((dash-buffer (get-buffer-create "*dashboard*")))
    (with-current-buffer dash-buffer
      (let ((inhibit-read-only t))
        (erase-buffer)

        (fancy-splash-insert
         :face 'variable-pitch "Recent Files:"
         :face 'variable-pitch "\n")

        (dolist (recent recentf-list)
          (defconst file-text
            `((:link ((with-output-to-string (princ recent)),
                      (lambda (_button) (browse-url "https://www.gnu.org/software/emacs/"))
                      ))))

          (apply #'fancy-splash-insert (car file-text))
          (insert "\n")))

      (display-buffer dash-buffer))))

Я хочу в конечном итоге отобразить недавно использованные файлы, поэтому я перехожу по списку с помощью (dolist (recent recentf-list),поэтому recent в теории содержит недавно использованный файл.Я хотел бы сделать ссылку из переменной recent.Да, я понимаю, что ссылка на gnu.org - это не совсем то, чего я хочу, но я еще не дошел до ссылки.Я думаю, что что-то с find-file - то, что я хочу там, но я вернусь к этому позже.В любом случае, как я ни стараюсь, единственное, что я могу сделать, - это жестко закодированная строка:

- работает

`((:link ("foo",

- не работает

`((:link (recent,

`((:link ((format "%s" recent),

`((:link ((with-output-to-string (princ recent)),

Я перепробовал все, что мог придумать, чтобы заставить эту вещь взять переменную, и это побеждает меня ... какие-либо идеи?

Я получаю ошибки, подобные следующим:

fancy-splash-insert: Wrong type argument: char-or-string-p, (with-output-to-string (princ recent))

1 Ответ

0 голосов
/ 24 февраля 2019

Вам нужно использовать специальный маркер ,, чтобы сообщить кавычке, что recent не является константой.Вам также не нужно ни princ, ни with output to string.Это должно работать:

(defun dashboard ()
  "Display a custom dashboard on startup"
  (let ((dash-buffer (get-buffer-create "*dashboard*")))
    (with-current-buffer dash-buffer
      (let ((inhibit-read-only t))
        (erase-buffer)

        (fancy-splash-insert
         :face 'variable-pitch "Recent Files:"
         :face 'variable-pitch "\n")

        (dolist (recent recentf-list)
          (defconst file-text
            `((:link (,recent
                      (lambda (_button) (browse-url "https://www.gnu.org/software/emacs/"))
                      ))))

          (apply #'fancy-splash-insert (car file-text))
          (insert "\n")))

      (display-buffer dash-buffer))))

См. Дополнительную информацию об обратной цитате в документации .

...