在Emacs Org-mode中设置个人Wiki

13

我想建立一个org-mode个人维基,并尝试了两种方法。第一种是使用单个“Scientific Notebook.org”文件,将所有笔记放入其中,每个笔记都有自己的标题、日期和标签(与博客文章相同格式)。然后我打开了org-velocity以快速导航该文件。

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

我遇到的另一个问题是标签。我喜欢使用许多多词标签来交叉引用我的笔记。但org-mode在缓冲区中包装这些标签的方式使我的标题完全难以理解。此外(也许只是我),我发现驼峰式命名真的很难读,尤其是面对像这样的内容时:

:monotonicTransformations:homogeneousFunctions:orderedSets:proofs:

现在我尝试使用Deft进行第二次尝试。在这里,我将每个笔记都分解成自己的.org文件,并创建一个专用的~/org/文件夹来容纳我的wiki。但这就是我卡住的地方:

1)如何设置自动链接,以便在一个笔记中输入“foo bar”,会创建到“foo bar.org”的链接?这可以通过radio target完成吗?如果不行,那么[[foo bar]]语法是否可以覆盖以搜索~/org/目录中所有文件的标题?我尝试添加Wiki.el作为次要模式,但没有成功...

2)如何给单个文件打标签?然后你如何拉出所有标签的列表,并用它来过滤你的笔记列表?我已经阅读到bookmark+可以让你做文件标记。但我在在线文档中迷失了...

我很想听听其他人是如何解决这些问题的,你们正在使用哪些次要模式、工作流程和键盘快捷键或其他修改!

谢谢!

-Adam

2个回答

9
我正在使用一个简单的代码来制作维基百科。 因为对我而言,维基百科是分类事物的快速方法。 结构如下:
  • 每个主题都有自己的org文件
  • 每个主题下面有自己的标题
  • 所有org文件都在单个目录中
  • 您可以使用helm跳转到文件或创建新文件
就这样。我发现不需要将任何内容链接到其他内容, 跳转到主题的功能已经足够了。这是它的外观:

jump to subject

一旦进入一个主题,我可以用worf来跨越主题跳转。 这是它的外观:

jump to topic of subject


5

我认为只有一个笔记文件更加灵活和兼容。然而,对于稍微大一点的文件来说,它往往会变得缓慢。多个小文件很快,但需要更多的设置工作,并且仅在该设置中起作用。

单文件解决方案

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

当标签用于关键字时不仅会变得混乱,随着文件的增长,使用它们也会变得相当缓慢。我曾经尝试过一些自定义功能,但现在大部分时间都避免使用标签。相反,我使用平坦层次结构、类别等,并依赖于occurorg-occur(例如M-x org-occur begin_proof)。

多个文件

链接到其他文件的org语法非常简单:[[./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 hook来实现这一点。以下是一个示例:

(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)

请注意,我没有进行过大量测试。
事实上,我建议您不要使用这个,除非您真的需要它。虽然制作花哨的扩展很诱人,但尽可能保持笔记的简单性是更好的选择。如果您将所有内容放在一个文件中,您可以使用记事本、谷歌文档或其他工具编辑您的笔记,如果您需要的话。

非常感谢您提供如此详细的回复!我以前从未见过[[./]]作为[[file:]]的快捷方式。不过,我想知道是否有一种方法可以将org-mode搜索“[[this idea]]”的范围从当前缓冲区扩大到当前目录? - Adam
你能否将多个类别应用于标题?再次感谢! - Adam
1
我已经更新了我的回答。不,你不能有多个类别。实际上,对于几兆字节的笔记来说,搜索和发生(occur)已经足够了。 - olaf b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接