branch: externals/denote-silo commit 972d5e2fb19e9784d0ea830ee0f037001a60f401 Author: Protesilaos Stavrou <i...@protesilaos.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Move file out of the main Denote directory WORK-IN-PROGRESS --- README.md | 3 ++ denote-silo.el | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) diff --git a/README.md b/README.md new file mode 100644 index 0000000000..67521f4911 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Denote Silo extras + +WORK-IN-PROGRESS: <https://protesilaos.com/codelog/2025-02-11-emacs-splitting-denote-many-packages/>. diff --git a/denote-silo.el b/denote-silo.el new file mode 100644 index 0000000000..dc66e6f357 --- /dev/null +++ b/denote-silo.el @@ -0,0 +1,125 @@ +;;; denote-silo-extras.el --- Convenience functions for using Denote in multiple silos -*- lexical-binding: t; -*- + +;; Copyright (C) 2023-2025 Free Software Foundation, Inc. + +;; Author: Protesilaos Stavrou <i...@protesilaos.com> +;; Maintainer: Protesilaos Stavrou <i...@protesilaos.com> +;; URL: https://github.com/protesilaos/denote + +;; This file is NOT part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This is a set of convenience functions that used to be provided in +;; the Denote manual. A "silo" is a `denote-directory' that is +;; self-contained. Users can maintain multiple silos. Consult the +;; manual for the details. With the Denote package installed, +;; evaluate the following to read the relevant node: +;; +;; (info "(denote) Maintain separate directory silos for notes") + +;;; Code: + +(require 'denote) + +(defgroup denote-silo-extras nil + "Make it easier to use Denote across Silos." + :group 'denote + :link '(info-link "(denote) Top") + :link '(url-link :tag "Homepage" "https://protesilaos.com/emacs/denote")) + +(defcustom denote-silo-extras-directories + `(,denote-directory) + "List of file paths pointing to Denote silos. +Each file path points to a directory, which takes the same value +as the variable `denote-directory'." + :group 'denote-silo-extras + :link '(info-link "(denote) Maintain separate directories for notes") + :type '(repeat directory)) + +(defvar denote-silo-extras-directory-history nil + "Minibuffer history for `denote-silo-extras-directory-prompt'.") + +(defalias 'denote-silo-extras--directory-history 'denote-silo-extras-directory-history + "Compatibility alias for `denote-silo-extras-directory-history'.") + +(define-obsolete-function-alias + 'denote-silo-extras--directory-prompt + 'denote-silo-extras-directory-prompt + "3.1.0") + +(defun denote-silo-extras-directory-prompt () + "Prompt for directory among `denote-silo-extras-directories'." + (let ((default (car denote-silo-extras-directory-history))) + (completing-read + (format-prompt "Select a silo" default) + (denote--completion-table 'file denote-silo-extras-directories) + nil :require-match nil 'denote-silo-extras-directory-history))) + +(defun denote-silo-extras-path-is-silo-p (path) + "Return non-nil if PATH is among `denote-silo-extras-directories'." + (member path denote-silo-extras-directories)) + +(defmacro denote-silo-extras-with-silo (silo &rest args) + "Run ARGS with SILO bound, if SILO satisfies `denote-silo-extras-path-is-silo-p'." + (declare (indent defun)) + `(if (denote-silo-extras-path-is-silo-p ,silo) + (progn + ,@args) + (user-error "`%s' is not among the `denote-silo-extras-directories'" ,silo))) + +;;;###autoload +(defun denote-silo-extras-create-note (silo) + "Select SILO and run `denote' in it. +SILO is a file path from `denote-silo-extras-directories'. + +When called from Lisp, SILO is a file system path to a directory that +conforms with `denote-silo-extras-path-is-silo-p'." + (interactive (list (denote-silo-extras-directory-prompt))) + (denote-silo-extras-with-silo silo + (let ((denote-directory silo)) + (call-interactively #'denote)))) + +;;;###autoload +(defun denote-silo-extras-open-or-create (silo) + "Select SILO and run `denote-open-or-create' in it. +SILO is a file path from `denote-silo-extras-directories'. + +When called from Lisp, SILO is a file system path to a directory that +conforms with `denote-silo-extras-path-is-silo-p'." + (interactive (list (denote-silo-extras-directory-prompt))) + (denote-silo-extras-with-silo silo + (let ((denote-directory silo)) + (call-interactively #'denote-open-or-create)))) + +;;;###autoload +(defun denote-silo-extras-select-silo-then-command (silo command) + "Select SILO and run Denote COMMAND in it. +SILO is a file path from `denote-silo-extras-directories', while +COMMAND is one among `denote-silo-extras-commands'. + +When called from Lisp, SILO is a file system path to a directory that +conforms with `denote-silo-extras-path-is-silo-p'." + (interactive + (list + (denote-silo-extras-directory-prompt) + (denote-command-prompt))) + (denote-silo-extras-with-silo silo + (let ((denote-directory silo)) + (call-interactively command)))) + +(provide 'denote-silo-extras) +;;; denote-silo-extras.el ends here