28 Jun 2016
Automatic webjump list from org
Webjump is a bookmark facility for Emacs. Fed with a list of bookmarks (as an association list) it presents a menu, then open a browser page with the selected link. Simple and handy.
This function converts my list of bookmarks (expressend in a org document that is also used to build my Links page) in a data structure suitable for webjump.
(defun get-webjump-sites () (with-current-buffer (get-file-buffer "~/Dropbox/stefanorodighiero.net/links.org") (delq nil (mapcar (lambda (i) (let ((item-string (cdr (assoc "ITEM" i))) (regex "\\[\\[\\(.*\\)\\]\\[\\(.*\\)\\]\\]")) (if (posix-string-match regex item-string) `(,(match-string 2 item-string) . ,(match-string 1 item-string))))) (org-map-entries 'org-entry-properties nil 'file))))) (setq webjump-sites (get-webjump-sites))
Update
I asked for a review on #emacs, bpalmer kindly pointed out a few things that should be done in a different manner:
- I'm building a list containing nils, which I need to delete later
(
delq
). I shouldn't be creating them in the first place - Probably no need for
posix-string-match
instead ofstring-match
- I should provide a docstring
So, here a better version, using the loop
macro
(require 'cl) (defun get-webjump-sites () "converts a org document in a data structure suitable for webjump" (let ((regex "\\[\\[\\(.*\\)\\]\\[\\(.*\\)\\]\\]")) (with-current-buffer (get-file-buffer "~/Dropbox/stefanorodighiero.net/links.org") (loop for i in (org-map-entries 'org-entry-properties nil 'file) for item-string = (cdr (assoc "ITEM" i)) if (string-match regex item-string) collect `(,(match-string 2 item-string) . ,(match-string 1 item-string))))))
It's more concise and direct, definitely better, but I'm still not satisfied: it lacks clarity and cleanliness.