From 5602a53a2c1b65a22fcf055e4aae6080e4134905 Mon Sep 17 00:00:00 2001 From: Deniz Dogan Date: Wed, 5 Dec 2012 17:45:37 +0100 Subject: [PATCH] * lisp/net/rcirc.el (rcirc-urls): Update documentation. (rcirc-condition-filter): New function. (rcirc-browse-url, rcirc-markup-urls): Use only URLs before point and exclude consecutive duplicate URLs. Fixes: debbugs:6082 --- lisp/ChangeLog | 7 +++++++ lisp/net/rcirc.el | 34 ++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cbc0e743183..c2e9609451c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2012-12-05 Deniz Dogan + + * net/rcirc.el (rcirc-urls): Update documentation. + (rcirc-condition-filter): New function. + (rcirc-browse-url, rcirc-markup-urls): Use only URLs before point + and exclude consecutive duplicate URLs (Bug#6082). + 2012-12-05 Michael Albinus * net/tramp-sh.el (tramp-do-copy-or-rename-file-out-of-band): diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el index e9828c5f813..fa5bc4a9822 100644 --- a/lisp/net/rcirc.el +++ b/lisp/net/rcirc.el @@ -406,7 +406,8 @@ will be killed." "The channel or user associated with this buffer.") (defvar rcirc-urls nil - "List of urls seen in the current buffer.") + "List of URLs seen in the current buffer and the position in +the buffer where the URL starts.") (put 'rcirc-urls 'permanent-local t) (defvar rcirc-timeout-seconds 600 @@ -2392,12 +2393,23 @@ keywords when no KEYWORD is given." "\\)") "Regexp matching URLs. Set to nil to disable URL features in rcirc.") +(defun rcirc-condition-filter (condp lst) + "Given a condition and a list, returns the list with elements +that do not satisfy the condition removed." + (delq nil (mapcar (lambda (x) (and (funcall condp x) x)) lst))) + (defun rcirc-browse-url (&optional arg) - "Prompt for URL to browse based on URLs in buffer." + "Prompt for URL to browse based on URLs in buffer before point. + +If ARG is given, opens the URL in a new browser window." (interactive "P") - (let ((completions (mapcar (lambda (x) (cons x nil)) rcirc-urls)) - (initial-input (car rcirc-urls)) - (history (cdr rcirc-urls))) + (let* ((point (point)) + (filtered (rcirc-condition-filter + (lambda (x) (>= point (cdr x))) + rcirc-urls)) + (completions (mapcar (lambda (x) (car x)) filtered)) + (initial-input (caar filtered)) + (history (mapcar (lambda (x) (car x)) (cdr filtered)))) (browse-url (completing-read "rcirc browse-url: " completions nil nil initial-input 'history) arg))) @@ -2441,17 +2453,19 @@ keywords when no KEYWORD is given." (defun rcirc-markup-urls (sender response) (while (and rcirc-url-regexp ;; nil means disable URL catching (re-search-forward rcirc-url-regexp nil t)) - (let ((start (match-beginning 0)) - (end (match-end 0)) - (url (match-string-no-properties 0))) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (url (match-string-no-properties 0)) + (link-text (buffer-substring-no-properties start end))) (make-button start end 'face 'rcirc-url 'follow-link t 'rcirc-url url 'action (lambda (button) (browse-url (button-get button 'rcirc-url)))) - ;; record the url - (push url rcirc-urls)))) + ;; record the url if it is not already the latest stored url + (when (not (string= link-text (caar rcirc-urls))) + (push (cons link-text start) rcirc-urls))))) (defun rcirc-markup-keywords (sender response) (when (and (string= response "PRIVMSG") -- 2.39.5