[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Making hide-ifdef-use-define-alist more user friendly
From: |
Kim F. Storm |
Subject: |
Re: Making hide-ifdef-use-define-alist more user friendly |
Date: |
Mon, 21 Feb 2005 11:28:08 +0100 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) |
Juan-Leon Lahoz Garcia <address@hidden> writes:
> Hi,
>
> `hide-ifdef-use-define-alist', when invoked interactivelly, does not
> know how to complete to the symbols in alist `hide-ifdef-define-alist',
> despite it is mandatory to enter one of them.
Good point.
>
> --- hideif.el.ori Mon Feb 21 09:33:58 2005
> +++ hideif.el Mon Feb 21 10:08:52 2005
> @@ -1061,9 +1061,16 @@
> (cons (cons name (hif-compress-define-list hide-ifdef-env))
> hide-ifdef-define-alist)))
>
> -(defun hide-ifdef-use-define-alist (name)
> +(defun hide-ifdef-use-define-alist (&optional name)
> "Set `hide-ifdef-env' to the define list specified by NAME."
> - (interactive "SUse define list: ")
> + (interactive)
> + (unless name
> + (setq name
> + (completing-read "Use define list: "
> + (mapcar (lambda (arg)
> + (cons (symbol-name (car arg)) t))
> + hide-ifdef-define-alist) nil t)))
> + (if (stringp name) (setq name (intern name)))
> (let ((define-list (assoc name hide-ifdef-define-alist)))
> (if define-list
> (setq hide-ifdef-env
This looked more complex than needed at first sight, so I tried this:
*** hideif.el 01 Sep 2003 17:45:35 +0200 1.48
--- hideif.el 21 Feb 2005 11:00:21 +0100
***************
*** 958,964 ****
(defun hide-ifdef-use-define-alist (name)
"Set `hide-ifdef-env' to the define list specified by NAME."
! (interactive "SUse define list: ")
(let ((define-list (assoc name hide-ifdef-define-alist)))
(if define-list
(setq hide-ifdef-env
--- 958,967 ----
(defun hide-ifdef-use-define-alist (name)
"Set `hide-ifdef-env' to the define list specified by NAME."
! (interactive
! (list (completing-read "Use define list: "
! hide-ifdef-define-alist nil t)))
! (if (stringp name) (setq name (intern name)))
(let ((define-list (assoc name hide-ifdef-define-alist)))
(if define-list
(setq hide-ifdef-env
But as you had already discovered, completing-read requires that
the alist keys are strings, not symbols.
Looking at try-completion and all-completions, there is a strange
inconsistency between alists, vectors, and hash tables:
In alists and hash tables, the key must be a string, while in vectors,
the key must be a symbol...
The following patch changes this to accept both strings and symbols as
keys in all cases.
With this, my simpler patch to hide-ifdef-use-define-alist works.
Any objections to installing this ?
*** minibuf.c 12 Dec 2004 23:25:36 +0100 1.278
--- minibuf.c 21 Feb 2005 11:15:49 +0100
***************
*** 1257,1263 ****
if (!EQ (bucket, zero))
{
elt = bucket;
! eltstring = Fsymbol_name (elt);
if (XSYMBOL (bucket)->next)
XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
else
--- 1257,1263 ----
if (!EQ (bucket, zero))
{
elt = bucket;
! eltstring = elt;
if (XSYMBOL (bucket)->next)
XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
else
***************
*** 1284,1289 ****
--- 1284,1292 ----
/* Is this element a possible completion? */
+ if (SYMBOLP (eltstring))
+ eltstring = Fsymbol_name (eltstring);
+
if (STRINGP (eltstring)
&& SCHARS (string) <= SCHARS (eltstring)
&& (tem = Fcompare_strings (eltstring, zero,
***************
*** 1512,1518 ****
if (!EQ (bucket, zero))
{
elt = bucket;
! eltstring = Fsymbol_name (elt);
if (XSYMBOL (bucket)->next)
XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
else
--- 1515,1521 ----
if (!EQ (bucket, zero))
{
elt = bucket;
! eltstring = elt;
if (XSYMBOL (bucket)->next)
XSETSYMBOL (bucket, XSYMBOL (bucket)->next);
else
***************
*** 1539,1544 ****
--- 1542,1550 ----
/* Is this element a possible completion? */
+ if (SYMBOLP (eltstring))
+ eltstring = Fsymbol_name (eltstring);
+
if (STRINGP (eltstring)
&& SCHARS (string) <= SCHARS (eltstring)
/* If HIDE_SPACES, reject alternatives that start with space
--
Kim F. Storm <address@hidden> http://www.cua.dk