unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Icicles, Printing and Easy Menu
@ 2006-10-28  2:38 Herbert Euler
  2006-10-28 18:14 ` Richard Stallman
  0 siblings, 1 reply; 8+ messages in thread
From: Herbert Euler @ 2006-10-28  2:38 UTC (permalink / raw)


This is another problem that arised when I tried Icicles mode (by Drew
Adams -- http://www.emacswiki.org/cgi-bin/wiki/Icicles_-_Libraries).

The reason my customizations were cleared (see also
http://lists.gnu.org/archive/html/emacs-devel/2006-10/msg00863.html)
was an init-file loading error.  The error is caused because Icicles
mode confuses `easy-menu-get-map'.

I have Printing settings in my init file.  Precisely, I have the
following lines:

  (if (>= emacs-major-version 22)
      (progn (require 'printing)
             (pr-update-menus)))

I found that when I put `(icicle-mode t)' before this if-clause, I
would get an error, but not if after.  I then traced and knew what was
wrong.

Printing updates a sub-menu in the "File" menu with `pr-update-menus'.
It does this update with `easy-menu-change'.  `easy-menu-change' will
search for a map in which the modification of menu will be done with
`easy-menu-get-map'.

`easy-menu-get-map' requires an argument named `map'.  If this
argument is bound to something not nil, `easy-menu-get-map' will
search for the desired map in it.  Otherwise, it searches in the
result returned by `(current-active-maps)'.  This will be a list of
all of the active maps currently, with the current global map as the
last element.  `easy-menu-get-map' will return the first appropriate
entry, so I think it will return the global map only for the case when
the meaning of caller makes sense to all modes, i.e. not local to the
current major mode.

Printing wants to add a menu entry to the "File" menu, so I think it
wants `global-map'.  But Icicles mode put something in local maps so
that `easy-menu-get-map' returns the local map but not the global map,
so Printing complained, an error was signaled, and customizations was
cleared.

I wrote to Drew Adams, he suggested me to report this problem to
emacs-devel.

Should things which may confuse other packages on menu manipulation be
put into `global-map', or `easy-menu-*' be modified?

Regards,
Guanpeng Xu

_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE! 
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Icicles, Printing and Easy Menu
  2006-10-28  2:38 Icicles, Printing and Easy Menu Herbert Euler
@ 2006-10-28 18:14 ` Richard Stallman
  2006-10-28 19:45   ` Drew Adams
  2006-10-30  7:38   ` Herbert Euler
  0 siblings, 2 replies; 8+ messages in thread
From: Richard Stallman @ 2006-10-28 18:14 UTC (permalink / raw)
  Cc: emacs-devel

      But Icicles mode put something in local maps so
    that `easy-menu-get-map' returns the local map but not the global map,
    so Printing complained, an error was signaled, and customizations was
    cleared.

It sounds to me like a bug in Icicles.
So far I don't see that Emacs is wrong.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: Icicles, Printing and Easy Menu
  2006-10-28 18:14 ` Richard Stallman
@ 2006-10-28 19:45   ` Drew Adams
  2006-10-30  7:38   ` Herbert Euler
  1 sibling, 0 replies; 8+ messages in thread
From: Drew Adams @ 2006-10-28 19:45 UTC (permalink / raw)
  Cc: Vinicius Jose Latorre, emacs-devel

        But Icicles mode put something in local maps so
        that `easy-menu-get-map' returns the local map but not the
        global map, so Printing complained, an error was signaled, and
        customizations was cleared.

    It sounds to me like a bug in Icicles.
    So far I don't see that Emacs is wrong.

No, I don't think so. Herbert can provide more information; he has tracked
this down in detail. In a nutshell, easy-menu-get-map is not getting the
global map, in which printing.el has placed its File > Print menu. Instead,
it is getting a minor-mode map, which has only a limited File menu (with no
Print submenu).

Icicles defines a menu item in the File menu-bar menu in icicle-mode-map, a
minor-mode map - it does not change the global-map. If Icicle mode is turned
on before loading printing.el is loaded, then when printing.el is loaded it
calls the easy-menu functions that Herbert mentioned, which pass nil instead
of the global map, which causes easy-menu to look at the current map only (I
think). Since the current map is icicle-mode-map, and it has only an Icicles
entry in its tiny File menu, printing.el fails, because easy-menu does not
find any Print submenu under File.

Herbert can explain the details better. Probably his details will be
necessary to see just what fix is needed.

This really has nothing per se to do with Icicles. Here is a test that
reproduces the error:

1. create file foo.el with these contents:

(defun define-foo-mode-map () ""
  (setq foo-mode-map (make-sparse-keymap))
  ;; Bind foo-find-file in foo-mode-map to whatever
  ;; whatever find-file is bound to globally.
  (substitute-key-definition 'find-file
                             'foo-find-file
                             foo-mode-map global-map))

(define-minor-mode foo-mode "" (define-foo-mode-map))
(defun foo-find-file (file &optional wild) "" (interactive))

2. emacs -Q
3. M-x load-file foo.el
4. M-x foo-mode
5. M-x load-file printing.el
6. M-: (pr-update-menus t)

The problem is that there is no Print submenu in menu File, and there should
be.

With the above recipe, you will in fact get a wrong-type arg, 3 error in
pr-menu-get-item, because the key [menu-bar file Print PostScript\ Print
File] is too long to look up. However, if a test of the result of lookup-key
is added to the code to avoid that error being raised, the real problem
shows up anyway: no Print submenu under File.

(defun pr-menu-get-item (name-list)
  ;; NAME-LIST is a string or a list of strings.
  (or (listp name-list)
      (setq name-list (list name-list)))
  (and name-list
       (let* ((reversed (reverse name-list))
              (name (pr-get-symbol (car reversed)))
              (path (nreverse (cdr reversed)))
              (menu (lookup-key
                     global-map
                     (vconcat pr-menu-bar
                              (mapcar 'pr-get-symbol path)))))
         (and (not (wholenump menu)) ;; *** THIS TEST ADDED ***
              (assq name (nthcdr 2 menu))))))

The problem, I believe, is that easy-menu is not trying to update the right
menu (keymap). In foo mode, the minor-mode keymap is `foo-mode-map'. The
following is the menu-bar stuff in foo-mode-map - the File menu has only one
item:

(keymap
 (open . foo-find-file)
 (menu-bar
  keymap
  (file keymap
        (new-file
         menu-item "Visit New File..." foo-find-file
         ([24 6]
         . "  (C-x C-f)")
         :enable
         (menu-bar-non-minibuffer-window-p)
         :help "Specify a new file's name, to edit the file")))
 (24 keymap
     (6 . foo-find-file)))

It is this map that is (first) used by easy-menu, and it chokes when it
cannot look up [menu-bar file Print PostScript\ Print File] in it. It looks
as if the printing.el call to `easy-menu-get-map' mistakenly uses nil as the
first argument. According to the doc, that stands for "the local menu-bar
keymap". (Probably, it would be more exact to say "local or minor-mode
menu-bar keymap".)

Herbert mentioned that the code actually picks up all maps, but it picks up
the global-map last. I didn't look into this in detail - I just went by the
doc string here, which suggests that only the local map is used. If the
local or minor-mode map is used, whether as the first or the only map, no
Print menu is found under File in that map (because Print is only in the
global-map).

Perhaps the first arg to easy-menu-get-map should be `global-map', but I'm
not sure if that is appropriate or is even a fix. If all maps are checked
during the menu update, then the updating needs to be tolerant wherever the
Print menu is not present in the map.

HTH.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Icicles, Printing and Easy Menu
  2006-10-28 18:14 ` Richard Stallman
  2006-10-28 19:45   ` Drew Adams
@ 2006-10-30  7:38   ` Herbert Euler
  2006-10-30  7:46     ` Herbert Euler
  1 sibling, 1 reply; 8+ messages in thread
From: Herbert Euler @ 2006-10-30  7:38 UTC (permalink / raw)
  Cc: emacs-devel

I reproduce the same problem with the following operations:

1. Start Emacs with either

    $ emacs -Q

or

    $ emacs -q

2. In the *scratch* window:

(require 'pp)
==> pp
(require 'printing)
==> printing
(pr-update-menus t)
==> Debugger entered--Lisp error: (wrong-type-argument listp 3)

So, there is clearly something wrong with Easy Menu.  I will
track this later.

Regards,
Guanpeng Xu

_________________________________________________________________
FREE pop-up blocking with the new MSN Toolbar - get it now! 
http://toolbar.msn.click-url.com/go/onm00200415ave/direct/01/

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Icicles, Printing and Easy Menu
  2006-10-30  7:38   ` Herbert Euler
@ 2006-10-30  7:46     ` Herbert Euler
  2006-11-01  2:11       ` Vinicius Jose Latorre
  0 siblings, 1 reply; 8+ messages in thread
From: Herbert Euler @ 2006-10-30  7:46 UTC (permalink / raw)
  Cc: emacs-devel

>I reproduce the same problem with the following operations:
>
>1. Start Emacs with either
>
>    $ emacs -Q
>
>or
>
>    $ emacs -q
>
>2. In the *scratch* window:
>
>(require 'pp)
>==> pp
>(require 'printing)
>==> printing
>(pr-update-menus t)
>==> Debugger entered--Lisp error: (wrong-type-argument listp 3)
>
>So, there is clearly something wrong with Easy Menu.  I will
>track this later.

The problem is in Printing.  (require 'pp) is not needed at all.  Only 
(require 'printing) and (pr-update-menus t) when Emacs is started with '-q' 
is sufficient to produce the error.

Regards,
Guanpeng Xu

_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE! 
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Icicles, Printing and Easy Menu
  2006-10-30  7:46     ` Herbert Euler
@ 2006-11-01  2:11       ` Vinicius Jose Latorre
  2006-11-01  3:04         ` Herbert Euler
  0 siblings, 1 reply; 8+ messages in thread
From: Vinicius Jose Latorre @ 2006-11-01  2:11 UTC (permalink / raw)
  Cc: rms, emacs-devel

Herbert Euler wrote:
>> I reproduce the same problem with the following operations:
>>
>> 1. Start Emacs with either
>>
>>    $ emacs -Q
>>
>> or
>>
>>    $ emacs -q
>>
>> 2. In the *scratch* window:
>>
>> (require 'pp)
>> ==> pp
>> (require 'printing)
>> ==> printing
>> (pr-update-menus t)
>> ==> Debugger entered--Lisp error: (wrong-type-argument listp 3)
>>
>> So, there is clearly something wrong with Easy Menu.  I will
>> track this later.
>
> The problem is in Printing.  (require 'pp) is not needed at all.  Only 
> (require 'printing) and (pr-update-menus t) when Emacs is started with 
> '-q' is sufficient to produce the error.
>
> Regards,
> Guanpeng Xu

Well, I'm using Linux and Emacs 22.0.50.1.

I couldn't reproduce the problem using the steps above.

But using the steps that Drew Adams wrote, I got the error too.
The steps are:

   1. create file foo.el with these contents:

   (defun define-foo-mode-map () ""
     (setq foo-mode-map (make-sparse-keymap))
     ;; Bind foo-find-file in foo-mode-map to whatever
     ;; whatever find-file is bound to globally.
     (substitute-key-definition 'find-file
                                'foo-find-file
                                foo-mode-map global-map))

   (define-minor-mode foo-mode "" (define-foo-mode-map))
   (defun foo-find-file (file &optional wild) "" (interactive))

   2. emacs -Q
   3. M-x load-file foo.el
   4. M-x foo-mode
   5. M-x load-file printing.el
   6. M-: (pr-update-menus t)


Regards,


Vinicius

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Icicles, Printing and Easy Menu
  2006-11-01  2:11       ` Vinicius Jose Latorre
@ 2006-11-01  3:04         ` Herbert Euler
  2006-11-01  5:08           ` Vinicius Jose Latorre
  0 siblings, 1 reply; 8+ messages in thread
From: Herbert Euler @ 2006-11-01  3:04 UTC (permalink / raw)
  Cc: rms, emacs-devel

>Herbert Euler wrote:
>>>I reproduce the same problem with the following operations:
>>>
>>>1. Start Emacs with either
>>>
>>>    $ emacs -Q
>>>
>>>or
>>>
>>>    $ emacs -q
>>>
>>>2. In the *scratch* window:
>>>
>>>(require 'pp)
>>>==> pp
>>>(require 'printing)
>>>==> printing
>>>(pr-update-menus t)
>>>==> Debugger entered--Lisp error: (wrong-type-argument listp 3)
>>>
>>>So, there is clearly something wrong with Easy Menu.  I will
>>>track this later.
>>
>>The problem is in Printing.  (require 'pp) is not needed at all.  Only 
>>(require 'printing) and (pr-update-menus t) when Emacs is started with 
>>'-q' is sufficient to produce the error.
>>
>>Regards,
>>Guanpeng Xu
>
>Well, I'm using Linux and Emacs 22.0.50.1.
>
>I couldn't reproduce the problem using the steps above.
>
>But using the steps that Drew Adams wrote, I got the error too.
>The steps are:
>
>   1. create file foo.el with these contents:
>
>   (defun define-foo-mode-map () ""
>     (setq foo-mode-map (make-sparse-keymap))
>     ;; Bind foo-find-file in foo-mode-map to whatever
>     ;; whatever find-file is bound to globally.
>     (substitute-key-definition 'find-file
>                                'foo-find-file
>                                foo-mode-map global-map))
>
>   (define-minor-mode foo-mode "" (define-foo-mode-map))
>   (defun foo-find-file (file &optional wild) "" (interactive))
>
>   2. emacs -Q
>   3. M-x load-file foo.el
>   4. M-x foo-mode
>   5. M-x load-file printing.el
>   6. M-: (pr-update-menus t)

I have known what is wrong, and written to Drew Adams.  Thank you.

Regards,
Guanpeng Xu

_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE! 
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Icicles, Printing and Easy Menu
  2006-11-01  3:04         ` Herbert Euler
@ 2006-11-01  5:08           ` Vinicius Jose Latorre
  0 siblings, 0 replies; 8+ messages in thread
From: Vinicius Jose Latorre @ 2006-11-01  5:08 UTC (permalink / raw)
  Cc: rms, emacs-devel

Herbert Euler wrote:
>> Herbert Euler wrote:
>>>> I reproduce the same problem with the following operations:
>>>>
>>>> 1. Start Emacs with either
>>>>
>>>>    $ emacs -Q
>>>>
>>>> or
>>>>
>>>>    $ emacs -q
>>>>
>>>> 2. In the *scratch* window:
>>>>
>>>> (require 'pp)
>>>> ==> pp
>>>> (require 'printing)
>>>> ==> printing
>>>> (pr-update-menus t)
>>>> ==> Debugger entered--Lisp error: (wrong-type-argument listp 3)
>>>>
>>>> So, there is clearly something wrong with Easy Menu.  I will
>>>> track this later.
>>>
>>> The problem is in Printing.  (require 'pp) is not needed at all.  
>>> Only (require 'printing) and (pr-update-menus t) when Emacs is 
>>> started with '-q' is sufficient to produce the error.
>>>
>>> Regards,
>>> Guanpeng Xu
>>
>> Well, I'm using Linux and Emacs 22.0.50.1.
>>
>> I couldn't reproduce the problem using the steps above.
>>
>> But using the steps that Drew Adams wrote, I got the error too.
>> The steps are:
>>
>>   1. create file foo.el with these contents:
>>
>>   (defun define-foo-mode-map () ""
>>     (setq foo-mode-map (make-sparse-keymap))
>>     ;; Bind foo-find-file in foo-mode-map to whatever
>>     ;; whatever find-file is bound to globally.
>>     (substitute-key-definition 'find-file
>>                                'foo-find-file
>>                                foo-mode-map global-map))
>>
>>   (define-minor-mode foo-mode "" (define-foo-mode-map))
>>   (defun foo-find-file (file &optional wild) "" (interactive))
>>
>>   2. emacs -Q
>>   3. M-x load-file foo.el
>>   4. M-x foo-mode
>>   5. M-x load-file printing.el
>>   6. M-: (pr-update-menus t)
>
> I have known what is wrong, and written to Drew Adams.  Thank you.
For some reason the command:

   (easy-menu-change '("file") "Print" pr-menu-spec "print-buffer")

has no effect just after step 5.
The command above is correct, but has no effect, that is, "Print" 
submenu is not created.

But if after step 5, you do:

    5.1 C-h v global-map RET    ;; create *Help* buffer in another window
    5.2 C-x o                                 ;; switch to *Help* buffer

Now, all works.


Regards,


Vinicius

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2006-11-01  5:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-28  2:38 Icicles, Printing and Easy Menu Herbert Euler
2006-10-28 18:14 ` Richard Stallman
2006-10-28 19:45   ` Drew Adams
2006-10-30  7:38   ` Herbert Euler
2006-10-30  7:46     ` Herbert Euler
2006-11-01  2:11       ` Vinicius Jose Latorre
2006-11-01  3:04         ` Herbert Euler
2006-11-01  5:08           ` Vinicius Jose Latorre

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).