在Emacs Org-mode中设置个人wiki

时间:2014-10-31 07:13:28

标签: emacs elisp org-mode wiki

我想在org-mode中设置个人wiki。

到目前为止,我已尝试过这两种方式。我的第一次尝试是使用单个“Scientific Notebook.org”文件。这就是我的所有笔记 - 每个都有自己的标题,日期和标签(格式与博客文章相同)。然后我打开org-velocity快速浏览文件。

但这造成了两个问题:首先,我在笔记中使用了大量的数学(LaTeX预览是我想要我们组织的原因之一)。但是这些需要花费很长时间来加载,我无法尝试打开一个包含数千个条目的文件(所有数据都填充数据!!)

我遇到的另一个问题是标签。我喜欢使用很多多字标签来交叉引用我的笔记。但是org-mode的方式将这些包装在缓冲区中,使我的标题完全无法理解。另外(也许只是我,但是)我发现CamelCase真的很难读,特别是在遇到类似的事情时:

:monotonicTransformations:homogeneousFunctions:orderedSets:proofs:

现在我的第二次尝试是与Deft。在这里,我将每个音符分解为自己的.org文件,并创建一个专用的〜/ org /文件夹来保存我的wiki。但这就是我陷入困境的地方:

1)如何设置自动链接,以便在一个注释中输入“foo bar”,创建一个指向“foo bar.org”的链接?这可以通过无线电目标完成吗?如果没有,是否可以覆盖此语法[[foo bar]]来搜索〜/ org /目录中所有文件的标题?我尝试将Wiki.el添加为次要模式,但没有骰子......

2)你如何标记单个文件?那么你怎么能拿出所有标签的列表并使用它来过滤你的笔记列表呢?我读过书签+让你做文件标记。但是我在网络文档中迷失了......

我很想听听其他人如何解决这些问题,您正在使用哪些小模式,工作流程和键盘快捷键或其他模式!

谢谢!

- 亚当

2 个答案:

答案 0 :(得分:8)

我使用a simplistic code作为维基。 因为这对我而言是一个wiki:快速分类事物的方式。 结构如下:

  • 每个主题都有自己的组织文件
  • 主题的每个主题都有自己的标题
  • 所有组织文件都在单个目录中
  • 您可以跳转到文件,或使用helm
  • 创建新文件

那就是它。我发现需要将任何东西链接到任何东西,跳转到主题功能 绰绰有余。以下是它的外观:

jump to subject

在某个主题中,我可以使用worf跳过主题。 以下是它的外观:

jump to topic of subject

答案 1 :(得分:3)

在我看来,只有一个笔记文件更灵活,更兼容。然而,即使是规模适中的文件也会变慢。多个小文件很快,但是它们需要更多的设置工作,并且它们只能在该设置中工作。

单个文件解决方案

为了加快速度,请考虑将org-startup-with-latex-preview设置为nil(或将#+STARTUP: nolatexpreview添加到您的文件中)。

标签不仅在用于关键字时变得混乱,使用它们也会随着文件的增长而变慢。我玩过一些自定义函数,但现在大部分时间都避免使用标记。相反,我使用 flat 层次结构,类别,否则依赖于发生和组织发生(例如M-x org-occur begin_proof)。

多个文件

用于链接到其他文件的组织语法非常简单:[[./this idea.org][this idea]]。如果这太麻烦了,应该很容易编写一个用适当的链接替换活动区域的函数。

如果您想将[[this idea]]链接到文件“this idea.org”,您可以向org-open-at-point-functions添加一个功能并自行处理。

对于标签,您不会标记文件本身,而是标记单个顶级标题。这当然意味着你所有的麻烦都有标签。 同样,我建议不要使用标签。只需确保文件在正确的位置包含正确的关键字,然后使用occur和朋友。

编辑:示例`org-open-at-point-function'

如果要在目录中的所有文件中搜索模糊链接而不是仅搜索当前缓冲区,可以使用org-open-at-point-functions挂钩来执行此操作。这是一个例子:

(defvar my-link-search-directory "/my/notes/directory/")

(defun my-open-link-function ()
  "Open link, interpreting it a the name of a headline."
  (let* ((el (org-element-context))
         (type (first el))
         (link-type (plist-get (cadr el) :type))
         (path (let ((path-1 (plist-get (cadr el) :path)))
                 (when (stringp path-1)
                   (org-link-unescape path-1)))))
    (when (and (eql type 'link)
               path
               (string= link-type "fuzzy"))
      (let* ((path (regexp-quote path))
             (result
                 (delq nil
                       (org-map-entries
                        (lambda ()
                          (when (string-match
                                 path
                                 (org-get-heading))
                            (list (buffer-file-name) (point))))
                        nil
                        ;; Here we set the scope.
                        ;; 'agenda would search in all agenda files.
                        ;; We want a list of all org files in `my-link-search-directory'.
                        (directory-files
                         my-link-search-directory
                         t "[.]org\\'")))))
        (when result
          (when (> (length result) 1)
            (message "Warning: multiple search results for %s" path))
          (let ((file (caar result))
                (pos (cadar result)))
            (find-file file)
            (goto-char pos)))))))


(add-hook 
 'org-open-at-point-functions
 'my-open-link-function)

请注意,我没有测试过这么多。

实际上,我建议不要使用它,除非真的需要它。虽然制作花哨的扩展很诱人,但最好保持笔记尽可能简单。如果您将所有内容都放在一个文件中,则可以使用记事本或Google文档或其他任何内容编辑您的笔记。