看过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链接是更稳健的方案。演示效果:
注意看最下面的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:
- 一次只能插一个
- 有时候出现 "被选择 buffer 无法修改"的奇怪报错,不能稳定重现
使用方法是先在 Emacs 中加载下面的函数,然后执行下列命令:
- org-roam-find-file
-
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。
依赖越多,问题越难排查,建议:
- 使用helm-org自带的插入方法,看看是否正常
- 不加载spacemacs,直接用vanilla emacs+helm-org,看看是否work
https://github.com/GTrunSec/braindump-org-source 请参考我的实例和配置,使用org-super-ID,快速插入已经有org-z package实现。
结果 展示配合logseq。
插入使用没录,效果就这样
2 个赞
jingow
11
wsl下安装陈斌版本的emacs,折腾了半天没搞定,在windows下spacemacs到是安装好了,在headline下执行命令时,返回running command outside of context,不知道怎么解决了。
jingow
12
更新了下,加了两行,能够以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,Issues · logseq/logseq · GitHub 好像忽略了? 说明下:在这里我并不是催作者去修复,在有精力和时间的情况去解决问题。只是这个问题对于org-mode影响挺大的。所以才特别说明一下
再次感谢。
1 个赞
非常感谢你的支持! headline 跳转那个问题稍后会修复,最近主要是在修复本地文件系统相关的一些 bug, 大概需要两三天时间,涉及到解析相关的之后会一起修复。对了, 你在 discord 群里吗?在的话,你的用户名是什么?
好的谢谢,不在discord看到过但是没加入。不过刚才加入了一下,我的ID是 gtrun
1 个赞
jingow
19
在网上找到org-super-link GitHub - toshism/org-super-links: Package to create links with auto backlinks
应该也是调用了helm-org的功能
其中的sl-link完全可以实现我的要求,实现快速的插入链接而且是双向链接,
还提供了其他一些强大有用的功能:
1比如说在org-capture中插入上一个org-capture的链接,这样就可以把一系列有相关性的headline连接起来
2 在一个headline上生成的org-capture的内容时,在原headline内插入新的headline链接,自动在新的headline内添加原headline的backlink。
详细介绍见 Tips · toshism/org-super-links Wiki · GitHub
推荐给有类似的需求的同好。
jingow
20
在win下的spacemacs顺利安装使用,
在dotspacemacs-additional-packages中添加(org-super-links :location (recipe
:fetcher github
:repo “toshism/org-super-links”
:commit “0.3”))
感谢推荐,我之前了解过这个package,不过没有采用。
在我的理解中,反向链接的实现主要有两种方式:
- 通过搜索或建库等方式返回反向链接,可以找到已有笔记的反向链接,这是org-roam、org-ql的方法
- 用自定义的方法创建链接,这种方法会添加额外的信息,因此只有这种链接能找到反向链接,已有的链接无法返回反向链接,这是org-super-link的方法
考虑到已有笔记数量多,使用环境复杂,考虑到兼容性,个人用的是第一种方式。