all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* 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.