From: Eric Abrahamsen <eric@ericabrahamsen.net>
To: 34052@debbugs.gnu.org
Subject: bug#34052: 27.0.50; New command gnus-summary-press-button
Date: Sat, 12 Jan 2019 13:59:01 -0800 [thread overview]
Message-ID: <87tvidbkre.fsf@ericabrahamsen.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 463 bytes --]
The attached patch adds a new Gnus summary buffer command, that clicks a
link in the article buffer. Technically, it calls `widget-button-press'
on one of the widgets in the article buffer, offering completion if
there's more than one. I'm not sure I've handled all the possible values
of the 'gnus-data text property, but more would be easy to add.
Basically this just lets you follow a link without actually moving point
or the mouse into the article buffer.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-New-command-gnus-summary-press-button.patch --]
[-- Type: text/x-patch, Size: 4327 bytes --]
From 3f85945b445fe5871fe14b0b5f4a337ac3e64b9b Mon Sep 17 00:00:00 2001
From: Eric Abrahamsen <eric@ericabrahamsen.net>
Date: Sat, 12 Jan 2019 13:44:23 -0800
Subject: [PATCH] New command gnus-summary-press-button
* lisp/gnus/gnus-sum.el (gnus-summary-press-button): Summary buffer
command to press a button in the article buffer. Uses completion to
choose one of the buttons.
* doc/misc/gnus.texi (Article Commands): Document.
---
doc/misc/gnus.texi | 11 ++++++++
lisp/gnus/gnus-sum.el | 63 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 2862264312..de7291b2a9 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -10156,6 +10156,17 @@ Article Commands
the @kbd{A C} command (@code{gnus-summary-show-complete-article}) will
do so.
+@item A l
+@cindex buttons
+@findex gnus-summary-press-button
+@kindex A l @r{(Summary)}
+Press one of the button widgets in the article buffer. This behaves
+as if the user had navigated into the article buffer and pressed
+@key{RET} on a widget. If there is more than one button widget, the
+button text is used for completion. With a prefix arg, allow
+selection of buttons in the message headers, in addition to the
+message body.
+
@end table
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 911bf89f23..d765c67492 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -2101,6 +2101,7 @@ gnus-article-commands-menu
"g" gnus-summary-show-article
"s" gnus-summary-isearch-article
"\t" gnus-summary-widget-forward
+ "l" gnus-summary-press-button
[backtab] gnus-summary-widget-backward
"P" gnus-summary-print-article
"S" gnus-sticky-article
@@ -9368,6 +9369,68 @@ gnus-summary-widget-backward
(goto-char (point-max)))
(widget-backward arg))
+(defun gnus-summary-press-button (arg)
+ "From the *Summary* buffer, \"press\" an article button.
+With prefix ARG, offer buttons in the message headers as well as
+body.
+
+If only one button is found, press that directly, otherwise use
+completion to select a button. Buttons are pressed using
+`widget-button-press'."
+ (interactive "P")
+ (let ((opened (and (gnus-buffer-live-p gnus-article-buffer)
+ (get-buffer-window gnus-article-buffer t)
+ ;; We might have opened an article, but then moved to
+ ;; a different summary line.
+ (= gnus-current-article (gnus-summary-article-number))))
+ pt urls target)
+ (unless opened
+ (gnus-summary-select-article)
+ (gnus-configure-windows 'article))
+ (gnus-with-article-buffer
+ (if arg
+ (goto-char (point-min))
+ (article-goto-body)
+ ;; Back up a char, in case body starts with a widget.
+ (backward-char))
+ (setq pt (point))
+ (while (progn (widget-forward 1)
+ (> (point) pt))
+ (setq pt (point))
+ (when-let ((u (cond
+ ((get-text-property (point) 'shr-url))
+ ((get-text-property (point) 'gnus-string))
+ ((let ((dat (get-text-property (point) 'gnus-data)))
+ (pcase dat
+ ('nil nil)
+ ((and (pred (stringp) (pred (string= ">"))))
+ (buffer-substring (line-beginning-position)
+ (line-end-position)))
+ ;; Does a marker always signify the
+ ;; signature? We may never know.
+ ((pred (markerp))
+ "<signature>")
+ ;; There are more weird cases, add as
+ ;; necessary.
+ (_ dat)))))))
+ (push (cons u pt) urls)))
+ (setq target
+ (assoc (cond ((= (length urls) 1)
+ (caar urls))
+ ((> (length urls) 1)
+ (completing-read "URL to browse: "
+ (delete-dups urls) nil t)))
+ urls))
+ (if target
+ (funcall-interactively #'widget-button-press (1+ (cdr target)))
+ (message "No URLs found.")))
+ ;; Now what? If we're not in the *Summary* buffer anymore (i.e.,
+ ;; pressing the button created a new buffer), do nothing.
+ ;; Otherwise, if the article wasn't opened to begin with, close it
+ ;; after we follow the link.
+ (when (get-buffer-window gnus-summary-buffer)
+ (gnus-summary-expand-window opened))))
+
(defun gnus-summary-isearch-article (&optional regexp-p)
"Do incremental search forward on the current article.
If REGEXP-P (the prefix) is non-nil, do regexp isearch."
--
2.20.1
next reply other threads:[~2019-01-12 21:59 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-12 21:59 Eric Abrahamsen [this message]
[not found] ` <handler.34052.B.154733083721114.ack@debbugs.gnu.org>
2019-01-30 21:31 ` bug#34052: Acknowledgement (27.0.50; New command gnus-summary-press-button) Eric Abrahamsen
2019-06-22 13:10 ` Lars Ingebrigtsen
2019-06-22 16:38 ` Eric Abrahamsen
2019-06-23 12:16 ` Lars Ingebrigtsen
2019-06-23 15:30 ` Eric Abrahamsen
2019-06-23 15:32 ` Lars Ingebrigtsen
2019-06-23 15:59 ` Eric Abrahamsen
2019-06-23 16:17 ` Lars Ingebrigtsen
2019-06-23 16:37 ` Eric Abrahamsen
2019-06-23 16:50 ` Lars Ingebrigtsen
2019-06-23 17:06 ` Eric Abrahamsen
2019-06-23 17:09 ` Lars Ingebrigtsen
2019-06-23 17:31 ` Eric Abrahamsen
2019-06-23 17:07 ` Eric Abrahamsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87tvidbkre.fsf@ericabrahamsen.net \
--to=eric@ericabrahamsen.net \
--cc=34052@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.