all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#34052: 27.0.50; New command gnus-summary-press-button
@ 2019-01-12 21:59 Eric Abrahamsen
       [not found] ` <handler.34052.B.154733083721114.ack@debbugs.gnu.org>
  0 siblings, 1 reply; 15+ messages in thread
From: Eric Abrahamsen @ 2019-01-12 21:59 UTC (permalink / raw)
  To: 34052

[-- 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


^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-06-23 17:31 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-01-12 21:59 bug#34052: 27.0.50; New command gnus-summary-press-button Eric Abrahamsen
     [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

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.