branch: externals/denote
commit dec04ce383afdccd6bf7e5962af7844dea2101f6
Author: Protesilaos Stavrou <[email protected]>
Commit: Protesilaos Stavrou <[email protected]>

    Update to Denote version 2.2.0
---
 CHANGELOG.org | 368 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 README.org    |  87 +++-----------
 denote.el     |   2 +-
 3 files changed, 386 insertions(+), 71 deletions(-)

diff --git a/CHANGELOG.org b/CHANGELOG.org
index d5507c697d..e2c0e47644 100644
--- a/CHANGELOG.org
+++ b/CHANGELOG.org
@@ -13,6 +13,374 @@ the manual: <https://protesilaos.com/emacs/denote>.
 
 #+toc: headlines 1 insert TOC here, with one headline level
 
+* Version 2.2.0 on 2023-12-10
+:PROPERTIES:
+:CUSTOM_ID: h:8efed390-cfa0-420d-b300-0cb76bf2c9f9
+:END:
+
+The present version covers four broad themes:
+
+1. Denote rename commands are more user-friendly and featureful.
+2. An optional sorting facility makes it possible to produce a
+   filtered and sorted Dired buffer with Denote files.
+3. The optional Denote Org dynamic blocks have received a lot of attention.
+4. Bug fixes and internal refinements.
+
+[ Remember that you do not need to be a programmer to contribute to
+  Denote. Report a bug, make a suggestion, or just describe how you
+  want to use this package. Every idea counts and we may implement it
+  if we can. ]
+
+** The rename commands can remove a Denote file name component
+:PROPERTIES:
+:CUSTOM_ID: h:54d803d8-4863-4160-bb2f-3302fb8bff23
+:END:
+
+The commands we provide to rename files using the Denote file-naming
+scheme---~denote-rename-file~, ~denote-dired-rename-files~, and
+~denote-dired-rename-marked-files-with-keywords~---can now remove
+Denote file name components. This is done by providing an empty string
+at the relevant prompt.
+
+For example, to remove the =TITLE= component from a file called
+=20231209T110322==sig--title__keywords.ext= we provide an empty string
+at the title prompt. The end result will look something like this:
+=20231209T110322==sig__keywords.ext=.
+
+All prompts now include a hint that leaving them empty will ignore the
+given field if it does not exist or remove it if it does exist.
+
+Note that you must *check how to input an empty string* with your
+minibuffer user interface of choice. For instance, with the ~vertico~
+package you can do that with the =M-RET= key binding or by selecting
+the prompt line directly (notice the counter showing something like
+=*/5= instead of =1/5=). Please make sure to consult the documentation
+of the package you are using as this behaviour is not controlled by
+Denote. Vertico, and others like it, selects the first candidate if
+you type =RET= without any input, which is not the same as an empty
+string---it is the first candidate.
+
+Also read the Denote manual on the matter of 
[[https://protesilaos.com/emacs/denote#h:532e8e2a-9b7d-41c0-8f4b-3c5cbb7d4dca][Renaming
 files]]. In short,
+we use this facility to name all our files, regardless of file type,
+in a consistent way that makes them easier to find (I do this with my
+videos, for example, and I do it across my filesystem for all personal
+files).
+
+** The file-to-be-renamed is easier to read in the minibuffer
+:PROPERTIES:
+:CUSTOM_ID: h:69d85d3b-0200-4cc1-baff-9d59aa0ff57b
+:END:
+
+The commands ~denote-rename-file~ and ~denote-dired-rename-files~ 
+show the name of the file they are operating on in the minibuffer
+prompt. This is now produced relative to the current directory,
+meaning that instead of =/some/rather/long/path/to/file-name.txt=
+Denote only displays =file-name.txt=.
+
+Our rename commands never move files to another directory, anyway, so
+we do not need to remind the user of the entire file system path.
+
+To make things easier for users/themes, file names highlighted in
+Denote prompts are fontified with either of following faces,
+depending on the specifics of the case:
+
+- ~denote-faces-prompt-old-name~
+- ~denote-faces-prompt-new-name~
+- ~denote-faces-prompt-current-name~
+
+These faces inherit the attributes of basic faces, so they should look
+decent without further tweaks across all themes.
+
+** Prompts for title, keywords, and signature accept an empty string
+:PROPERTIES:
+:CUSTOM_ID: h:5897bcc1-4637-4268-8518-8404d939b4b9
+:END:
+
+The prompts defined by Denote that apply to file name components all
+accept an empty string. This has the effect of skipping the given
+component. For example, we can create a file without a title and
+keywords, with the following sequence of actions (I assume you are
+using ~vertico~ for the minibuffer user interface):
+
+- Type =M-x denote=.
+- Type =M-RET= at the title prompt to input an empty string.
+- Now type =M-RET= at the keywords prompt for another empty string.
+
+The resulting file name is something like =20231209T110950.org=.
+
+** Dired with sorting and filtering
+:PROPERTIES:
+:CUSTOM_ID: h:05aa437b-2fc8-4e01-ac38-ab77baad83af
+:END:
+
+The new optional =denote-sort.el= library provides facilities to sort
+Denote files by any of their file name components. Users can benefit
+from this facility to produce a filtered and sorted listing of Denote
+files with the command ~denote-sort-dired~.
+
+~denote-sort-dired~ produces a fully fledged Dired buffer. It asks for a
+regular expression that matches file names in the ~denote-directory~.
+It then prompts for a sort key and finally checks with the user
+whether to reverse the order or not.
+
+[ Do not be discouraged by the term "regular expression". Ordinary
+  words work fine. Plus, with Denote's file-naming scheme we have
+  semantics such as =_keyword=, =-title=, ~=signature~, as explained
+  in the manual. This is the whole point of using a thoughtful naming
+  scheme. ]
+
+The resulting Dired listing is flat, meaning that files inside of
+subdirectories are bundled together with those present at the root of
+the ~denote-directory~. In this case, files inside of a subdirectory
+include the directory component as a prefix. So we have something like
+this:
+
+#+begin_example
+test-subdir/20230320T105950--a-new-note__testing.txt
+20231202T095629--rename-works-as-intended__one_test_two.org
+#+end_example
+
+I think this is a killer feature, as the fully fledged Dired buffer
+allows us to perform all supported operations on our Denote
+sorted+filtered files (e.g. change file permissions, move files to
+another directory, or open them in an external application).
+
+I recorded a video to show how this works:
+<https://protesilaos.com/codelog/2023-12-04-emacs-denote-sort-mechanism/>.
+
+[ Remember that we can rename any file using the Denote file-naming
+  scheme, meaning that our files can include stuff like PDFs and
+  videos. Combine this with the concept of "silos", which is covered
+  in the Denote manual, to organise your long-term storage and
+  retrieve it efficiently. ]
+
+** Combine contents of files with an Org dynamic block
+:PROPERTIES:
+:CUSTOM_ID: h:d41009c1-9833-4b28-8240-9666bfd26559
+:END:
+
+The new =denote-files= Org dynamic block produces a continuous stream
+of file contents. It joins together the contents of files inside the
+~denote-directory~ whose name matches the given regular expression.
+Optional parameters control whether to include links to those files,
+omit their front matter, sort by a given file name component, or tweak
+the separator between each file's contents.
+
+I produced a video to demonstrate the functionality:
+<https://protesilaos.com/codelog/2023-11-25-emacs-denote-org-dynamic-blocks/>.
+
+Use the command ~denote-org-dblock-insert-files~ to insert such a
+block directly at point. Read the Denote manual for the
+technicalities: 
[[https://protesilaos.com/emacs/denote#h:f15fa143-5036-416f-9bff-1bcabbb03456][Org
 dynamic block to insert file contents]].
+
+[ Videos I do will eventually be out-of-date. The manual is the source
+  of truth. ]
+
+Bear in mind that this feature is not "transclusion". We are simply
+printing a copy of the contents of the files in the current buffer.
+Changes made to this copy are not reflected in the original files.
+
+The =denote-files= Org dynamic block is an excellent way to quickly
+collect your thoughts on a given topic. Although dynamic blocks are a
+feature of Org, the contents of the files do not need to be in Org
+syntax (I write most of my notes in plain text (=.txt=)).
+
+Thanks to Claudiu Tănăselia for proposing this idea and discussing it
+with me. This was done via a private channel and the information is
+shared with permission.
+
+** Sort parameters are used in all Denote Org dynamic blocks
+:PROPERTIES:
+:CUSTOM_ID: h:7b51fe38-302e-488d-9816-7015a8071ddb
+:END:
+
+All Denote Org dynamic blocks make use of =denote-sort.el= (described
+further above). It powers the =:sort-by-component= and =:reverse-sort=
+parameters.
+
+Thanks to Glenna D. for suggesting this feature and discussing it with
+me. This was done via a private channel and the information is shared
+with permission. It is what inspired me to start work on
+=denote-sort.el=, which I then extended to cover Dired, as noted
+above.
+
+** The =:missing-only= parameter is removed from Org dynamic blocks
+:PROPERTIES:
+:CUSTOM_ID: h:2bd26aef-70ad-4d83-a4ab-c75a893a733a
+:END:
+
+I am removing it because the underlying functionality of
+~denote-add-missing-links~ was not always reliable.
+
+** Files with signature are linked appropriately in Org dynamic blocks
+:PROPERTIES:
+:CUSTOM_ID: h:144436eb-e674-4052-ac0a-d582b6aa2f53
+:END:
+
+In general, we provide the command ~denote-link-with-signature~ to let
+the user pick a file that has a signature and link to it. The
+description of such a link contains the signature text as well as the
+file title. The ~denote-link-with-signature~ is distinct from the
+standard ~denote-link~, as it allows the user to express intent about
+the inclusion of the signature.
+
+In Org dynamic blocks for links/backlinks, we make this happen
+automatically since there can be no manual intervention to express
+intent on a link-by-link basis.
+
+** Fontification in Dired can now extend to subdirectories
+:PROPERTIES:
+:CUSTOM_ID: h:46e08576-4c17-4b1e-a268-e0223250e7c1
+:END:
+
+The user option ~denote-dired-directories~ activates the
+~denote-dired-mode~ in the specified list of directories when the user
+sets this in their init file:
+
+#+begin_src emacs-lisp
+(add-hook 'dired-mode-hook #'denote-dired-mode-in-directories)
+#+end_src
+
+The new user option ~denote-dired-directories-include-subdirectories~
+extends the reach of this feature to all subdirectories thereof.
+
+Thanks to Henrik Hörmann for discussing this with me and contributing
+a patch. This was originally done in pull request 191 on the GitHub
+mirror: <https://github.com/protesilaos/denote/pull/191>. Subsequent
+refinements by me.
+
+** Signatures are sluggified as intended
+:PROPERTIES:
+:CUSTOM_ID: h:73e1efaa-2c22-48ee-be46-072b55177c99
+:END:
+
+The file name signature component is now sluggified properly. This
+means that multiple words are separated by the equals sign, in
+accordance with the Denote file-naming scheme where a word separator
+is the same as the given field separator (this is the low-tech feature
+that makes Denote files so easy to retrieve without fancy extras).
+
+Vedang Manerikar fixed two relevant bugs in the "rename" commands,
+while I rewrote internal functions and tests in the interest of consistency. 
Vedang's patches: <https://lists.sr.ht/~protesilaos/denote/patches/46790>.
+
+[ The "signature" is a free form component of the file name. Users can
+  add anything they want there, such as to use it as a "category" that
+  is different from "tags/keywords", or to introduce sequences in
+  their notes, or to just have an extra marker for files they need to
+  spot quickly. ]
+
+** For developers
+:PROPERTIES:
+:CUSTOM_ID: h:79f2fd7e-d5a7-4c78-bce7-f8d21e86e32c
+:END:
+
+There is a section in the manual titled "For developers or advanced
+users". There we document functions or variables that are
+public-facing, meaning that we test and document their behaviour and
+encourage others to use them for code they write on top of Denote.
+Refer to this section if you are looking to extend Denote. Though you
+can also just check the source code, which is designed to be readable
+and hackable.
+
+- The ~denote-directory-files~ function gains new functionality that
+  subsumes that of the now-deprecated functions
+  ~denote-directory-files-matching-regexp~, ~denote-all-files~,
+  ~denote-directory-text-only-files~. Thanks to Jean-Philippe Gagné
+  Guay for the contribution, which was done in pull request 195 on the
+  GitHub mirror: <https://github.com/protesilaos/denote/pull/195>.
+
+- The font-lock keywords we define are consolidated into a single
+  variable: ~denote-faces-file-name-keywords~ instead of being split
+  into two variables. This means that we cover all our fontification
+  needs in the backlinks buffer as well as the ~denote-dired-mode~
+  with this one point of entry. It also works for ~denote-sort-dired~,
+  which can include files with their subdirectory component in the
+  same flat listing.
+
+- Use the function ~denote-retrieve-filename-keywords~ to extract
+  keywords from the file name alone, without going into the file
+  contents.
+
+- The ~denote-retrieve-filename-title~ function now returns an empty
+  string if no title is present. Its behaviour is thus consistent with
+  ~denote-retrieve-filename-keywords~ and ~denote-retrieve-filename-signature~.
+  
+- The ~denote-retrieve-filename-title~ will now use the
+  ~file-name-base~ function as a fallback subject to a non-nil
+  optional argument. This case come into effect when the file does not
+  have a title component. The new optional argument allows the caller
+  to handle such cases as they see fit.
+
+- The ~denote-signature-prompt~ and ~denote-title-prompt~ functions
+  accept an optional =DEFAULT-SIGNATURE= or =DEFAULT-TITLE= argument.
+  Internally, this is used as the =INITIAL-INPUT= of ~completing-read~
+  instead of the =DEF= argument. This matters because we want the
+  prompt to return an empty string if there is no input, whereas the
+  presence of =DEF= means that =DEF= is returned when the prompt is
+  empty.
+
+- All our functions that interactively match file names with a regular
+  expression now use the ~denote-files-matching-regexp-prompt~
+  function. When called from Lisp, it takes a =REGEXP= argument as
+  well as an optional =PROMPT-TEXT=.
+
+For the purposes of this release cycle, I am not documenting the
+points of entry provided by =denote-sort.el=. It is a new feature that
+I may eventually incorporate in =denote.el=. If you are interested in
+the functionality (e.g. to have more elaborate sorting algorithms),
+please take a look at the source code and then let us discuss the
+implementation details.
+
+** Miscellaneous
+:PROPERTIES:
+:CUSTOM_ID: h:ce5c7865-9ec1-49ba-9388-5a251ab56735
+:END:
+
+- Rewrote the manual on the topic of Org dynamic blocks. Same idea for
+  practically the entirety of =denote-org-dblock.el=.
+
+- Marked the interactive specification of a few commands with the
+  major mode they belong to. This means that =M-X= (note the capital
+  X), which calls ~execute-extended-command-for-buffer~ by default,
+  will only show those commands in the relevant context.
+
+- Made internal refinements and simplified the implementation of a few
+  functions. This is important work to keep the code base clean and
+  easy to read/maintain. Thanks to Jean-Philippe Gagné Guay for the
+  contribution. It was done in pull request 193 on the GitHub mirror:
+  <https://github.com/protesilaos/denote/pull/193>.
+
+- Improved the doc string of the ~denote-format-file-name~ function.
+  Also introduced a unit test for it to be sure it does what we expect
+  (I eventually want to have tests for everything we do, but this is a
+  long-term project).
+
+** Git commits
+:PROPERTIES:
+:CUSTOM_ID: h:6830d3f3-130c-4346-b3ca-a3d4b0e9f974
+:END:
+
+Just an overview of what we did. Thanks again to everyone involved.
+
+#+begin_src sh
+~/Git/Projects/denote $ git shortlog 2.1.0..2.2.0 --summary --numbered
+   125 Protesilaos Stavrou
+    17 Jean-Philippe Gagné Guay
+     2 Vedang Manerikar
+     1 Henrik Hörmann
+#+end_src
+
+** Policy for the next development cycle
+:PROPERTIES:
+:CUSTOM_ID: h:cb0cae4f-c9a1-40b3-98ae-781a57270d4e
+:END:
+
+I will give a ~1 week pause on Denote development before making any
+feature changes. This is to ensure that we catch possible bugs and
+push fixes right away. If there are other changes in place, it is not
+possible to make point updates of this sort, as we must first wait for
+the new features to be tested in real-world scenaria.
+
 * Version 2.1.0 on 2023-11-12
 :PROPERTIES:
 :CUSTOM_ID: h:167beb8f-14be-40de-a1f2-d13910924c00
diff --git a/README.org b/README.org
index b815ee28b0..8646b24173 100644
--- a/README.org
+++ b/README.org
@@ -4,9 +4,9 @@
 #+language: en
 #+options: ':t toc:nil author:t email:t num:t
 #+startup: content
-#+macro: stable-version 2.1.0
-#+macro: release-date 2023-11-12
-#+macro: development-version 2.2.0-dev
+#+macro: stable-version 2.2.0
+#+macro: release-date 2023-12-10
+#+macro: development-version 2.3.0-dev
 #+export_file_name: denote.texi
 #+texinfo_filename: denote.info
 #+texinfo_dir_category: Emacs misc features
@@ -1047,11 +1047,6 @@ line or switching between then with commands like 
~switch-to-buffer~.
 :CUSTOM_ID: h:7cc9e000-806a-48da-945c-711bbc7426b0
 :END:
 
-[ The ~denote-rename-file~ command is made more intuitive as part of
-  {{{development-version}}}. All its prompts now include a hint that
-  leaving them empty will ignore the given field if it does not exist
-  or remove it if it does exist. ]
-
 #+findex: denote-rename-file
 The ~denote-rename-file~ command renames a file and updates existing
 front matter if appropriate. It is possible to do the same with
@@ -1086,16 +1081,14 @@ Else, use the file name as a default value at the 
minibuffer prompt.
 When called from Lisp, =TITLE= is a string.
 
 If =TITLE= is nil or an empty string, do not add it to a newly renamed
-file or remove it from an existing file. [ This feature is part of
-{{{development-version}}}. ]
+file or remove it from an existing file.
 
 Add =SIGNATURE= to =FILE=. In interactive use, prompt for =SIGNATURE=,
 using an existing one as the default value at the minibuffer prompt.
 When called from Lisp, =SIGNATURE= is a string.
 
 If =SIGNATURE= is nil or an empty string, do not add it to a newly
-renamed file or remove it from an existing file. [ Made consistent as
-part of {{{development-version}}}. ]
+renamed file or remove it from an existing file.
 
 Add =KEYWORDS= to =FILE=. In interactive use, prompt for =KEYWORDS=.
 More than one keyword can be inserted when separated by the
@@ -1103,8 +1096,7 @@ More than one keyword can be inserted when separated by 
the
 a list of strings.
 
 If =KEYWORDS= is nil or an empty string, do not add it to a newly
-renamed file or remove it from an existing file. [ Part of
-{{{development-version}}}. ]
+renamed file or remove it from an existing file.
 
 Read the file type extension (like =.txt=) from the underlying file
 and preserve it through the renaming process. Files that have no
@@ -1326,11 +1318,6 @@ difference between old and new file names.
 :CUSTOM_ID: h:ab3f355a-f763-43ae-a4c9-179d2d9265a5
 :END:
 
-[ These faces are part of {{{development-version}}}. The styles they
-  use are the same they had before. The difference now is that themes
-  can style them as they see fit instead of having to deal with
-  hardcoded values. ]
-
 These are the faces used by the various Denote rename commands to
 style or highlight the old/new/current file shown in the relevant
 minibuffer prompts:
@@ -2262,8 +2249,7 @@ the function ~denote-dired-mode-in-directories~:
 The user option ~denote-dired-directories-include-subdirectories~
 specifies whether the ~denote-dired-directories~ also cover their
 subdirectories. By default they do not. Set this option to ~t~ to
-include subdirectories as well. [ This feature is part of
-{{{development-version}}}. ]
+include subdirectories as well.
 
 The faces we define for this purpose are:
 
@@ -2381,8 +2367,6 @@ own function and assigning it to the 
~denote-rename-buffer-function~.
 :CUSTOM_ID: h:8b542c50-dcc9-4bca-8037-a36599b22779
 :END:
 
-[ Revised as part of {{{development-version}}}. ]
-
 Denote can optionally integrate with Org mode's "dynamic blocks"
 facility. This means that it can use special blocks that are evaluated
 with =C-c C-x C-u= (~org-dblock-update~) to generate their contents.
@@ -2420,10 +2404,6 @@ Evaluate:
 :CUSTOM_ID: h:50160fae-6515-4d7d-9737-995ad925e64b
 :END:
 
-[ Refactored as part of {{{development-version}}}. The =denote-links=
-  parameters =:reverse= and =:missing-only= are no longer supported.
-  The =denote-backlinks= also no longer accepts =:reverse=. ]
-
 #+findex: denote-org-dblock-insert-links
 The =denote-links= block can be inserted at point with the command
 ~denote-org-dblock-insert-links~ or by manually including the
@@ -2456,13 +2436,12 @@ line to update the block.
   unquoted symbol among =title=, =keywords=, =signature=, =identifier=.
   When using the command ~denote-org-dblock-insert-files~, this
   parameter is automatically inserted together with the (=:regexp=
-  parameter) and the user is prompted for a file name component. [ The
-  =:sort-by-component= parameter is part of {{{development-version}}}. ]
+  parameter) and the user is prompted for a file name component.
 
 - The =:reverse-sort= parameter is optional. It reverses the order in
   which files appear in. This is meaningful even without the presence
   of the parameter =:sort-by-component=, though it also combines with
-  it. [ The =:reverse-sort= parameter is part of {{{development-version}}}. ]
+  it.
 
 - The =:id-only= parameter is optional. It accepts a ~t~ value, in
   which case links are inserted without a description text but only
@@ -2484,9 +2463,6 @@ this in an Org file:
 :
 : #+END:
 
-[ As with the =denote-links= block, the parameters =:sort-by-component=
-  and =:reverse-sort= are part of {{{development-version}}}. ]
-
 Remember to type =C-c C-x C-u= (~org-dblock-update~) with point on the
 =#+BEGIN= line to update the block.
 
@@ -2495,10 +2471,6 @@ Remember to type =C-c C-x C-u= (~org-dblock-update~) 
with point on the
 :CUSTOM_ID: h:f15fa143-5036-416f-9bff-1bcabbb03456
 :END:
 
-[ Part of {{{development-version}}}. As of 2023-11-30 06:54 +0200 and
-  as part of {{{development-version}}}, this dynamic block also provides
-  facilities for sorting, courtesy of the new =denote-sort.el= library. ]
-
 Denote can optionally use Org's dynamic blocks facility to produce a
 section that lists entire file contents 
([[#h:8b542c50-dcc9-4bca-8037-a36599b22779][Use Org dynamic blocks]]).
 This works by instructing Org to match a regular expression of Denote
@@ -2586,8 +2558,6 @@ parameters, which are described further below:
 :CUSTOM_ID: h:9fe01e63-f34f-4479-8713-f162a5ca865e
 :END:
 
-[ Part of {{{development-version}}}. ]
-
 The =denote-sort.el= file is an optional extension to the core
 functionality of Denote, which empowers users to sort files by the
 given file name component ([[#h:4e9c7512-84dc-4dfb-9fa9-e15d51178e5d][The 
file-naming scheme]]).
@@ -2972,11 +2942,6 @@ Restore the buffer with 
\\<dired-mode-map>`\\[revert-buffer]'."
 :CUSTOM_ID: h:d35d8d41-f51b-4139-af8f-9c8cc508e35b
 :END:
 
-[ As part of {{{development-version}}}, we provide the
-  ~denote-sort-dired~ command which should cover most of the uses of a
-  virtual Dired listing. The ~denote-sort-dired~ produces a fully
-  fledged Dired buffer ([[#h:9fe01e63-f34f-4479-8713-f162a5ca865e][Sort files 
by component]]). ]
-
 Emacs' Dired is a powerful file manager that builds its functionality
 on top of the Unix =ls= command.  As noted elsewhere in this manual,
 the user can update the =ls= flags that Dired uses to display its
@@ -3859,10 +3824,7 @@ might change them without further notice.
   regular expression. With optional =OMIT-CURRENT= as a non-nil value,
   do not include the current Denote file in the returned list. With
   optional =TEXT-ONLY= as a non-nil value, limit the results to text
-  files that satisfy ~denote-file-is-note-p~. [ As part of
-  {{{development-version}}}, the ~denote-directory-files~ subsumes the
-  now-deprecated ~denote-directory-files-matching-regexp~,
-  ~denote-all-files~, ~denote-directory-text-only-files~. ]
+  files that satisfy ~denote-file-is-note-p~.
 
 #+findex: denote-directory-subdirectories
 + Function ~denote-directory-subdirectories~ :: Return list of
@@ -3946,9 +3908,7 @@ might change them without further notice.
 
   =EXTENSION= is a string that contains a dot followed by the file
   type extension. It can be an empty string or a nil value, in which
-  case it is not added to the base file name. [ The doc string and
-  error testing of ~denote-format-file-name~ are expanded as part of
-  {{{development-version}}}. ]
+  case it is not added to the base file name.
 
 #+findex: denote-extract-keywords-from-path
 + Function ~denote-extract-keywords-from-path~ :: Extract keywords
@@ -3972,14 +3932,12 @@ might change them without further notice.
   optional =FILE-NAME-BASE-FALLBACK= return ~file-name-base~ if no
   Denote title component exists. If the extraction is succcessful
   (when no ~file-name-base~ is involved) run ~denote-desluggify~ on
-  the title. [ Revised as part of {{{development-version}}} to return
-  an empty string if no title is present and to make the use of
-  ~file-name-base~ optional. ]
+  the title.
 
 #+findex: denote-retrieve-filename-keywords
 + Function ~denote-retrieve-filename-keywords~ ::  Extract keywords
   from =FILE= name, if present, else return an empty string. Return
-  matched keywords as a single string. [ Part of {{{development-version}}} . ]
+  matched keywords as a single string.
 
 #+findex: denote-retrieve-filename-signature
 + Function ~denote-retrieve-filename-signature~ :: Extract signature
@@ -4035,12 +3993,7 @@ might change them without further notice.
   text. With optional =PROMPT-TEXT= use it in the minibuffer instead
   of the default prompt. Previous inputs at this prompt are available
   for minibuffer completion. Consider ~savehist-mode~ to persist
-  minibuffer histories between sessions. [ Revised as part of
-  {{{development-version}}} to use initial text instead of a default
-  value. This way, the user can still input an empty string when they
-  want to. Whereas before the empty string was interpreted as the
-  default value (this is how Emacs does it but is not what we wanted
-  in this case). ]
+  minibuffer histories between sessions.
 
 #+findex: denote-file-prompt
 + Function ~denote-file-prompt~ :: Prompt for file with identifier in
@@ -4062,12 +4015,7 @@ might change them without further notice.
   optional =PROMPT-TEXT= use it in the minibuffer instead of the
   default prompt. Previous inputs at this prompt are available for
   minibuffer completion. Consider ~savehist-mode~ to persist
-  minibuffer histories between sessions. [ Revised as part of
-  {{{development-version}}} to use initial text instead of a default
-  value. This way, the user can still input an empty string when they
-  want to. Whereas before the empty string was interpreted as the
-  default value (this is how Emacs does it but is not what we wanted
-  in this case). ]
+  minibuffer histories between sessions.
 
 #+vindex: denote-title-prompt-current-default
 + Variable ~denote-title-prompt-current-default~ :: Currently bound
@@ -4096,7 +4044,7 @@ might change them without further notice.
 #+findex: denote-files-matching-regexp-prompt
 + Function ~denote-files-matching-regexp-prompt~ ::  Prompt for
   =REGEXP= to filter Denote files by. With optional =PROMPT-TEXT= use
-  it instead of a generic prompt. [ Part of {{{development-version}}}. ]
+  it instead of a generic prompt.
 
 #+findex: denote-prompt-for-date-return-id
 + Function ~denote-prompt-for-date-return-id~ :: Use
@@ -4831,8 +4779,7 @@ dired-sort-toggle-or-edit= (=C-u s= by default) and append
 The user option ~dired-listing-switches~ sets your default preference.
 
 For an on-demand sorted and filtered Dired listing of Denote files,
-use the command ~denote-sort-dired~ 
([[#h:9fe01e63-f34f-4479-8713-f162a5ca865e][Sort files by component]]). [ Part
-of {{{development-version}}}. ]
+use the command ~denote-sort-dired~ 
([[#h:9fe01e63-f34f-4479-8713-f162a5ca865e][Sort files by component]]).
 
 ** How do you handle the last modified case?
 :PROPERTIES:
diff --git a/denote.el b/denote.el
index 1d9b10d075..11d54a43fc 100644
--- a/denote.el
+++ b/denote.el
@@ -6,7 +6,7 @@
 ;; Maintainer: Denote Development <~protesilaos/[email protected]>
 ;; URL: https://git.sr.ht/~protesilaos/denote
 ;; Mailing-List: https://lists.sr.ht/~protesilaos/denote
-;; Version: 2.1.1
+;; Version: 2.2.0
 ;; Package-Requires: ((emacs "28.1"))
 
 ;; This file is NOT part of GNU Emacs.

Reply via email to