diff --git a/Readme.org b/Readme.org index b5a8aec..f1c704f 100644 --- a/Readme.org +++ b/Readme.org @@ -134,5 +134,6 @@ its lisp directory in your load path, then installing anything missing. 🤷 :after org-roam :demand t :config + (org-roam-slipbox-buffer-identification-mode +1) (org-roam-slipbox-tag-mode +1)) #+end_src diff --git a/lisp/org-roam-slipbox.el b/lisp/org-roam-slipbox.el index 3cba2a8..ec65a59 100644 --- a/lisp/org-roam-slipbox.el +++ b/lisp/org-roam-slipbox.el @@ -52,6 +52,7 @@ ;; :after org-roam ;; :demand t ;; :config +;; (org-roam-slipbox-buffer-identification-mode +1) ;; (org-roam-slipbox-tag-mode +1)) ;; ;; After enabling the mode, run `C-u M-x org-roam-db-sync' to rebuild your notes @@ -84,12 +85,23 @@ tag applied." :group 'org-roam-slipbox :type 'hook) +(defcustom org-roam-slipbox-mode-line-separator " > " + "The separator string between the slipbox name and the node title." + :group 'org-roam-slipbox + :type 'string) + (defface org-roam-slipbox-name '((t (:inherit font-lock-string-face))) "Face for references to slipboxes." :group 'org-roam-slipbox) +(defface org-roam-slipbox-mode-line-separator + '((t + (:inherit comment))) + "Face for the separator in the mode line string." + :group 'org-roam-slipbox) + (defcustom org-roam-slipbox-use-git-p t "Whether to update git when modifying nodes in slipboxes." :group 'org-roam-slipbox @@ -168,6 +180,59 @@ See also: `org-roam-slipbox-default'." (t (advice-remove 'org-set-regexps-and-options #'org-roam-slipbox--ad-append-slipbox-tag)))) + + +(defvar-local org-roam-slipbox--original-buffer-identification nil + "Stores the original value of `mode-line-buffer-identification'. + +This means titles can be restored if +`org-roam-slipbox-buffer-identification-mode' is toggled.") + +;;;###autoload +(define-minor-mode org-roam-slipbox-buffer-identification-mode + "Display the slipbox and node title as the buffer name." + :global t + (cond + (org-roam-slipbox-buffer-identification-mode + (add-hook 'org-mode-hook #'org-roam-slipbox--set-up-buffer-identification-mode) + (add-hook 'org-roam-rewrite-node-renamed-hook #'org-roam-slipbox-update-buffer-identification) + (add-hook 'org-roam-slipbox-after-refile-hook #'org-roam-slipbox-update-buffer-identification) + + (when (derived-mode-p 'org-mode) + (org-roam-slipbox--set-up-buffer-identification-mode))) + (t + (remove-hook 'org-mode-hook #'org-roam-slipbox--set-up-buffer-identification-mode) + (remove-hook 'org-roam-rewrite-node-renamed-hook #'org-roam-slipbox-update-buffer-identification) + (remove-hook 'org-roam-slipbox-after-refile-hook #'org-roam-slipbox-update-buffer-identification) + + ;; Restore default buffer identification settings. + (dolist (buf (seq-filter (lambda (it) (with-current-buffer it (derived-mode-p 'org-mode))) + (buffer-list))) + (with-current-buffer buf + (org-roam-slipbox-update-buffer-identification)))))) + +(defun org-roam-slipbox--set-up-buffer-identification-mode () + ;; Save the default buffer identification settings. + (setq org-roam-slipbox--original-buffer-identification mode-line-buffer-identification) + + (unless org-inhibit-startup + (org-roam-slipbox-update-buffer-identification) + (add-hook 'after-save-hook #'org-roam-slipbox-update-buffer-identification nil t))) + +(defun org-roam-slipbox-update-buffer-identification () + (cond + (org-roam-slipbox-buffer-identification-mode + (when-let* ((node + (ignore-errors (save-excursion + (goto-char (point-min)) + (org-roam-node-at-point))))) + (setq-local mode-line-buffer-identification + (concat (propertize (org-roam-node-slipbox node) 'face 'org-roam-slipbox-name) + (propertize org-roam-slipbox-mode-line-separator 'face 'org-roam-slipbox-mode-line-separator) + (propertize (org-roam-node-title node) 'face 'mode-line-highlight 'help-echo (buffer-file-name)))))) + (t + (setq-local mode-line-buffer-identification org-roam-slipbox--original-buffer-identification)))) + (provide 'org-roam-slipbox) ;;; org-roam-slipbox.el ends here