emacs-devel
[Top][All Lists]
Advanced

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

Re: [NonGNU ELPA] New package: Denote-Refs


From: Akib Azmain Turja
Subject: Re: [NonGNU ELPA] New package: Denote-Refs
Date: Tue, 20 Dec 2022 00:00:52 +0600

Philip Kaludercic <philipk@posteo.net> writes:

> Akib Azmain Turja <akib@disroot.org> writes:
>
>> Denote-Refs shows links and backlinks inline in a Denote note buffer,
>> just below the front matter of the note.
>>
>> Here is the patch:
>>
>> From f4145634df9eb45df7d526871c55326bfafb3785 Mon Sep 17 00:00:00 2001
>> From: Akib Azmain Turja <akib@disroot.org>
>> Date: Mon, 19 Dec 2022 22:22:46 +0600
>> Subject: [PATCH] * elpa-packages (denote-refs): New package.
>>
>> ---
>>  elpa-packages | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/elpa-packages b/elpa-packages
>> index 9dde563..1d26a5a 100644
>> --- a/elpa-packages
>> +++ b/elpa-packages
>> @@ -108,6 +108,8 @@
>>    :ignored-files ("LICENSE" "test" "Cask" "Makefile")
>>    :news "CHANGELOG.md")
>>
>> + (denote-refs           :url "https://codeberg.org/akib/emacs-denote-refs";)
>> +
>>   (devhelp               :url "https://codeberg.org/akib/emacs-devhelp";)
>>
>>   (diff-ansi         :url "https://codeberg.org/ideasman42/emacs-diff-ansi";
>> --
>> 2.37.1
>
> Here are a few comments:
>
> diff -u /tmp/denote-refs.el.1 /tmp/denote-refs.el
> --- /tmp/denote-refs.el.1     2022-12-19 19:38:55.000000000 +0100
> +++ /tmp/denote-refs.el       2022-12-19 17:57:48.712068577 +0100

Wow, nanosecond precision.  :O

> @@ -5,8 +5,8 @@
>  ;; Author: Akib Azmain Turja <akib@disroot.org>
>  ;; Created: 2022-12-18
>  ;; Version: 0.1
> -;; Package-Requires: ((emacs "28.1"))
> -;; Keywords: hypermedia outlines files
> +;; Package-Requires: ((emacs "28.1") (denote "1.2.0"))
> +;; Keywords: hypermedia, outlines, files
>  ;; URL: https://codeberg.org/akib/emacs-denote-refs

Whoops, I forgot that.  :(
Done.

>
>  ;; This file is not part of GNU Emacs.
> @@ -36,12 +36,11 @@
>  (require 'denote)
>  (require 'subr-x)
>
> -(defgroup denote-refs nil
> +(defgroup denote-refs '()

Why?

>    "Show links and backlinks in Denote notes."
>    :group 'denote
> -  :group 'hypermedia
> -  :group 'outlines
> -  :group 'files
> +  ;; You don't need to add multiple groups, we only need it to appear
> +  ;; once in the customize hierarchy
>    :link '(url-link "https://codeberg.org/akib/emacs-denote-refs";)
>    :prefix "denote-refs-")
>

Done.

> @@ -62,7 +61,8 @@
>
>  Available sections are `links' and `backlinks', which shows the list
>  of linked file and the list of backlinks respectively."
> -  :type '(set (const :tag "Links" links)
> +  :type '(set :greedy t
> +           (const :tag "Links" links)
>                (const :tag "Backlinks" backlinks)))

What does ':greedy t' mean?

And anyway, I'm going to change that with 'repeat', since
'(links backlinks)', '(backlinks links)' and '(links backlinks links)'
all have meanings now.

New type: '(repeat (choice (const :tag "Links" links)
                           (const :tag "Backlinks" backlinks)))

Again the space-tab problem.  Added .dir-locals.el.

>
>  (defvar denote-refs--links 'not-ready
> @@ -83,65 +83,67 @@
>  (defun denote-refs--render (section)
>    "Render SECTION."
>    (let ((refs (pcase section
> -                ('links denote-refs--links)
> -                ('backlinks denote-refs--backlinks))))
> -    (pcase major-mode
> -      ;; There's no comment syntax in `text-mode', so just follow
> -      ;; `org-mode'.
> -      ((or 'org-mode 'text-mode)
> -       ;; Insert references count.
> -       (insert (if (eq refs 'not-ready)
> -                   (format "# ... %s\n" (if (eq section 'links)
> -                                            "links"
> -                                          "backlinks"))
> -                 (format "# %i %s%s\n" (length refs)
> -                         (if (eq section 'links)
> -                             "link"
> -                           "backlink")
> -                         (pcase (length refs)
> -                           (0 "")
> -                           (1 ":")
> -                           (_ "s:")))))
> -       ;; Insert reference list.
> -       (when (listp refs)
> -         (dolist (ref refs)
> -           (insert "#   ")
> -           (insert-button (car ref)
> -                          'help-echo (cdr ref)
> -                          'face 'denote-faces-link
> -                          'action (lambda (_)
> -                                    (funcall denote-link-button-action
> -                                             (cdr ref))))
> -           (insert ?\n))))
> -      ('markdown-mode
> -       ;; Insert references count.
> -       (insert (if (eq refs 'not-ready)
> -                   (format "<!-- ... %s -->\n" (if (eq section 'links)
> -                                                   "links"
> -                                                 "backlinks"))
> -                 (format "<!-- %i %s%s\n" (length refs)
> -                         (if (eq section 'links)
> -                             "link"
> -                           "backlink")
> -                         (pcase (length refs)
> -                           (0 " -->")
> -                           (1 ":")
> -                           (_ "s:")))))
> -       ;; Insert reference list.
> -       (when (listp refs)
> -         (while refs
> -           (let ((ref (pop refs)))
> -             (insert "  ")
> -             (insert-button
> -              (car ref)
> -              'help-echo (cdr ref)
> -              'face 'denote-faces-link
> -              'action (lambda (_)
> -                        (funcall denote-link-button-action
> -                                 (cdr ref))))
> -             (unless refs
> -               (insert " -->"))
> -             (insert ?\n))))))))
> +             ('links denote-refs--links)
> +             ('backlinks denote-refs--backlinks))))
> +    (cond
> +     ;; There's no comment syntax in `text-mode', so just follow
> +     ;; `org-mode'.
> +     ((derived-mode-p 'org-mode 'text-mode)
> +      ;; Insert references count.
> +      (insert (if (eq refs 'not-ready)
> +               (format "# ... %s\n" (if (eq section 'links)
> +                                        "links"
> +                                      "backlinks"))
> +             (format "# %i %s%s\n" (length refs)
> +                     (if (eq section 'links)
> +                         "link"
> +                       "backlink")
> +                     (pcase (length refs)
> +                       (0 "")
> +                       (1 ":")
> +                       (_ "s:")))))
> +      ;; Insert reference list.
> +      (when (listp refs)
> +     (dolist (ref refs)
> +       (insert "#   ")
> +       (insert-button (car ref)
> +                      'help-echo (cdr ref)
> +                      'face 'denote-faces-link
> +                      'action (lambda (_)
> +                                (funcall denote-link-button-action
> +                                         (cdr ref))))
> +       ;; Could (newline) work here?
> +       (insert ?\n))))
> +     ((derived-mode-p 'markdown-mode)
> +      ;; Insert references count.
> +      (insert (if (eq refs 'not-ready)
> +               (format "<!-- ... %s -->\n" (if (eq section 'links)
> +                                               "links"
> +                                             "backlinks"))
> +             (format "<!-- %i %s%s\n" (length refs)
> +                     (if (eq section 'links)
> +                         "link"
> +                       "backlink")
> +                     (pcase (length refs)
> +                       (0 " -->")
> +                       (1 ":")
> +                       (_ "s:")))))
> +      ;; Insert reference list.
> +      (when (listp refs)
> +     (while refs
> +       (let ((ref (pop refs)))
> +         (insert "  ")
> +         (insert-button
> +          (car ref)
> +          'help-echo (cdr ref)
> +          'face 'denote-faces-link
> +          ;; This way we avoid creating a closure that ignores an
> +          ;; argument.
> +          'action #'denote-link-button-action
> +          'button-data (cdr ref))
> +         (unless refs
> +           (insert " -->"))
> +         (insert ?\n))))))))

+1.  Done.

>
>  (defun denote-refs--goto-end-of-front-matter ()
>    "Go to the end of front matter of the note."
> @@ -159,15 +161,14 @@
>      (save-excursion
>        (denote-refs--goto-end-of-front-matter)
>        (when (get-text-property (point) 'denote-refs--sections)
> -        (let ((end (or (next-single-property-change
> -                        (point) 'denote-refs--sections)
> -                       (point-max))))
> -          (when (< end (point-max))
> -            (setq end (1+ end)))
> -          (let ((mod-flag (buffer-modified-p))
> -                (inhibit-read-only t))
> -            (delete-region (point) end)
> -            (restore-buffer-modified-p mod-flag)))))))
> +     (let ((end (or (next-single-property-change
> +                     (point) 'denote-refs--sections)
> +                    (point-max)))
> +           (inhibit-read-only t))
> +       (when (< end (point-max))
> +         (setq end (1+ end)))
> +       (with-silent-modifications
> +         (delete-region (point) end)))))))
>
>  (defun denote-refs--show ()
>    "Show references."
> @@ -177,19 +178,18 @@
>      (denote-refs--remove)
>      (save-excursion
>        (denote-refs--goto-end-of-front-matter)
> -      (let ((begin (point))
> -            (mod-flag (buffer-modified-p))
> -            (inhibit-read-only t))
> -        (dolist (section denote-refs-sections)
> -          (pcase-exhaustive section
> -            ('links
> -             (denote-refs--render 'links))
> -            ('backlinks
> -             (denote-refs--render 'backlinks))))
> -        (put-text-property begin (point) 'read-only t)
> -        (put-text-property begin (point) 'denote-refs--sections t)
> -        (insert ?\n)
> -        (restore-buffer-modified-p mod-flag)))))
> +      (with-silent-modifications
> +     (let ((begin (point))
> +           (inhibit-read-only t))
> +       (dolist (section denote-refs-sections)
> +         (pcase-exhaustive section
> +           ('links
> +            (denote-refs--render 'links))
> +           ('backlinks
> +            (denote-refs--render 'backlinks))))
> +       (put-text-property begin (point) 'read-only t)
> +       (put-text-property begin (point) 'denote-refs--sections t)
> +       (insert ?\n))))))

+1.  Done.  Also got rid of the undo problem.  :)

>
>  (defun denote-refs--make-path-relative (path)
>    "Return a cons of relative and absolute version of PATH.
> @@ -203,22 +203,22 @@
>      (pcase-exhaustive section
>        ('links
>         (setq denote-refs--links
> -             (when (and (buffer-file-name)
> -                        (file-exists-p (buffer-file-name)))
> -               (mapcar #'denote-refs--make-path-relative
> -                       (denote-link--expand-identifiers
> -                        (denote--link-in-context-regexp
> -                         (denote-filetype-heuristics
> -                          (buffer-file-name))))))))
> +          (and (buffer-file-name)
> +               (file-exists-p (buffer-file-name))
> +               (mapcar #'denote-refs--make-path-relative
> +                       (denote-link--expand-identifiers
> +                        (denote--link-in-context-regexp
> +                         (denote-filetype-heuristics
> +                          (buffer-file-name))))))))
>        ('backlinks
>         (setq denote-refs--backlinks
> -             (when (and (buffer-file-name)
> -                        (file-exists-p (buffer-file-name)))
> -               (mapcar #'denote-refs--make-path-relative
> -                       (delete (buffer-file-name)
> -                               (denote--retrieve-files-in-xrefs
> -                                (denote-retrieve-filename-identifier
> -                                 (buffer-file-name)))))))))))
> +          (and (buffer-file-name)
> +               (file-exists-p (buffer-file-name))
> +               (mapcar #'denote-refs--make-path-relative
> +                       (delete (buffer-file-name)
> +                               (denote--retrieve-files-in-xrefs
> +                                (denote-retrieve-filename-identifier
> +                                 (buffer-file-name)))))))))))
>

OK.  Done.

>  (defun denote-refs-update ()
>    "Update Denote references shown."
>
> Diff finished.  Mon Dec 19 17:57:57 2022

Thanks for the information.  I guess you live somewhere at UTC+1, based
on the email timestamp and diff timestamp.

>

FYI, you missed the missing ;;;###autoload.  I just added it.

--
Akib Azmain Turja, GPG key: 70018CE5819F17A3BBA666AFE74F0EFA922AE7F5
Fediverse: akib@hostux.social
Codeberg: akib
emailselfdefense.fsf.org | "Nothing can be secure without encryption."

Attachment: signature.asc
Description: PGP signature


reply via email to

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