Since Org-roam v2 creates a top properties drawer (with an :ID:
tag) anyway, it is nice to stick other information there as well. Specifically, information that could be useful in some situation, but which usually we don’t want to see, like :AUTHOR:
(it’s probably you, and you know who you are), :CREATION_TIME:
(and why not use Unix epoch time?), and so on. I have org drawers fold themselves automatically, so the normally-useless information doesn’t distract me.
We can do this by leveraging Org-roam’s org-roam-capture-new-node-hook
, and some org-roam-add-property
function calls, as below.
But, while we’re at it, we might also record where a note was made from. There are a number of ways we might do this, but an easy one (only requiring curl
and an active Internet connection) is using ipinfo.io. curl ipinfo.io
will give you a bunch of information in JSON format about your internet provider, including latitude and longitude, which will likely be at least somewhere near your present location. And curl ipinfo.io/loc
will return just latitude,longitude.
(defun bms/add-other-auto-props-to-org-roam-properties ()
;; if the file already exists, don't do anything, otherwise...
(unless (file-exists-p (buffer-file-name))
;; if there's also a CREATION_TIME property, don't modify it
(unless (org-find-property "CREATION_TIME")
;; otherwise, add a Unix epoch timestamp for CREATION_TIME prop
;; (this is what "%s" does - see http://doc.endlessparentheses.com/Fun/format-time-string )
(org-roam-add-property
(format-time-string "%s"
(nth 5
(file-attributes (buffer-file-name))))
"CREATION_TIME"))
;; similarly for AUTHOR and MAIL properties
(unless (org-find-property "AUTHOR")
(org-roam-add-property roam-user "AUTHOR"))
(unless (org-find-property "MAIL")
(org-roam-add-property roam-email "MAIL"))
;; also add the latitude and longitude
(unless (org-find-property "LAT_LONG")
;; recheck location:
(bms/get-lat-long-from-ipinfo)
(org-roam-add-property (concat (number-to-string calendar-latitude) "," (number-to-string calendar-longitude)) "LAT-LONG"))))
;; hook to be run whenever an org-roam capture completes
(add-hook 'org-roam-capture-new-node-hook #'bms/add-other-auto-props-to-org-roam-properties)
;; function to find latitude & longitude
;; (requires curl to be installed on system)
(setq calendar-latitude 0)
(setq calendar-longitude 0)
(defun bms/get-lat-long-from-ipinfo ()
(let*
((latlong (substring
(shell-command-to-string "curl -s 'ipinfo.io/loc'")
0 -1))
(latlong-list (split-string latlong ",")))
(setq calendar-latitude (string-to-number (car latlong-list)))
(setq calendar-longitude (string-to-number (cadr latlong-list)))))
Largely taken from (my own) blog post at: Automatically adding information to Org-roam file properties ❚ The Neo-Babbage Files which has a bit more discussion.