GNU bug report logs -
#12456
24.2.50; Completion in `Info-goto-node' (cross-manual jump)
Previous Next
Reported by: Dani Moncayo <dmoncayo <at> gmail.com>
Date: Sun, 16 Sep 2012 18:01:02 UTC
Severity: normal
Found in version 24.2.50
Fixed in version 24.3.50
Done: Juri Linkov <juri <at> jurta.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 12456 in the body.
You can then email your comments to 12456 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Sun, 16 Sep 2012 18:01:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Dani Moncayo <dmoncayo <at> gmail.com>
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Sun, 16 Sep 2012 18:01:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
Recipe from emacs -Q: C-h r g ( e l i s p ) n n <TAB>
When I do it, I see in the echo area the message "[Complete, but not
unique]", which is wrong, as the elisp manual has no node called (nor
beggining with) "nn".
OTOH, if I repeat the experiment but this time with "(elisp)num",
Emacs says the same message (this time is right), but a second <TAB>
produces the message "[No completions]", which is wrong, as there is 3
nodes in the elisp manual whose names start with "num".
In GNU Emacs 24.2.50.1 (i386-mingw-nt6.1.7601)
of 2012-09-16 on DANI-PC
Bzr revision: 110047 handa <at> gnu.org-20120916114848-0p2g6uqosfsrx682
Windowing system distributor `Microsoft Corp.', version 6.1.7601
Configured using:
`configure --with-gcc (4.7) --no-opt --enable-checking --cflags
-I../../libs/libxpm-3.5.8/include -I../../libs/libxpm-3.5.8/src
-I../../libs/libpng-1.4.10 -I../../libs/zlib-1.2.6
-I../../libs/giflib-4.1.4-1/include -I../../libs/jpeg-6b-4/include
-I../../libs/tiff-3.8.2-1/include
-I../../libs/libxml2-2.7.8-w32-bin/include/libxml2
-I../../libs/gnutls-3.0.16/include
-I../../libs/libiconv-1.14-2-mingw32-dev/include'
Important settings:
value of $LANG: ESN
locale-coding-system: cp1252
default enable-multibyte-characters: t
--
Dani Moncayo
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Sun, 16 Sep 2012 19:41:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> Recipe from emacs -Q: C-h r g ( e l i s p ) n n <TAB>
>
> When I do it, I see in the echo area the message "[Complete, but not
> unique]", which is wrong, as the elisp manual has no node called (nor
> beggining with) "nn".
>
> OTOH, if I repeat the experiment but this time with "(elisp)num",
> Emacs says the same message (this time is right), but a second <TAB>
^^^^^^^^^^^^^^^^^^
Actually this is wrong too, as "(elisp)num" is not _complete_ (besides
not being unique).
> produces the message "[No completions]", which is wrong, as there is 3
> nodes in the elisp manual whose names start with "num".
--
Dani Moncayo
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Mon, 17 Sep 2012 21:14:01 GMT)
Full text and
rfc822 format available.
Message #11 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> Recipe from emacs -Q: C-h r g ( e l i s p ) n n <TAB>
> When I do it, I see in the echo area the message "[Complete, but not
> unique]", which is wrong, as the elisp manual has no node called (nor
> beggining with) "nn".
> OTOH, if I repeat the experiment but this time with "(elisp)num",
> Emacs says the same message (this time is right), but a second <TAB>
> produces the message "[No completions]", which is wrong, as there is 3
> nodes in the elisp manual whose names start with "num".
IIRC the core of the problem is that Info's completion table does not
(yet) know how to do completion after something like "(elisp)", so it
basically returns some "dummy" completion data (because the way
completion tables are defined currently, they have no way to say "I
don't know").
So there are 2 ways to fix the above problem:
- Extend minibuffer.el so a completion table return "don't know" (at
which point it could put a message like " [No completion info]").
- Extend info.el so that it does provide actual completion by opening up
the "elisp" info file and gathering the corresponding node names.
Stefan
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Tue, 18 Sep 2012 06:25:02 GMT)
Full text and
rfc822 format available.
Message #14 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> From: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
> Date: Mon, 17 Sep 2012 17:12:10 -0400
> Cc: 12456 <at> debbugs.gnu.org
>
> > Recipe from emacs -Q: C-h r g ( e l i s p ) n n <TAB>
> > When I do it, I see in the echo area the message "[Complete, but not
> > unique]", which is wrong, as the elisp manual has no node called (nor
> > beggining with) "nn".
> > OTOH, if I repeat the experiment but this time with "(elisp)num",
> > Emacs says the same message (this time is right), but a second <TAB>
> > produces the message "[No completions]", which is wrong, as there is 3
> > nodes in the elisp manual whose names start with "num".
>
> IIRC the core of the problem is that Info's completion table does not
> (yet) know how to do completion after something like "(elisp)", so it
> basically returns some "dummy" completion data (because the way
> completion tables are defined currently, they have no way to say "I
> don't know").
Can the completion tables say no completion candidates at all? That
would be the best short-term solution; the stand-alone Info reader
does just that.
> So there are 2 ways to fix the above problem:
> - Extend minibuffer.el so a completion table return "don't know" (at
> which point it could put a message like " [No completion info]").
> - Extend info.el so that it does provide actual completion by opening up
> the "elisp" info file and gathering the corresponding node names.
The latter sounds like the best long-term solution to me. Of course,
next we will see a bug report with "g (eli TAB"...
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Tue, 18 Sep 2012 12:25:01 GMT)
Full text and
rfc822 format available.
Message #17 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>> IIRC the core of the problem is that Info's completion table does not
>> (yet) know how to do completion after something like "(elisp)", so it
>> basically returns some "dummy" completion data (because the way
>> completion tables are defined currently, they have no way to say "I
>> don't know").
> Can the completion tables say no completion candidates at all? That
> would be the best short-term solution; the stand-alone Info reader
> does just that.
So that we always get a [No completions] message?
We can try. It's all decided in the following three lines of
Info-read-node-name-1:
((string-match "\\`(" string)
(cond
((eq code nil) string)
((eq code t) nil)
(t t)))
As long as we don't know the actual list of nodes, it's important to
return non-nil when `code' is `lambda': that's the `test-completion'
case, which determines whether RET will accept the user's input since
the completion is called with `require-match'.
>> So there are 2 ways to fix the above problem:
>> - Extend minibuffer.el so a completion table return "don't know" (at
>> which point it could put a message like " [No completion info]").
>> - Extend info.el so that it does provide actual completion by opening up
>> the "elisp" info file and gathering the corresponding node names.
> The latter sounds like the best long-term solution to me.
Agreed.
> Of course, next we will see a bug report with "g (eli TAB"...
Try it: that one already works.
Stefan
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Tue, 18 Sep 2012 13:55:02 GMT)
Full text and
rfc822 format available.
Message #20 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> From: Stefan Monnier <monnier <at> iro.umontreal.ca>
> Cc: dmoncayo <at> gmail.com, 12456 <at> debbugs.gnu.org
> Date: Tue, 18 Sep 2012 08:22:47 -0400
>
> > Of course, next we will see a bug report with "g (eli TAB"...
>
> Try it: that one already works.
Not if you expect it to show the list of nodes in "(elisp)".
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Tue, 18 Sep 2012 14:29:01 GMT)
Full text and
rfc822 format available.
Message #23 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>> > Of course, next we will see a bug report with "g (eli TAB"...
>>
>> Try it: that one already works.
>
> Not if you expect it to show the list of nodes in "(elisp)".
I think that a reasonable behavior would be:
* "(eli<TAB>" completes just to "(elisp)" (or all manuals which begin
with "eli").
* "(elisp)<TAB>" completes to all nodes in the elisp manual.
--
Dani Moncayo
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Tue, 18 Sep 2012 16:59:02 GMT)
Full text and
rfc822 format available.
Message #26 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> I think that a reasonable behavior would be:
> * "(eli<TAB>" completes just to "(elisp)" (or all manuals which begin
> with "eli").
Yes, that already works.
> * "(elisp)<TAB>" completes to all nodes in the elisp manual.
Yes, that's the part that's not yet implemented. Patch welcome,
Stefan
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Tue, 18 Sep 2012 20:10:01 GMT)
Full text and
rfc822 format available.
Message #29 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>> * "(elisp)<TAB>" completes to all nodes in the elisp manual.
>
> Yes, that's the part that's not yet implemented. Patch welcome,
This can be implemented by this patch. The remaining problem is
that it's too slow because it doesn't cache completions of non-current
manuals. Perhaps `Info-build-node-completions' should use `Info-toc-nodes'
that caches node names from all visited manuals.
=== modified file 'lisp/info.el'
--- lisp/info.el 2012-09-13 22:01:45 +0000
+++ lisp/info.el 2012-09-18 20:02:43 +0000
@@ -1778,12 +1778,23 @@ (defun Info-read-node-name-1 (string pre
(substring string 1)
predicate
code))
- ;; If a file name was given, then any node is fair game.
- ((string-match "\\`(" string)
- (cond
- ((eq code nil) string)
- ((eq code t) nil)
- (t t)))
+ ;; If a file name was given, complete nodes in the file.
+ ((string-match "\\`([^)]+)" string)
+ (let ((file (match-string 0 string))
+ (node (substring string (match-end 0))))
+ (completion-table-with-context
+ file
+ (apply-partially
+ (lambda (string pred action)
+ (complete-with-action
+ action
+ (with-temp-buffer
+ (Info-mode)
+ (Info-goto-node (concat file "Top"))
+ (Info-build-node-completions)
+ Info-current-file-completions)
+ string pred)))
+ node predicate code)))
;; Otherwise use Info-read-node-completion-table.
(t (complete-with-action
code Info-read-node-completion-table string predicate))))
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Sat, 15 Dec 2012 15:37:02 GMT)
Full text and
rfc822 format available.
Message #32 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>>> * "(elisp)<TAB>" completes to all nodes in the elisp manual.
>>
>> Yes, that's the part that's not yet implemented. Patch welcome,
>
> This can be implemented by this patch. The remaining problem is
> that it's too slow because it doesn't cache completions of non-current
> manuals. Perhaps `Info-build-node-completions' should use `Info-toc-nodes'
> that caches node names from all visited manuals.
Actually I realized that `Info-toc-nodes' can't be used because it
doesn't contain Info anchors whereas `Info-build-node-completions'
adds anchors along with references.
So to be able to cache completions in non-current manuals
requires adding a global variable `Info-file-completions'
like in the patch below:
=== modified file 'lisp/info.el'
--- lisp/info.el 2012-12-08 23:12:08 +0000
+++ lisp/info.el 2012-12-15 15:28:17 +0000
@@ -397,6 +395,10 @@ (defvar Info-tag-table-buffer nil
(defvar Info-current-file-completions nil
"Cached completion list for current Info file.")
+(defvar Info-file-completions nil
+ "Cached completion alist of visited Info files.
+Each element of the alist is (FILE . COMPLETIONS)")
+
(defvar Info-file-supports-index-cookies nil
"Non-nil if current Info file supports index cookies.")
@@ -1771,12 +1783,20 @@ (defun Info-read-node-name-1 (string pre
(substring string 1)
predicate
code))
- ;; If a file name was given, then any node is fair game.
- ((string-match "\\`(" string)
- (cond
- ((eq code nil) string)
- ((eq code t) nil)
- (t t)))
+ ;; If a file name was given, complete nodes in the file.
+ ((string-match "\\`(\\([^)]+\\))" string)
+ (let ((file0 (match-string 0 string))
+ (file1 (match-string 1 string))
+ (node (substring string (match-end 0))))
+ (completion-table-with-context
+ file0
+ (apply-partially
+ (lambda (string pred action)
+ (complete-with-action
+ action
+ (Info-build-node-completions (Info-find-file file1))
+ string pred)))
+ node predicate code)))
;; Otherwise use Info-read-node-completion-table.
(t (complete-with-action
code Info-read-node-completion-table string predicate))))
@@ -1793,8 +1813,19 @@ (defun Info-read-node-name (prompt)
(Info-read-node-name prompt)
nodename)))
-(defun Info-build-node-completions ()
+(defun Info-build-node-completions (&optional file)
+ (if file
+ (or (cdr (assoc file Info-file-completions))
+ (with-temp-buffer
+ (Info-mode)
+ (Info-goto-node (format "(%s)Top" file))
+ (Info-build-node-completions-1)
+ (push (cons file Info-current-file-completions) Info-file-completions)
+ Info-file-completions))
(or Info-current-file-completions
+ (Info-build-node-completions-1))))
+
+(defun Info-build-node-completions-1 ()
(let ((compl nil)
;; Bind this in case the user sets it to nil.
(case-fold-search t)
@@ -1826,8 +1857,10 @@ (defun Info-build-node-completions ()
(setq compl
(cons (list (match-string-no-properties 1))
compl))))))))
- (setq compl (cons '("*") compl))
- (set (make-local-variable 'Info-current-file-completions) compl))))
+ (setq compl (cons '("*") (nreverse compl)))
+ (set (make-local-variable 'Info-current-file-completions) compl)
+ compl))
+
(defun Info-restore-point (hl)
"If this node has been visited, restore the point value when we left."
Reply sent
to
Juri Linkov <juri <at> jurta.org>
:
You have taken responsibility.
(Thu, 27 Dec 2012 20:44:02 GMT)
Full text and
rfc822 format available.
Notification sent
to
Dani Moncayo <dmoncayo <at> gmail.com>
:
bug acknowledged by developer.
(Thu, 27 Dec 2012 20:44:02 GMT)
Full text and
rfc822 format available.
Message #37 received at 12456-done <at> debbugs.gnu.org (full text, mbox):
> So to be able to cache completions in non-current manuals
> requires adding a global variable `Info-file-completions'
> like in the patch below:
Installed to the trunk and closed.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Thu, 27 Dec 2012 21:38:02 GMT)
Full text and
rfc822 format available.
Message #40 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>> So to be able to cache completions in non-current manuals
>> requires adding a global variable `Info-file-completions'
>> like in the patch below:
>
> Installed to the trunk and closed.
Thanks, Juri.
One question: if I do (from emacs -Q) `C-h r g ( e l i TAB TAB', I see
two completion candidates: "elisp" and "elisp.info". This is a bug,
no?
--
Dani Moncayo
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Thu, 27 Dec 2012 22:24:02 GMT)
Full text and
rfc822 format available.
Message #43 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> One question: if I do (from emacs -Q) `C-h r g ( e l i TAB TAB', I see
> two completion candidates: "elisp" and "elisp.info". This is a bug,
> no?
I doubt its usefulness too because it doesn't allow TAB to add the
closing paren automatically as it does for a single completion,
but as a comment in `Info-read-node-name-2' says:
;; If the file name ends in a standard suffix,
;; add the unsuffixed name as a completion option.
So code adds both "elisp.info" with a standard suffix ".info"
and the unsuffixed name "elisp".
This means this intentionally is a feature, and not a bug.
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Sat, 29 Dec 2012 00:20:01 GMT)
Full text and
rfc822 format available.
Message #46 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>> One question: if I do (from emacs -Q) `C-h r g ( e l i TAB TAB', I see
>> two completion candidates: "elisp" and "elisp.info". This is a bug,
>> no?
>
> I doubt its usefulness too because it doesn't allow TAB to add the
> closing paren automatically as it does for a single completion,
> but as a comment in `Info-read-node-name-2' says:
>
> ;; If the file name ends in a standard suffix,
> ;; add the unsuffixed name as a completion option.
>
> So code adds both "elisp.info" with a standard suffix ".info"
> and the unsuffixed name "elisp".
>
> This means this intentionally is a feature, and not a bug.
But this doesn't mean it is a good feature. Another similar command
`info-display-manual' doesn't add duplicates "elisp" and "elisp.info",
so when you do `M-x info-display-manual RET TAB' it displays a single
completion for every Info manual name without adding the suffix ".info".
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Sat, 29 Dec 2012 00:26:02 GMT)
Full text and
rfc822 format available.
Message #49 received at 12456 <at> debbugs.gnu.org (full text, mbox):
>>> One question: if I do (from emacs -Q) `C-h r g ( e l i TAB TAB', I see
>>> two completion candidates: "elisp" and "elisp.info". This is a bug,
>>> no?
>>
>> I doubt its usefulness too because it doesn't allow TAB to add the
>> closing paren automatically as it does for a single completion,
>> but as a comment in `Info-read-node-name-2' says:
>>
>> ;; If the file name ends in a standard suffix,
>> ;; add the unsuffixed name as a completion option.
>>
>> So code adds both "elisp.info" with a standard suffix ".info"
>> and the unsuffixed name "elisp".
>>
>> This means this intentionally is a feature, and not a bug.
>
> But this doesn't mean it is a good feature. Another similar command
> `info-display-manual' doesn't add duplicates "elisp" and "elisp.info",
> so when you do `M-x info-display-manual RET TAB' it displays a single
> completion for every Info manual name without adding the suffix ".info".
Yes, I don't see the point of duplicating each available info manual.
So I consider that a bug, and I'd be glad if it was fixed.
--
Dani Moncayo
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#12456
; Package
emacs
.
(Sat, 29 Dec 2012 22:22:02 GMT)
Full text and
rfc822 format available.
Message #52 received at 12456 <at> debbugs.gnu.org (full text, mbox):
> Yes, I don't see the point of duplicating each available info manual.
> So I consider that a bug, and I'd be glad if it was fixed.
Duplicating each available info manual might be useful for something
since it is intentionally implemented this way, but at least we could fix
the case like `g ( e l i TAB' where there is just one completion candidate,
so TAB will complete it without suffix and add the closing paren.
Also this patch fixes another problem with `Info-read-node-name-2' in
`info-display-manual' where I noticed that `M-x info-display-manual RET TAB'
displays a completion list like
Possible completions are:
&rest apply
closure elisp
when there are opened Info manuals. This problem is caused by
appending a list of opened manual names to a closure. To fix this,
a closure could be expanded to the list of available manual names with
(all-completions "" (apply-partially ...)
Another problem is that if an Info manual is opened in a temporary
buffer with the leading space in the buffer name, it should skip such
buffers with (not (string= (substring (buffer-name) 0 1) " "))
=== modified file 'lisp/info.el'
--- lisp/info.el 2012-12-28 22:07:07 +0000
+++ lisp/info.el 2012-12-29 21:59:36 +0000
@@ -1744,6 +1744,7 @@ (defun Info-read-node-name-2 (dirs suffi
(when (file-name-absolute-p string)
(setq dirs (list (file-name-directory string))))
(let ((names nil)
+ (names-sans-suffix nil)
(suffix (concat (regexp-opt suffixes t) "\\'"))
(string-dir (file-name-directory string)))
(dolist (dir dirs)
@@ -1766,7 +1767,14 @@ (defun Info-read-node-name-2 (dirs suffi
;; add the unsuffixed name as a completion option.
(when (string-match suffix file)
(setq file (substring file 0 (match-beginning 0)))
- (push (if string-dir (concat string-dir file) file) names)))))
+ (push (if string-dir (concat string-dir file) file)
+ names-sans-suffix)))))
+ ;; If there is just one file, don't duplicate it with suffixes,
+ ;; so `Info-read-node-name-1' will be able to complete a single
+ ;; candidate and to add the terminating ")".
+ (if (and (= (length names) 1) (= (length names-sans-suffix) 1))
+ (setq names names-sans-suffix)
+ (setq names (append names-sans-suffix names)))
(complete-with-action action names string pred)))
(defun Info-read-node-name-1 (string predicate code)
@@ -5181,13 +5189,16 @@ (defun info--manual-names ()
(with-current-buffer buffer
(and (eq major-mode 'Info-mode)
(stringp Info-current-file)
+ (not (string= (substring (buffer-name) 0 1) " "))
(push (file-name-sans-extension
(file-name-nondirectory Info-current-file))
names))))
(delete-dups (append (nreverse names)
- (apply-partially 'Info-read-node-name-2
- Info-directory-list
- (mapcar 'car Info-suffix-list))))))
+ (all-completions
+ ""
+ (apply-partially 'Info-read-node-name-2
+ Info-directory-list
+ (mapcar 'car Info-suffix-list)))))))
(provide 'info)
bug Marked as fixed in versions 24.3.50.
Request was from
Juri Linkov <juri <at> jurta.org>
to
control <at> debbugs.gnu.org
.
(Tue, 08 Jan 2013 00:33:02 GMT)
Full text and
rfc822 format available.
bug archived.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Tue, 05 Feb 2013 12:24:03 GMT)
Full text and
rfc822 format available.
This bug report was last modified 11 years and 290 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.