* bug#14054: completing against a hash-table doesn't work as documented
@ 2013-03-26 2:55 Jonas Bernoulli
2013-03-27 19:55 ` Stefan Monnier
0 siblings, 1 reply; 2+ messages in thread
From: Jonas Bernoulli @ 2013-03-26 2:55 UTC (permalink / raw)
To: 14054
`completing-read's doc-strings sais I should read `try-completion's
(and `all-completions's) doc-string for details on COLLECTION.
`try-completion's doc-string sais:
> If COLLECTION is a hash-table, all the keys that are strings or
> symbols are the possible completions.
(1) To my this implies that all other keys are simply ignored, as it
doesn't say that all keys _have to by_ strings or symbols.
However using e.g. a vector or number as key causes a
`wrong-type-argument' error in `test-completion'.
(2) It explicity sais that a key can be a symbol.
However this causes the same error:
(let ((ht (make-hash-table)))
(puthash 'key 'val ht)
(test-completion "input" ht))
I tried using hash-tables created with all three predefined hash-table
tests `eq', `eql', and `equal; none worked.
Note that depending on the "order" of elements in the hash-table no
error is raised by `test-completion' if a string key "before" the first
non-string key matches:
no error
(let ((ht (make-hash-table)))
(puthash "first" 'val ht)
(puthash 'second 'val ht)
(test-completion "first" ht))
error
(let ((ht (make-hash-table)))
(puthash 'first 'val ht)
(puthash "second" 'val ht)
(test-completion "second" ht))
I have tried with 23.4, 24.2, 24.3, and 24.3.50; they all behave the
this way.
^ permalink raw reply [flat|nested] 2+ messages in thread
* bug#14054: completing against a hash-table doesn't work as documented 2013-03-26 2:55 bug#14054: completing against a hash-table doesn't work as documented Jonas Bernoulli @ 2013-03-27 19:55 ` Stefan Monnier 0 siblings, 0 replies; 2+ messages in thread From: Stefan Monnier @ 2013-03-27 19:55 UTC (permalink / raw) To: Jonas Bernoulli; +Cc: 14054 > (1) To my this implies that all other keys are simply ignored, as it > doesn't say that all keys _have to by_ strings or symbols. > (2) It explicity sais that a key can be a symbol. Indeed, test-completion was too strict. The patch below should fix this. Can you confirm? Stefan === modified file 'src/minibuf.c' --- src/minibuf.c 2013-01-02 16:13:04 +0000 +++ src/minibuf.c 2013-03-27 19:52:34 +0000 @@ -1800,17 +1800,21 @@ { struct Lisp_Hash_Table *h = XHASH_TABLE (collection); i = hash_lookup (h, string, NULL); + Lisp_Object key = Qnil; if (i >= 0) tem = HASH_KEY (h, i); else for (i = 0; i < HASH_TABLE_SIZE (h); ++i) if (!NILP (HASH_HASH (h, i)) + && (key = HASH_KEY (h, i), + SYMBOLP (key) ? key = Fsymbol_name (key) : key, + STRINGP (key)) && EQ (Fcompare_strings (string, make_number (0), Qnil, - HASH_KEY (h, i), make_number (0) , Qnil, + key, make_number (0) , Qnil, completion_ignore_case ? Qt : Qnil), Qt)) { - tem = HASH_KEY (h, i); + tem = key; break; } if (!STRINGP (tem)) ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-03-27 19:55 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-03-26 2:55 bug#14054: completing against a hash-table doesn't work as documented Jonas Bernoulli 2013-03-27 19:55 ` Stefan Monnier
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.