Files
lypacamacs/custom/mydenotefuncs.el
T

70 lines
3.4 KiB
EmacsLisp

;"Generate an aligned, fontified buffer of all Denote files using fd."
(defvar denote-browser-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "RET") 'denote-browser-open-file)
map)
"Keymap for the custom Denote browser.")
(defface denote-browser-dir '((t :inherit font-lock-comment-face)) "Face for subdirs.")
(defface denote-browser-id '((t :inherit font-lock-constant-face)) "Face for IDs.")
(defface denote-browser-title '((t :inherit font-lock-keyword-face :weight bold)) "Face for titles.")
(defface denote-browser-tags '((t :inherit font-lock-type-face)) "Face for tags.")
(defun denote-browser-open-file ()
"Open the file on the current line."
(interactive)
(if (get-text-property (point) 'denote-path)
(find-file (get-text-property (point) 'denote-path))
(message "No file on this line.")))
(defun list-denote-files ()
"Generate an aligned, fontified buffer of all Denote files using fd."
(interactive)
(let* ((default-directory (expand-file-name "~/lyrinv/SOR/Notes/"))
(raw-output (shell-command-to-string "fd -t f"))
(lines (split-string raw-output "\n" t))
(buf (get-buffer-create "*Denote Browser*")))
(with-current-buffer buf
(let ((inhibit-read-only t))
(erase-buffer)
(use-local-map denote-browser-map)
(setq-local buffer-read-only t)
(dolist (line lines)
;; Regex to break down: Subdir/ + ID + Title + Keywords
(if (string-match "^\\(.*\\/\\)?\\([0-9A-Za-z]+\\)--\\([^\n__]+\\)\\(__.*\\)?\\.\\([a-z]+\\)$" line)
(let* ((dir (or (match-string 1 line) ""))
(id (or (match-string 2 line) ""))
(title (or (match-string 3 line) ""))
(tags (or (match-string 4 line) ""))
(full-path (expand-file-name line default-directory))
(start (point)))
;; Clean up trailing slash and tag underscores for legibility
(setq dir (if (string-empty-p dir) "." (directory-file-name dir)))
(setq tags (if (string-empty-p tags) "" (replace-regexp-in-string "__" " " tags)))
;; Insert padded, aligned string components
(insert (propertize (format "%-20s " dir) 'face 'denote-browser-dir))
(insert (propertize (format "%-16s " id) 'face 'denote-browser-id))
(insert (propertize (format "%-45s " title) 'face 'denote-browser-title))
(insert (propertize tags 'face 'denote-browser-tags))
(insert "\n")
;; Attach the raw file path to the entire line for RET to use
(add-text-properties start (point) (list 'denote-path full-path)))
;; Fallback layout for non-standard files (e.g., gereedschap.ods)
(let* ((dir (or (file-name-directory line) "."))
(file (file-name-nondirectory line))
(full-path (expand-file-name line default-directory))
(start (point)))
(insert (propertize (format "%-20s " (directory-file-name dir)) 'face 'denote-browser-dir))
(insert (propertize (format "%-16s " "No-ID") 'face 'denote-browser-id))
(insert (propertize file 'face 'denote-browser-title))
(insert "\n")
(add-text-properties start (point) (list 'denote-path full-path)))))))
(pop-to-buffer buf)))