在emacs组织模式中打开Pelican相对路径

时间:2016-05-01 07:41:04

标签: emacs elisp org-mode pelican

我正在使用静态网站生成器Pelican来提供以.org文件为基础的html个人wiki或知识库。 Pelican中内部内容的链接使用语法{filename}/path/to/file。但是,由于我正在使用emacs org-mode,我还希望能够在org-mode中关注这些链接到相关文件。我希望我能编写一个简单的函数,允许org-mode遵循这样的链接并打开相关文件,而不会影响Pelican对内部链接语法的使用。我怀疑这可以通过org-add-link-type和一个解析文件的正确绝对路径的函数来完成。但我的elisp-fu很弱,而且我不确定如何继续。帮助赞赏!

编辑:举个例子,我可能在组织文件中有[[file:{filename}/path/to/file.org]]之类的链接。有没有办法让org打开文件通过替换(可能通过regexp?){filename}的绝对文件路径,但也不会改变原始链接,以便Pelican仍然可以正确处理它?

2 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

#+BEGIN_SRC emacs-lisp
(org-add-link-type
 "pelican"
 (lambda (path) (org-open-file path))
 ;; ; export
 (lambda (path desc backend)
   (cond
    ((eq backend 'html)
     (format "{filename}/%s" (file-relative-name path))))))
#+END_SRC

链接到内部内容鹈鹕:/Users/jkitchin/blogofile-jkitchin.github.com/_blog/blog.org

#+BEGIN_SRC sh
pwd
#+END_SRC

#+RESULTS:
: /Users/jkitchin/blogofile-jkitchin.github.com/_blog

出口到:

<p>
Link to internal content {filename}/blog.org
</p>

答案 1 :(得分:1)

使用John Kitchen的原始答案作为构建的基础(以及this answer),我提出的最佳功能如下:

   (org-add-link-type
   "pelican"
   (lambda (path) (org-open-file path))
   ;; ; export
   (lambda (path desc backend)
     (cond
      ((eq backend 'org)
       (format "[[file:{filename}/%s][%s]]" path (or desc "")))
      ((eq backend 'html)
       (format "<a href=\"%s\">%s</a>" path (or desc "")))
      ((eq backend 'md)
       (format "[{filename}/%s](%s)" path (or desc ""))))))

根据用于org-publish的后端,该函数将为org,html或markdown提供相对链接。