emacs-devel
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]