diff --git a/ace-link.el b/ace-link.el index a33a990..102550d 100644 --- a/ace-link.el +++ b/ace-link.el @@ -64,7 +64,7 @@ ((or (member major-mode '(compilation-mode grep-mode)) (bound-and-true-p compilation-shell-minor-mode)) (ace-link-compilation)) - ((eq major-mode 'gnus-article-mode) + ((memq major-mode '(gnus-article-mode gnus-summary-mode)) (ace-link-gnus)) ((eq major-mode 'mu4e-view-mode) (ace-link-mu4e)) @@ -409,45 +409,62 @@ If EXTERNAL is double prefix, browse in new buffer." (declare-function compile-goto-error "compile") ;;* `ace-link-gnus' +(defvar gnus-article-buffer) +(defvar mm-text-html-renderer) +(declare-function gnus-article-press-button "gnus-art") +(declare-function gnus-get-buffer-window "gnus-win") +(declare-function widget-button-press "wid-edit") +(declare-function widget-forward "wid-edit") + ;;;###autoload (defun ace-link-gnus () "Open a visible link in a `gnus-article-mode' buffer." (interactive) - (when (eq major-mode 'gnus-summary-mode) - (gnus-summary-widget-forward 1)) - (let ((pt (avy-with ace-link-gnus - (avy-process - (ace-link--gnus-collect) - (avy--style-fn avy-style))))) - (ace-link--gnus-action pt))) + (save-selected-window + (when (eq major-mode 'gnus-summary-mode) + (if-let ((win (gnus-get-buffer-window gnus-article-buffer 'visible))) + (progn + (select-window win) + (select-frame-set-input-focus (window-frame win))) + (user-error "No article window found"))) + (let ((pt (avy-with ace-link-gnus + (avy-process + (ace-link--gnus-collect) + (avy--style-fn avy-style))))) + (ace-link--gnus-action pt)))) (defun ace-link--gnus-action (pt) (when (number-or-marker-p pt) (goto-char (1+ pt)) - (widget-button-press (point)))) - -(declare-function widget-forward "wid-edit") -(declare-function gnus-summary-widget-forward "gnus-sum") -(declare-function widget-button-press "wid-edit") + (cond ((< emacs-major-version 27) + (widget-button-press (point))) + ((and (eq mm-text-html-renderer 'shr) + (get-text-property (point) 'shr-url)) + (shr-browse-url)) + ((get-text-property (point) 'gnus-callback) + (gnus-article-press-button)) + (t (push-button))))) (defun ace-link--gnus-collect () "Collect the positions of visible links in the current gnus buffer." - (require 'wid-edit) - (let (candidates pt) - (save-excursion - (save-restriction - (narrow-to-region - (window-start) - (window-end)) - (goto-char (point-min)) - (setq pt (point)) - (while (progn (widget-forward 1) - (> (point) pt)) + (if (<= 27 emacs-major-version) + (mapcar #'cdr (ace-link--woman-collect)) + (require 'wid-edit) + (let (candidates pt) + (save-excursion + (save-restriction + (narrow-to-region + (window-start) + (window-end)) + (goto-char (point-min)) (setq pt (point)) - (when (or (plist-get (text-properties-at (point)) 'gnus-string) - (plist-get (text-properties-at (point)) 'shr-url)) - (push (point) candidates))) - (nreverse candidates))))) + (while (progn (widget-forward 1) + (> (point) pt)) + (setq pt (point)) + (when (or (plist-get (text-properties-at (point)) 'gnus-string) + (plist-get (text-properties-at (point)) 'shr-url)) + (push (point) candidates))) + (nreverse candidates)))))) ;;* Helper functions for `ace-link-mu4e' and `ace-link-notmuch' (defun ace-link--email-view-plain-collect ()