diff --git a/emacs/init.el b/emacs/init.el index bd962d7..67c7a91 100644 --- a/emacs/init.el +++ b/emacs/init.el @@ -285,7 +285,9 @@ (use-package denote :ensure t :commands (my/search-denote-notes) :bind (("C-x n f" . #'denote-open-or-create) - ("C-x n n" . #'denote) + ("C-x n n" . #'my/denote-create-note) + ("C-x n d s" . #'my/denote-switch-directory) + ("C-x n d d" . #'my/denote-echo-current-directory) ("C-x n c" . #'denote-region) ("C-x n !" . #'denote-date) ("C-x n z" . #'denote-signature) @@ -302,10 +304,58 @@ ("C-x n r f" . #'denote-rename-file-using-front-matter)) :config + + (defvar my/denote-local-notes-directory "~/notes/") + (defvar my/denote-remote-notes-directory "/ssh:lkn@alioth.uberspace.de:/home/lkn/notes/") + (setq denote-directory my/denote-local-notes-directory) + + (defun my/denote-echo-current-directory () + "Echo the current value of denote-directory." + (interactive) + (message "Current Denote directory: %s" denote-directory)) + + (defun my/denote-directory-segment () + "Return the current Denote directory for the mode line." + (when (bound-and-true-p denote-directory) + (format " Denote:%s " (file-name-nondirectory (directory-file-name denote-directory))))) + + + (defun my/denote-switch-directory () + "Switch current denote working directory." + (interactive) + (let ((new-dir (if (string= denote-directory my/denote-local-notes-directory) + my/denote-remote-notes-directory + my/denote-local-notes-directory))) + (setq denote-directory new-dir) + (message "Denote directory switched to %s" new-dir))) + + (defun my/denote-use-both-directories (orig-fun &rest args) + "Temporarily use both directories for a given function." + (let ((original-dir denote-directory) + (result nil)) + (setq denote-directory my/denote-local-notes-directory) + (setq result (apply orig-fun args)) + (setq denote-directory my/denote-remote-notes-directory) + (setq result (append result (apply orig-fun args))) + (setq denote-directory original-dir) + result)) + + (defun my/denote-create-note () + "Create a note in directory of choice." + (interactive) + (let* ((dirs (list my/denote-local-notes-directory my/denote-remote-notes-directory)) + (chosen-dir (completing-read "Choose directory: " dirs))) + (let ((denote-directory chosen-dir)) + (call-interactively #'denote)))) + + + (advice-add 'denote-directory-files :around #'my/denote-use-both-directories) + (advice-add 'denote-directory-subdirectories :around #'my/denote-use-both-directories) + (defun my/search-denote-notes () "Use ripgrep to search denote notes." (interactive) - (let ((default-directory "/ssh:lkn@alioth.uberspace.de:/home/lkn/notes/")) + (let ((default-directory denote-directory)) (consult-ripgrep))) (let ((map dired-mode-map)) @@ -314,9 +364,16 @@ (define-key map (kbd "C-x n k") #'denote-dired-rename-marked-files-with-keywords) (define-key map (kbd "C-x n r r") #'denote-dired-rename-files) (define-key map (kbd "C-x n r f") #'denote-dired-rename-marked-files-using-front-matter)) + + ;; show current denote directory in modeline + (with-eval-after-load 'doom-modeline + (doom-modeline-def-segment denote-directory + (my-denote-directory-segment)) + (setq doom-modeline-format-left + (append doom-modeline-format-left + '(denote-directory)))) - (setq denote-directory (expand-file-name "/ssh:lkn@alioth.uberspace.de:/home/lkn/notes/") - denote-save-buffers nil + (setq denote-save-buffers nil denote-known-keywords '("emacs" "golang" "dev") denote-infer-keywords t denote-sort-keywords t