83 lines
3.0 KiB
EmacsLisp
83 lines
3.0 KiB
EmacsLisp
;;; module-denote-multidir.el --- denote with multi-dir support
|
|
;;;
|
|
;;; Commentary:
|
|
;;;
|
|
;;; Extend denote with support for multiple notes directories.
|
|
;;;
|
|
;;; Code:
|
|
|
|
(require 'module-denote)
|
|
(require 'module-denote-index)
|
|
(require 'module-remotefs) ;; depends on remotefs for some functions
|
|
|
|
(autoload 'my/denote-create-note "denote" nil t)
|
|
|
|
(with-eval-after-load 'denote
|
|
|
|
(defvar my/denote-local-notes-directory "~/notes/")
|
|
(defvar my/denote-remote-notes-directory "~/notes/")
|
|
|
|
(setq denote-directory my/denote-local-notes-directory)
|
|
|
|
(defun my/denote-open-or-create ()
|
|
"Ensure remotefs is mounted before creating or opening a note."
|
|
(interactive)
|
|
(let ((target (denote-file-prompt nil nil :no-require-match)))
|
|
(if (and target (file-exists-p target))
|
|
(find-file target)
|
|
(denote--command-with-features (denote-command-prompt) :use-file-prompt-as-def-title nil nil nil))))
|
|
|
|
(defun my/denote-echo-current-directory ()
|
|
"Echo the current value of denote-directory."
|
|
(declare (interactive-only t))
|
|
(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)
|
|
(setq my/denote-metadata-index-file (concat denote-directory "../denote-metadata.org"))
|
|
(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 ORIG-FUN and ARGS."
|
|
(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)
|
|
|
|
(global-set-key (kbd "C-x n f") #'my/denote-open-or-create)
|
|
(global-set-key (kbd "C-x n n") #'my/denote-create-note)
|
|
(global-set-key (kbd "C-x n d s") #'my/denote-switch-directory)
|
|
(global-set-key (kbd "C-x n d d") #'my/denote-echo-current-directory))
|
|
|
|
(provide 'module-denote-multidir)
|
|
|
|
;;; module-denote-multidir.el ends here.
|