Org Mode Babel 输出目录下的所有匹配文件的链接形式

我想插入目录下所有视频文件的org 链接形式的结果。 代码如下:

#+begin_src emacs-lisp :results value raw
(mapcar
 (lambda (f) (format "[[%s]]\n\n" f))
 (directory-files "赌博默示录/赌博默示录 第1季" nil ".flv"))
#+end_src

但是输出的结果带有elisp object represent的双引号。

#+RESULTS[(2020-11-03 08:45:22) ed17b1785bc832862173e211d54574ee45238bce]:
("[[第02话 火盖.flv]]

" "[[第03话 胜负.flv]]

" "[[第04话 破绽.flv]]

" "[[第05话 决死.flv]]

我只想要org的 [[file_link]] 这样的形式。应该怎么做?

mapcar 生成的是一个 list,你应该需要的是生成一个包含若干个 org link 的字符串,而不是列表。

参考:

#+begin_src emacs-lisp :exports results :results value replace raw
(let ((pictures (directory-files "~/Pictures/" t ".jpg"))
      (link-str ""))
  (dolist (pic pictures)
    (setq link-str (concat link-str (format "[[%s]]\n\n" pic))))
  link-str)
#+end_src

另外,如果你不想在 org 文档中显式的包含生成 video links 的代码,可以用 “Org Macro Replacement”。

用法可以参考我的 这篇文章

在文档开头定义宏: #+MACRO: video-links (eval (format-videos-org-link))

在需要插入链接的位置调用宏: {{{video-links}}}

其中 format-videos-org-link 函数就是上面的函数,可以写在你的配置中,让org文档更加简洁。

(defun format-videos-org-link ()
  (let ((pictures (directory-files "~/Pictures/" t ".jpg"))
        (link-str ""))
    (dolist (pic pictures)
      (setq link-str (concat link-str (format "[[%s]]\n\n" pic))))
    link-str))

感谢,elisp babel结果的 "" 最后还是有,不过这次只有最外层了。删掉比较容易。 Org Macro Replacement 方法也不错。挺好用的。

我这边外层是没有 "" 的。

我查了下,是我的配置里含有这个的缘故。

(add-to-list 'org-babel-default-header-args:emacs-lisp
               '(:results . "verbatim"))