From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.bugs Subject: bug#5809: 23.1.94; cross-reference by anchor yields in accurate position Date: Mon, 05 Apr 2010 02:52:19 +0300 Organization: JURTA Message-ID: <87eiiuwz6g.fsf@mail.jurta.org> References: <837hoszubi.fsf@gnu.org> <87hbnwy2un.fsf@mail.jurta.org> <83y6h8xz8a.fsf@gnu.org> <8739zf5bif.fsf@mail.jurta.org> <83y6h7vy6p.fsf@gnu.org> <87y6h7uitd.fsf@mail.jurta.org> <83wrwqx6r2.fsf@gnu.org> <83vdcax5hu.fsf@gnu.org> <87d3yi85sv.fsf@mail.jurta.org> <87eiix5u1a.fsf@mail.jurta.org> <878w94dxf2.fsf@mail.jurta.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1270427241 4252 80.91.229.12 (5 Apr 2010 00:27:21 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 5 Apr 2010 00:27:21 +0000 (UTC) Cc: 5809@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Apr 05 02:27:17 2010 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Nya8w-0000VT-ME for geb-bug-gnu-emacs@m.gmane.org; Mon, 05 Apr 2010 02:27:16 +0200 Original-Received: from localhost ([127.0.0.1]:41733 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Nya8k-0006Nq-2B for geb-bug-gnu-emacs@m.gmane.org; Sun, 04 Apr 2010 20:26:06 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Nya8f-0006NB-AF for bug-gnu-emacs@gnu.org; Sun, 04 Apr 2010 20:26:01 -0400 Original-Received: from [140.186.70.92] (port=46973 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Nya8d-0006MY-NK for bug-gnu-emacs@gnu.org; Sun, 04 Apr 2010 20:26:01 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Nya8b-0000aq-PK for bug-gnu-emacs@gnu.org; Sun, 04 Apr 2010 20:25:59 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:47929) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Nya8b-0000am-LC for bug-gnu-emacs@gnu.org; Sun, 04 Apr 2010 20:25:57 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1NyZmQ-00030z-Px; Sun, 04 Apr 2010 20:03:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Juri Linkov Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: owner@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 05 Apr 2010 00:03:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 5809 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 5809-submit@debbugs.gnu.org id=B5809.127042572711571 (code B ref 5809); Mon, 05 Apr 2010 00:03:02 +0000 Original-Received: (at 5809) by debbugs.gnu.org; 5 Apr 2010 00:02:07 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NyZlW-00030X-P8 for submit@debbugs.gnu.org; Sun, 04 Apr 2010 20:02:07 -0400 Original-Received: from smtp-out1.starman.ee ([85.253.0.3] helo=mx1.starman.ee) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NyZlU-000306-Id for 5809@debbugs.gnu.org; Sun, 04 Apr 2010 20:02:05 -0400 X-Virus-Scanned: by Amavisd-New at mx1.starman.ee Original-Received: from mail.starman.ee (82.131.69.202.cable.starman.ee [82.131.69.202]) by mx1.starman.ee (Postfix) with ESMTP id EC4AF3F40A5; Mon, 5 Apr 2010 03:01:54 +0300 (EEST) In-Reply-To: (Stefan Monnier's message of "Sun, 04 Apr 2010 10:31:51 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (x86_64-pc-linux-gnu) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Sun, 04 Apr 2010 20:03:02 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:35933 Archived-At: >> There are still a problem. I can't find a way to move the cursor >> inside the overlay's after-string and click links inside it. > > That's what I said would be the limitation: you can't "click" with > the keyboard. I think it's an acceptable limitation for now. > Also you can't copy&paste the string (e.g. to make a bug report). We could change the background color of the overlay's after-string to look like the header line (grey background) so users will expect that only mouse clicks should work on grey areas. This patch works with mouse clicks, but needs more testing: === modified file 'lisp/info.el' --- lisp/info.el 2010-03-03 19:23:20 +0000 +++ lisp/info.el 2010-04-04 23:50:03 +0000 @@ -153,12 +153,12 @@ (defcustom Info-use-header-line t :group 'info) (defface info-header-xref - '((t :inherit info-xref)) + '((t :inherit (info-xref header-line))) "Face for Info cross-references in a node header." :group 'info) (defface info-header-node - '((t :inherit info-node)) + '((t :inherit (info-node header-line))) "Face for Info nodes in a node header." :group 'info) @@ -1053,8 +1053,6 @@ (defun Info-find-node-2 (filename nodena (Info-select-node) (goto-char (point-min)) (forward-line 1) ; skip header line - (when (> Info-breadcrumbs-depth 0) ; skip breadcrumbs line - (forward-line 1)) (cond (anchorpos (let ((new-history (list Info-current-file @@ -3551,6 +3549,19 @@ (defun Info-try-follow-nearest-node (&op ((setq node (Info-get-token (point) "Prev: " "Prev: \\([^,\n\t]*\\)")) (Info-goto-node node fork))) node)) + +(defun Info-mouse-follow-link (click) + "Follow a link under point." + (interactive "e") + (let* ((position (event-start click)) + (posn-string (and position (posn-string position))) + (string (car-safe posn-string)) + (string-pos (cdr-safe posn-string)) + (link-args (and string string-pos + (get-text-property string-pos 'link-args string)))) + (when link-args + (Info-goto-node link-args)))) + (defvar Info-mode-map (let ((map (make-keymap))) @@ -4141,11 +4152,22 @@ (defvar Info-up-link-keymap keymap) "Keymap to put on the Up link in the text or the header line.") -(defun Info-insert-breadcrumbs () +(defvar Info-link-keymap + (let ((keymap (make-sparse-keymap))) + (define-key keymap [header-line mouse-1] 'Info-mouse-follow-link) + (define-key keymap [header-line mouse-2] 'Info-mouse-follow-link) + (define-key keymap [header-line down-mouse-1] 'ignore) + (define-key keymap [mouse-2] 'Info-mouse-follow-link) + (define-key keymap [follow-link] 'mouse-face) + keymap) + "Keymap to put on the link in the text or the header line.") + +(defun Info-breadcrumbs () (let ((nodes (Info-toc-nodes Info-current-file)) (node Info-current-node) (crumbs ()) - (depth Info-breadcrumbs-depth)) + (depth Info-breadcrumbs-depth) + line) ;; Get ancestors from the cached parent-children node info (while (and (not (equal "Top" node)) (> depth 0)) @@ -4172,15 +4194,24 @@ (defun Info-insert-breadcrumbs () (file-name-nondirectory Info-current-file) ;; Some legacy code can still use a symbol. Info-current-file))))) - (insert (if (bolp) "" " > ") - (cond - ((null node) "...") - ((equal node Info-current-node) - ;; No point linking to ourselves. - (propertize text 'font-lock-face 'info-header-node)) - (t - (concat "*Note " text "::")))))) - (insert "\n")))) + (setq line (concat + line + (if (null line) "" (propertize " > " 'face 'header-line)) + (cond + ((null node) (propertize "..." 'face 'header-line)) + ((equal node Info-current-node) + ;; No point linking to ourselves. + (propertize text 'font-lock-face 'info-header-node)) + (t + (propertize text + 'mouse-face 'highlight + 'font-lock-face 'info-header-xref + 'help-echo "mouse-2: Go to node" + 'keymap Info-link-keymap + 'link-args text) + )))))) + (setq line (concat line (propertize "\n" 'face 'header-line)))) + line)) (defun Info-fontify-node () "Fontify the node." @@ -4227,9 +4258,6 @@ (defun Info-fontify-node () ((string-equal (downcase tag) "next") Info-next-link-keymap) ((string-equal (downcase tag) "up" ) Info-up-link-keymap)))))) - (when (> Info-breadcrumbs-depth 0) - (Info-insert-breadcrumbs)) - ;; Treat header line. (when Info-use-header-line (goto-char (point-min)) @@ -4260,7 +4288,10 @@ (defun Info-fontify-node () ;; that is in the header, if it is just part. (cond ((> Info-breadcrumbs-depth 0) - (put-text-property (point-min) (1+ header-end) 'invisible t)) + (put-text-property (point-min) (1+ header-end) 'invisible t) + (overlay-put + (make-overlay header-end (1+ header-end)) + 'after-string (Info-breadcrumbs))) ((not (bobp)) ;; Hide the punctuation at the end, too. (skip-chars-backward " \t,") -- Juri Linkov http://www.jurta.org/emacs/