求教【smart note】如何orgmode中快速插入headline链接

看过smart note一书,本人的理解是对于smart note的核心是在零散的信息中,建立链接,从而产生更多的信息点,系统是重要的,但更为重要的是记了笔记之后,不断的回看和整理,人才是知识的创造者,机器只能做为工具帮助我们提升效率或者是降低障碍。

根据我的理解卢曼本人的系统是非常简单的,就是用卡片,然后在后续的过程中,根据卡片之间的关系,主要是做三件事:

1 根据卡片之间的意义的关系,对卡片进行排序,让意义上有相关性和相似性的卡片尽可能的排列在一起

2 建立链接,对那些有相关性,但是确实有很大跨度的卡片,建立连接

3 根据自己的研究主题,汇集相关的卡片收集素材,进一步激发想象和组织内容,形成或发现新的知识点。

个人在使用orgmode的时候,感觉其非常适合用做smart note的。通过org capture,随时随地的捕获想法或笔记,然后通过org refile的方式快速的进行组织和排序。

比较不足的就是建立链接的部分,比如说headline A这个条目的内容和headline B,headline C,headline D,有关联,目前的方式是需要到每个建立链接的headline下,通过org-store-link的命令获得链接,然后再回到原来的headline A下通过org-insert-link插入链接,整个操作十分的繁琐。

看了下org-roam等仿roam-research的插件,主要还是以小文件的方式为主,对于headline的链接方式还是很复杂,也还是需要一个个的分别建立链接。

我的设想是有没有这样的一个插件,能让我在headline A的条目里,类似于org-refile的操作一样,快速的检索到有相关性headline B,C,D,一键插入链接,无需在多个headline之间来回的跳转,这样一个比较简单高效的smart note系统基本上就可以依赖已有的orgmode建立起来了。本人技术小白,特此求教。

你说的就是 unlinked reference, org-roam以及其他仿roam-research插件都已经实现了。另外比起链接标题,直接链接相关的一段文本颗粒度更小,也更合理。

如Kinney所言,如果你愿意用文件组织笔记,现在有很多方案。

不过,我个人也是倾向用heading组织笔记,快速插入链接的最简单的方法是用 helm-org 的Action。实际上,helm-org自带插入链接功能,只不过插入的通过标题名匹配的链接,如果修改heading名称,链接就会失效。因此,用id链接是更稳健的方案。演示效果: helm-org-link

注意看最下面的mini-buffer,显示插入的是id链接

首先,确保 helm-org 已安装

然后配置:

   (defun yuchen/helm-org-run-marked-heading-id-link ()
     (interactive)
     (with-helm-alive-p
       (helm-exit-and-execute-action
        'yuchen/helm-org-marked-heading-id-link)))

   (defun yuchen/helm-org-marked-heading-id-link (marker)
     (let* ((victims (with-helm-buffer (helm-marked-candidates)))
            (buffer (marker-buffer marker))
            (filename (buffer-file-name buffer))
            (rfloc (list nil filename nil marker)))
       (when (and (= 1 (length victims))
                  (equal (helm-get-selection) (car victims)))
         ;; No candidates are marked; we are refiling the entry at point
         ;; to the selected heading
         (setq victims (list marker)))
       (when (and victims buffer filename rfloc)
         (cl-loop for victim in victims
                  ;; do (org-with-point-at victim
                  ;;      (org-refile nil nil rfloc))

                  do (with-current-buffer (marker-buffer victim)
         (let ((heading-id (save-excursion (goto-char (marker-position victim))
                                           (org-id-get-create)
                                           ))
               (heading-name
                (save-excursion
                  (goto-char (marker-position victim))
                  (org-entry-get nil "ITEM"))
                )
               )
           (with-helm-current-buffer
             (org-insert-link
              nil (concat "id:" heading-id) heading-name)
             (insert " ")
             )))
   ))))

添加到现有action-list

(add-to-list 'helm-org-headings-actions '(“Insert id link(s) C-H-l” . yuchen/helm-org-marked-heading-id-link) t)

绑定快捷键

(define-key helm-org-headings-map (kbd “C-H-l”) 'yuchen/helm-org-run-marked-heading-id-link)

5 个赞

感谢两位的回复,我在机器上试试看

拼凑了一个 ivy 版本,只是测试了从 org-roam-find-file 交互函数入手. 做到插入某个文件内任意标题的特性。

很多 bugs:

  1. 一次只能插一个
  2. 有时候出现 "被选择 buffer 无法修改"的奇怪报错,不能稳定重现

使用方法是先在 Emacs 中加载下面的函数,然后执行下列命令:

  1. org-roam-find-file
  2. M-o h
(setq-default wr--head-var-a "headline name")

(defun wr/counsel-outline-action (x)
  (setq wr--head-var-a (car x)))

(defun wr/counsel-outline ()
  (interactive)
  (let ((settings (cdr (assq major-mode counsel-outline-settings))))
    (ivy-read "Outline: " (counsel-outline-candidates settings)
              :action (or (plist-get settings :action)
                          #'wr/counsel-outline-action)
              :history (or (plist-get settings :history)
                           'counsel-outline-history)
              :preselect (max (1- counsel-outline--preselect) 0)
              :caller (or (plist-get settings :caller)
                          'wr/counsel-outline))))

(defun wr/insert-a-head-from-a-file (x)
  (interactive)
  (xref-push-marker-stack)
  (save-restriction
    (save-excursion
      (with-ivy-window
        (pcase (cdr x)
          (`(:path ,foo :title ,bar) (progn
                                       (with-temp-buffer
                                         (erase-buffer)
                                         (insert-file-contents foo)
                                         (call-interactively #'wr/counsel-outline))
                                       (insert (format "[[file:%s::*%s][%s]]" foo (car (last (split-string (substring-no-properties wr--head-var-a) " → ")))
                                                       (string-trim-left (car (last (split-string (substring-no-properties wr--head-var-a) " → "))))))))))
      (message "A head has been inserted.")
      (xref-goto-xref))))


(ivy-set-actions
 t
 '(("h" wr/insert-a-head-from-a-file "insert")))
3 个赞

id插入毫无疑问,会使得插入链接更加可靠,但我win10下面的spacemacs里面试了下,似乎有冲突,以我目前的小白水平估计还解决不了, 暂且还是用headline的链接方式,简单弄了个以org-refile为基础的插入命令,每次只能插入一个链接。

(defun wgz-link ()

(interactive)

(org-mark-ring-push)

(call-interactively 'my/org-jump)

(call-interactively 'org-store-link)

(org-mark-ring-goto)

(org-insert-last-stored-link 1))

(defun my/org-jump ()

(interactive)

(let ((current-prefix-arg '(4)))

(call-interactively 'org-refile)))
1 个赞

我用的是mac下的doom-emacs,之前试过spacemacs,但是没有实际使用。

为你自力更生的精神点赞,不过有现成的轮子为何不用呢?如果笔记组织以heading而非file为主,非常推荐helm-org和helm-org-rifle。

依赖越多,问题越难排查,建议:

  1. 使用helm-org自带的插入方法,看看是否正常
  2. 不加载spacemacs,直接用vanilla emacs+helm-org,看看是否work

https://github.com/GTrunSec/braindump-org-source 请参考我的实例和配置,使用org-super-ID,快速插入已经有org-z package实现。

结果 展示配合logseq。 插入使用没录,效果就这样

2 个赞

用八卦做 headline 标识, 帅.

wsl下安装陈斌版本的emacs,折腾了半天没搞定,在windows下spacemacs到是安装好了,在headline下执行命令时,返回running command outside of context,不知道怎么解决了。

更新了下,加了两行,能够以id做为链接插入了

;;在已有id的情况下,使用id存储连接

(setq org-id-link-to-org-use-id 'use-existing)

(defun wgz-link ()

(interactive)

(org-mark-ring-push)

(call-interactively 'my/org-jump)

;; 在需要复制链接的headline下生成id

(org-id-get-create) (call-interactively 'org-store-link)

(org-mark-ring-goto)

(org-insert-last-stored-link 1))

(defun my/org-jump ()

(interactive)

(let ((current-prefix-arg '(4)))

(call-interactively 'org-refile)))

这个非常不错!

感谢作者,非常喜欢你的project,也去oc支持了一下。希望能长期发展下去,对于org-mode近期有个很大的问题,就是带有链接的headline无法跳转识别。就如那个gif所示。也发了issue,https://github.com/logseq/logseq/issues/791, 好像忽略了? 说明下:在这里我并不是催作者去修复,在有精力和时间的情况去解决问题。只是这个问题对于org-mode影响挺大的。所以才特别说明一下

  • 大概就是这样的语法的headline logseq是无法跳转的

    [[url][headline]]
    
  • 这个则是无法识别。

    [[url][headline [0/0][100%]​]
    

再次感谢。

1 个赞

展示快速插入

1 个赞

非常感谢你的支持! headline 跳转那个问题稍后会修复,最近主要是在修复本地文件系统相关的一些 bug, 大概需要两三天时间,涉及到解析相关的之后会一起修复。对了, 你在 discord 群里吗?在的话,你的用户名是什么?

好的谢谢,不在discord看到过但是没加入。不过刚才加入了一下,我的ID是 gtrun

1 个赞

好的,我把你加到 sponsors 里边。

在网上找到org-super-link https://github.com/toshism/org-super-links

应该也是调用了helm-org的功能

其中的sl-link完全可以实现我的要求,实现快速的插入链接而且是双向链接, 还提供了其他一些强大有用的功能:

1比如说在org-capture中插入上一个org-capture的链接,这样就可以把一系列有相关性的headline连接起来

2 在一个headline上生成的org-capture的内容时,在原headline内插入新的headline链接,自动在新的headline内添加原headline的backlink。

详细介绍见 https://github.com/toshism/org-super-links/wiki/Tips

推荐给有类似的需求的同好。

在win下的spacemacs顺利安装使用, 在dotspacemacs-additional-packages中添加(org-super-links :location (recipe :fetcher github :repo “toshism/org-super-links” :commit “0.3”))

感谢推荐,我之前了解过这个package,不过没有采用。

在我的理解中,反向链接的实现主要有两种方式:

  1. 通过搜索或建库等方式返回反向链接,可以找到已有笔记的反向链接,这是org-roam、org-ql的方法
  2. 用自定义的方法创建链接,这种方法会添加额外的信息,因此只有这种链接能找到反向链接,已有的链接无法返回反向链接,这是org-super-link的方法

考虑到已有笔记数量多,使用环境复杂,考虑到兼容性,个人用的是第一种方式。