emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/denote 60ec95f803 3/4: Let denote-dired-rename-marked-f


From: ELPA Syncer
Subject: [elpa] externals/denote 60ec95f803 3/4: Let denote-dired-rename-marked-files rewrite keywords
Date: Sun, 24 Jul 2022 22:57:35 -0400 (EDT)

branch: externals/denote
commit 60ec95f80386be7bf9f0905b4d3368803163015a
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>

    Let denote-dired-rename-marked-files rewrite keywords
    
    This is only done if appropriate, i.e. if the underlying file is a
    Denote note.
---
 README.org      | 15 ++++++----
 denote-dired.el | 88 ++++++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 72 insertions(+), 31 deletions(-)

diff --git a/README.org b/README.org
index 51e6d0c3d6..e16fdf59bb 100644
--- a/README.org
+++ b/README.org
@@ -522,19 +522,24 @@ Dired to conform with our file-naming scheme.  The 
operation does the
 following:
 
 - the file's existing file name is retained and becomes the =TITLE=
-  field, per our file-naming scheme;
+  field, per Denote's file-naming scheme;
 
 - the =TITLE= is sluggified and downcased, per our conventions;
 
 - an identifier is prepended to the =TITLE=;
 
-- the file's contents are not touched (no insertion of front
-  matter, no other changes);
-
 - the file's extension is retained;
 
 - a prompt is asked once for the =KEYWORDS= field and the input is
-  applied to all files.
+  applied to all file names;
+
+- if the file is recognized as a Denote note, its front matter is
+  rewritten to include the new keywords.  A confirmation to carry out
+  this step is performed once at the outset.  Note that the affected
+  buffers are not saved.  The user can thus check them to confirm that
+  the new front matter does not cause any problems (e.g. with the
+  command ~diff-buffer-with-file~).  Multiple buffers can be saved with
+  ~save-some-buffers~ (read its doc string).
 
 This command ignores files that comply with Denote's file-naming
 scheme.
diff --git a/denote-dired.el b/denote-dired.el
index ded23fea0f..5addcc9fd2 100644
--- a/denote-dired.el
+++ b/denote-dired.el
@@ -101,20 +101,25 @@
 ;; Dired to conform with our file-naming scheme.  The operation does the
 ;; following:
 ;;
-;; - the file's existing file name is retained and becomes the `TITLE'
-;;   field, per our file-naming scheme;
+;; - the file's existing file name is retained and becomes the TITLE
+;;   field, per Denote's file-naming scheme;
 ;;
-;; - the `TITLE' is sluggified and downcased, per our conventions;
+;; - the TITLE is sluggified and downcased, per our conventions;
 ;;
-;; - an identifier is prepended to the `TITLE';
-;;
-;; - the file's contents are not touched (no insertion of front
-;;   matter, no other changes);
+;; - an identifier is prepended to the TITLE;
 ;;
 ;; - the file's extension is retained;
 ;;
-;; - a prompt is asked once for the `KEYWORDS' field and the input is
-;;   applied to all files.
+;; - a prompt is asked once for the KEYWORDS field and the input is
+;;   applied to all file names;
+;;
+;; - if the file is recognized as a Denote note, rewrite its front
+;;   matter to include the new keywords.  A confirmation to carry out
+;;   this step is performed once at the outset.  Note that the affected
+;;   buffers are not saved.  The user can thus check them to confirm
+;;   that the new front matter does not cause any problems (e.g. with
+;;   the command `diff-buffer-with-file').  Multiple buffers can be
+;;   saved with `save-some-buffers' (read its doc string).
 ;;
 ;; This command ignores files that comply with Denote's file-naming
 ;; scheme.
@@ -315,6 +320,28 @@ appropriate."
               (search-forward old-keywords nil t 1)
               (replace-match (concat "\\1" new-keywords) t)))))))
 
+(defun denote-dired--rewrite-keywords-no-question (file keywords)
+  "Rewrite KEYWORDS in FILE outright.
+
+Do the same as `denote-dired--rewrite-front-matter' for keywords,
+but do not for confirmation.
+
+This is for use in `denote-dired-rename-marked-files' or related.
+Those commands ask for confirmation once before performing an
+operation on multiple files."
+  (when-let ((denote-dired--edit-front-matter-p file)
+             (old-keywords (denote-retrieve--value-keywords file))
+             (new-keywords (denote--file-meta-keywords
+                            keywords (denote-dired--filetype-heuristics 
file))))
+    (with-current-buffer (find-file-noselect file)
+      (save-excursion
+        (save-restriction
+          (widen)
+          (goto-char (point-min))
+          (re-search-forward denote-retrieve--keywords-front-matter-key-regexp 
nil t 1)
+          (search-forward old-keywords nil t 1)
+          (replace-match (concat "\\1" new-keywords) t))))))
+
 (defun denote-dired--add-front-matter (file title keywords id)
   "Add front matter to the beginning of FILE.
 The TITLE, KEYWORDS and ID are passed from the renaming
@@ -449,32 +476,41 @@ The operation does the following:
 
 - an identifier is prepended to the TITLE;
 
-- the file's contents are not touched (no insertion of front
-  matter, no other changes);
-
 - the file's extension is retained;
 
 - a prompt is asked once for the KEYWORDS field and the input is
-  applied to all files.
+  applied to all file names;
+
+- if the file is recognized as a Denote note, rewrite its front
+  matter to include the new keywords.  A confirmation to carry
+  out this step is performed once at the outset.  Note that the
+  affected buffers are not saved.  The user can thus check them
+  to confirm that the new front matter does not cause any
+  problems (e.g. with the command `diff-buffer-with-file').
+  Multiple buffers can be saved with `save-some-buffers' (read
+  its doc string).
 
 This command ignores files that comply with Denote's file-naming
 scheme."
   (interactive nil dired-mode)
   (if-let ((marks (dired-get-marked-files))
            (keywords (denote--keywords-prompt)))
-      (progn
-        (dolist (file marks)
-          (let* ((dir (file-name-directory file))
-                 (id (denote-dired--file-name-id file))
-                 (title (or (denote-retrieve--value-title file)
-                            (file-name-sans-extension
-                             (file-name-nondirectory file))))
-                 (extension (file-name-extension file t))
-                 (new-name (denote--format-file
-                            dir id keywords (denote--sluggify title) 
extension)))
-            (rename-file file new-name)
-            (denote-dired--rename-buffer file new-name)))
-        (revert-buffer))
+      (let ((rewrite (yes-or-no-p "Rewrite front matter of keywords, if 
relevant (buffers are not saved)?")))
+        (progn
+          (dolist (file marks)
+            (let* ((dir (file-name-directory file))
+                   (id (denote-dired--file-name-id file))
+                   (title (or (denote-retrieve--value-title file)
+                              (file-name-sans-extension
+                               (file-name-nondirectory file))))
+                   (extension (file-name-extension file t))
+                   (new-name (denote--format-file
+                              dir id keywords (denote--sluggify title) 
extension)))
+              (rename-file file new-name)
+              (denote-dired--rename-buffer file new-name)
+              (when rewrite
+                (denote-dired--rewrite-keywords-no-question new-name 
keywords))))
+          (revert-buffer)))
     (user-error "No marked files; aborting")))
 
 ;;;###autoload



reply via email to

[Prev in Thread] Current Thread [Next in Thread]