emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Richard Kim <emacs18@gmail.com>
To: Richard Kim <emacs18@gmail.com>, Emacs-orgmode@gnu.org
Subject: Re: patch to add new link type "infoi" that leverages Info-index command
Date: Sun, 9 Nov 2014 19:58:40 -0800	[thread overview]
Message-ID: <CAFq8O8sWXQ93irE+S1o1oWa-PVGhPe_DB-a=eFsfgUWCx_QZCw@mail.gmail.com> (raw)
In-Reply-To: <87k338qii9.fsf@nicolasgoaziou.fr>


[-- Attachment #1.1: Type: text/plain, Size: 3476 bytes --]

Nicolas,

Thanks for your feedback.  I agree that using the same link type is better.
Hence I took an alternate approach as detailed in the attached patch.
 Enhanced org-info-follow-link to attempt index lookup if node lookup fails.
Following is my check in message found in the attached patch:

    Enhanced org-info-follow-link to attempt index lookup if node lookup
fails.

    Info index is almost always finer grain than info nodes.  For example
    with this change, [[info:libc#close]] brings up not only
    "(libc)Opening and Closing Files" info node, but also place the cursor
    on the line that documents "close" function within the node.  This is
    done by looking up "close"in the index upon failing to find a node
    named "close".  Hence one can now link function, variable and other
    names that are in the index rather than being limited to info node
    names.  Typically there are far more index items than there are node
    names.  For example libc manual has about 700 nodes, but over
    4000 concept, type, function, and variables index items.



On 6 November 2014 10:41, Nicolas Goaziou <mail@nicolasgoaziou.fr> wrote:

> Hello,
>
> Richard Kim <emacs18@gmail.com> writes:
>
> > A patch is provided below which implements a new link type called "infoi"
> > as a complement to "info" type that exist already.
>
> Thanks for your patch.
>
> > Why new link type?  Because info index is almost always finer grain
> > than info nodes.  For example [[infoi:libc#close]] brings up not only
> > "(libc)Opening and Closing Files" info node, but also place the cursor
> > on the line that documents "open" function within the node.  Hence it
> > is more useful to link function, variable and other names that are in
> > the index.  Most info documents have very rich indexes.
>
> OK. I would have preferred to merge both features into the same link
> type, but I see no elegant syntax to distinguish between a node and an
> index search.
>
> > I am not familiar with org coding style, so I share this patch to
> > present the idea rather than as a finished patch that can be checked
> > in.  I assume that name changes and other changes will be needed prior
> > to being acceptable for check in assuming that the idea is ok.
>
> The idea is OK. Some comments follow.
>
> > org-info.el: Add new link type "infoi" that looks up info file index.
>
> No full stop at the end of the summary.
>
> > * lisp/org-info.el (org-info-index-open): New function to implement
> > new link type named "infoi".
>
> "New function" is enough here.
>
> You can describe the motivation behind the patch farther in the commit
> message, after another blank line.
>
> > +;;; info-index
> > +
> > +(org-add-link-type "infoi" 'org-info-index-open)
> > +
> > +(declare-function Info-index "info" (topic))
> > +
> > +(defun org-info-index-open (name)
> > +  "Follow an Info file and look up index item specified by NAME."
> > +  (if (or (string-match "\\(.*\\)[#:]:?\\(.*\\)" name)
> > +          (string-match "\\(.*\\)" name))
> > +      (let ((nodename (match-string 2 name)))
> > +    (require 'info)
> > +    (Info-find-node (match-string 1 name) "Top")
> > +        (if nodename ; If there isn't a node, choose "Top"
> > +            (Info-index nodename)))
>
> Prefer `when' over one-armed `if'.
>
> > +    (message "Could not open: %s" name)))
>
> This introduce some code duplication in "org-info.el". Could you factor
> it out?
>
>
> Regards,
>
> --
> Nicolas Goaziou
>

[-- Attachment #1.2: Type: text/html, Size: 4740 bytes --]

[-- Attachment #2: 0001-Enhanced-org-info-follow-link-to-attempt-index-looku.patch --]
[-- Type: text/x-patch, Size: 2831 bytes --]

From c850804267f343d020f91499e18cbde84a3fb897 Mon Sep 17 00:00:00 2001
From: Kim <emacs18@gmail.com>
Date: Sun, 9 Nov 2014 19:43:18 -0800
Subject: [PATCH] Enhanced org-info-follow-link to attempt index lookup if node
 lookup fails.

Info index is almost always finer grain than info nodes.  For example
with this change, [[info:libc#close]] brings up not only
"(libc)Opening and Closing Files" info node, but also place the cursor
on the line that documents "close" function within the node.  This is
done by looking up "close"in the index upon failing to find a node
named "close".  Hence one can now link function, variable and other
names that are in the index rather than being limited to info node
names.  Typically there are far more index items than there are node
names.  For example libc manual has about 700 nodes, but over
4000 concept, type, function, and variables index items.
---
 doc/org.texi     |  2 +-
 lisp/org-info.el | 15 +++++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/doc/org.texi b/doc/org.texi
index db1490a..08e071d 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -3575,7 +3575,7 @@ gnus:group                                @r{Gnus group link}
 gnus:group#id                             @r{Gnus article link}
 bbdb:R.*Stallman                          @r{BBDB link (with regexp)}
 irc:/irc.com/#emacs/bob                   @r{IRC link}
-info:org#External links                   @r{Info node link}
+info:org#External links                   @r{Info node or index link}
 shell:ls *.org                            @r{A shell command}
 elisp:org-agenda                          @r{Interactive Elisp command}
 elisp:(find-file-other-frame "Elisp.org") @r{Elisp form to evaluate}
diff --git a/lisp/org-info.el b/lisp/org-info.el
index 8a2d717..7deaa33 100644
--- a/lisp/org-info.el
+++ b/lisp/org-info.el
@@ -67,11 +67,18 @@
   "Follow an Info file and node link specified by NAME."
   (if (or (string-match "\\(.*\\)[#:]:?\\(.*\\)" name)
           (string-match "\\(.*\\)" name))
-      (progn
+      (let ((filename (match-string 1 name))
+	    (nodename-or-index (or (match-string 2 name) "Top")))
 	(require 'info)
-        (if (match-string 2 name) ; If there isn't a node, choose "Top"
-            (Info-find-node (match-string 1 name) (match-string 2 name))
-          (Info-find-node (match-string 1 name) "Top")))
+	;; If nodename-or-index is invalid node name, then look it
+	;; up in the index.
+	(condition-case nil
+	    (Info-find-node filename nodename-or-index)
+	  (user-error (Info-find-node filename "Top")
+		      (condition-case nil
+			  (Info-index nodename-or-index)
+			(user-error (message "Could not find '%s' node or index entry." 
+					     nodename-or-index))))))
     (message "Could not open: %s" name)))
 
 (provide 'org-info)
-- 
1.9.1


  reply	other threads:[~2014-11-10  3:58 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-01 18:23 patch to add new link type "infoi" that leverages Info-index command Richard Kim
2014-11-06 18:41 ` Nicolas Goaziou
2014-11-10  3:58   ` Richard Kim [this message]
2014-11-10  9:17     ` Nicolas Goaziou
2014-11-15 18:46       ` Richard Y. Kim
2014-11-15 23:21         ` Nicolas Goaziou

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.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFq8O8sWXQ93irE+S1o1oWa-PVGhPe_DB-a=eFsfgUWCx_QZCw@mail.gmail.com' \
    --to=emacs18@gmail.com \
    --cc=Emacs-orgmode@gnu.org \
    /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/org-mode.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).