A patch is provided below which implements a new link type called "infoi"
as a complement to "info" type that exist already.
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.
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.
ChangeLog entry is followed by the git diff of my change.
--------------------------------------------------------------------------------
org-info.el: Add new link type "infoi" that looks up info file index.
* lisp/org-info.el (org-info-index-open): New function to implement
new link type named "infoi".
--------------------------------------------------------------------------------
diff --git a/doc/org.texi b/doc/org.texi
index 3fcf4b2..3aedefe 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -3576,6 +3576,7 @@ 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}
+infoi:org#topic @r{Info 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..bb65347 100644
--- a/lisp/org-info.el
+++ b/lisp/org-info.el
@@ -74,6 +74,23 @@
(Info-find-node (match-string 1 name) "Top")))
(message "Could not open: %s" name)))
+;;; 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)))
+ (message "Could not open: %s" name)))
+
(provide 'org-info)
;;; org-info.el ends here