From: Juri Linkov <juri@jurta.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: 5809@debbugs.gnu.org
Subject: bug#5809: 23.1.94; cross-reference by anchor yields in accurate position
Date: Sun, 04 Apr 2010 01:04:45 +0300 [thread overview]
Message-ID: <878w94dxf2.fsf@mail.jurta.org> (raw)
In-Reply-To: <87eiix5u1a.fsf@mail.jurta.org> (Juri Linkov's message of "Sat, 03 Apr 2010 02:11:45 +0300")
>> IOW, using an after-string would probably be an OK compromise for 23.2
>> (better than dropping breadcrumbs altogether).
>
> I'll try to implement an after-string for 23.2.
To be able to click on links that are not part of the Info file
and don't have the "*Note" format, this patch adds two new commands
`Info-mouse-follow-link' and `Info-follow-link' plus a new keymap
`Info-link-keymap' (it's like `Info-up-link-keymap' and friends).
`Info-insert-breadcrumbs' is renamed to `Info-breadcrumbs'
that returns a string with links.
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.
Any suggestions?
=== modified file 'lisp/info.el'
--- lisp/info.el 2010-03-03 19:23:20 +0000
+++ lisp/info.el 2010-04-03 22:03:23 +0000
@@ -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,20 @@ (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")
+ (mouse-set-point click)
+ (Info-follow-link))
+
+(defun Info-follow-link ()
+ "Follow a link under point."
+ (interactive)
+ (let ((link-args (get-text-property (point) 'link-args)))
+ (when link-args
+ (Info-goto-node link-args))))
+
\f
(defvar Info-mode-map
(let ((map (make-keymap)))
@@ -4141,11 +4153,23 @@ (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)
+ (define-key keymap "\r" 'Info-follow-link)
+ 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 +4196,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) "" " > ")
+ (cond
+ ((null node) "...")
+ ((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 "\n")))
+ line))
(defun Info-fontify-node ()
"Fontify the node."
@@ -4227,8 +4260,8 @@ (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))
+ ;; (when (> Info-breadcrumbs-depth 0)
+ ;; (insert (Info-breadcrumbs)))
;; Treat header line.
(when Info-use-header-line
@@ -4260,7 +4293,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 (propertize (Info-breadcrumbs) 'cursor t)))
((not (bobp))
;; Hide the punctuation at the end, too.
(skip-chars-backward " \t,")
--
Juri Linkov
http://www.jurta.org/emacs/
next prev parent reply other threads:[~2010-04-03 22:04 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-31 9:58 bug#5809: 23.1.94; cross-reference by anchor yields in accurate position Eli Zaretskii
2010-03-31 11:17 ` Eli Zaretskii
2010-03-31 15:08 ` Juri Linkov
2010-03-31 15:55 ` Eli Zaretskii
2010-04-01 18:06 ` Juri Linkov
2010-04-01 18:13 ` Eli Zaretskii
2010-04-01 18:30 ` Juri Linkov
2010-04-01 20:22 ` Eli Zaretskii
2010-04-01 20:49 ` Eli Zaretskii
2010-04-01 21:10 ` Juri Linkov
2010-04-01 22:16 ` Stefan Monnier
2010-04-02 7:07 ` Eli Zaretskii
2010-04-02 14:17 ` Drew Adams
2010-04-02 14:39 ` Eli Zaretskii
2010-04-02 15:26 ` Drew Adams
2010-04-04 20:39 ` Drew Adams
2010-04-04 20:47 ` Eli Zaretskii
2010-04-04 22:51 ` Drew Adams
2010-04-04 23:58 ` Juri Linkov
2010-04-05 7:01 ` Drew Adams
2010-04-05 16:42 ` Juri Linkov
2010-04-05 20:11 ` Stefan Monnier
2010-04-05 23:17 ` Drew Adams
2010-04-06 5:49 ` Drew Adams
2010-04-06 17:46 ` Drew Adams
2010-04-05 16:45 ` Juri Linkov
2010-04-05 17:12 ` Drew Adams
2010-04-05 21:55 ` Eli Zaretskii
2010-04-05 6:38 ` Drew Adams
2010-04-02 16:14 ` Juri Linkov
2010-04-02 16:31 ` Drew Adams
2010-04-02 17:41 ` Eli Zaretskii
2010-04-02 18:01 ` Stefan Monnier
2010-04-02 23:11 ` Juri Linkov
2010-04-03 22:04 ` Juri Linkov [this message]
2010-04-04 6:12 ` Eli Zaretskii
2010-04-04 11:07 ` Juri Linkov
2010-04-04 12:12 ` Eli Zaretskii
2010-04-04 23:51 ` Juri Linkov
2010-04-05 5:26 ` Eli Zaretskii
2010-04-04 14:31 ` Stefan Monnier
2010-04-04 23:52 ` Juri Linkov
2010-04-05 2:06 ` Stefan Monnier
2010-04-05 16:50 ` Juri Linkov
2010-04-05 20:09 ` Stefan Monnier
2010-04-05 22:17 ` Juri Linkov
2010-04-01 21:09 ` Juri Linkov
2010-04-02 18:03 ` Stefan Monnier
2010-04-25 18:28 ` Chong Yidong
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878w94dxf2.fsf@mail.jurta.org \
--to=juri@jurta.org \
--cc=5809@debbugs.gnu.org \
--cc=monnier@iro.umontreal.ca \
/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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).