如何维护 Heading 最新修改时间?

我设置了 Org Capture 自动生成,UUID 和 创建时间:

* TODO add last modified timestamp to org heading
:PROPERTIES:
:ID:       17650B66-9F27-4555-AF48-E843E9238D2E
:CREATED:  2020-11-28T13:38:57+0800
:END:

现在我想要存储「最新修改时间」,即「自动」加入 :UPDATED: 2020-11-28T13:42:46+0800

搜索到一个方案,但看起来复杂,大概工作方式是每次保存,遍历所有 heading,更新修改时间:

我的笔记都存在 git 里,用 cron job 每天更新一次,备份到 github 私有仓库,一个思路是在 git commit 之前,一次性计算修改时间。

大家有类似需求吗?有没有现成的代码?或者有其它思路?

最近一直在想重整一下 org-mode 的博客,目前主要遇到的问题就是更新 heading 的时间。

想了一段时间最后也就是这个方案,加一个 before-save-hook ,里面遍历全部的 heading, 如果有 :blogpost: 的 tag 就更新一下时间属性。

我也遇到这个问题,以前不觉得,现在发现笔记也需要版本控制…

也同样在纠结是在 org 文件和 heading 上维护一个修改时间,还是用 git 搞定…

不知道 lz 后来是如何解决这个问题的

至今没有解决

不知道这个代码是否满足需求?


(defun absolutely-no-name-space/update-time-stampe-at-org-drawer ()
  (interactive)
  (org-set-property "LAST_MODIFIED" (absolutely-no-name-space/a-cool-time-stamp)))

(defun absolutely-no-name-space/a-cool-time-stamp ()
  (let ((absolutely-no-name-space/present (format-time-string "[%Y-%m-%d %a %H:%M]")))
    absolutely-no-name-space/present))

(add-hook 'before-save-hook #'absolutely-no-name-space/update-time-stampe-at-org-drawer)

我最终打算 last_modified + git 一起用,last_modified 的实现用的是这个帖子中基于 (time-stamp) 的解决方案

之前网上抄的一段代码,挺好。

    (defun skx/update-org-modified-property ()
  (interactive)
  (message buffer-file-name)
  (message (car (org-roam--extract-titles-title)))
  (save-excursion
    (widen)
    (goto-char (point-min))
    (when (re-search-forward "^#\\+LAST_MODIFIED:" (point-max) t)
      (progn

	(delete-region
	 (point)
	 (progn (end-of-line 1) (point))
	 )
	
;;	(kill-line)
	(insert " ")
	(insert (format-time-string (org-time-stamp-format t t))))))) 

(defun skx-org-mode-before-save-hook ()
  (when (eq major-mode 'org-mode)
    (skx/update-org-modified-property)))

init.el

(add-hook 'before-save-hook 'time-stamp) 

=xxx.org=

#+MACRO: comp-modified-date Time-stamp: <2021-02-25 18:07:03 gxy>

每次保存文件的时候时间会自动更新

可以有好几种方法

  1. 1楼的hash节点并比较的方法,如果遇到大文件就会卡了。

  2. 基于git,在commit之后,根据git diff找到修改的部分,进而找到修改的节点。

  3. 基于marker,打开文件的时候,记录节点的marker,将所有的操作多归到对应的节点。最后保存只修改了的节点。

  • 第一种已经实现,不多说。

  • 第二种可以用任何的语言实现,只是会增加多余的git log。

  • 第三种必须是elisp实现的,语言限制有点大。

https://www.emacswiki.org/emacs/TimeStamp

他可能要的是更新某个节点,而不是全部的文件!