Mark Oteiza schrieb am Mi., 1. Feb. 2017 um 01:28 Uhr: > > +;; XDG User Directories > +;; https://www.freedesktop.org/wiki/Software/xdg-user-dirs/ > + > +(defconst xdg-line-regexp > + (eval-when-compile > + (rx "XDG_" > + (group-n 1 (or "DESKTOP" "DOWNLOAD" "TEMPLATES" "PUBLICSHARE" > + "DOCUMENTS" "MUSIC" "PICTURES" "VIDEOS")) > + "_DIR=\"" > + (group-n 2 (or "/" "$HOME/") (*? (or (not (any "\"")) "\\\""))) > + "\"")) > + "Regexp matching non-comment lines in xdg-user-dirs config files.") > + > +(defvar xdg-user-dirs nil > + "Alist of directory keys and values.") > + > +(defun xdg--user-dirs-parse-line () > + "Return pair of user-dirs key to directory value in LINE, otherwise nil. > +This should be called at the beginning of a line." > + (skip-chars-forward "[:blank:]") > + (when (and (/= (following-char) ?#) > + (looking-at xdg-line-regexp)) > + (let ((k (match-string 1)) > + (v (match-string 2))) > + (when (and k v) (cons k v))))) > + > +(defun xdg--user-dirs-parse-file (filename) > + "Return alist of xdg-user-dirs from FILENAME." > + (let (elt res) > + (with-temp-buffer > + (insert-file-contents filename) > + (goto-char (point-min)) > + (while (not (eobp)) > + (setq elt (xdg--user-dirs-parse-line)) > + (when (consp elt) (push elt res)) > + (forward-line))) > + res)) > + > +(defun xdg-user-dir (name) > + "Return the path of user directory referred to by NAME." > + (when (null xdg-user-dirs) > + (setq xdg-user-dirs > + (xdg--user-dirs-parse-file > + (expand-file-name "user-dirs.dirs" (xdg-config-home))))) > + (cdr (assoc name xdg-user-dirs))) > This parsing seems a bit brittle (what if the file contains ${HOME} instead of $HOME?); probably this should call the xdg-user-dir program instead.