Subject: bug#18268: 24.3.92; Make imenu sort submenus also (fix included)

From: [email-masked]
Date: Thu, 14 Aug 2014 20:18:33 -0300

When the current major mode provides submenus (say, python-mode, with
methods nested inside classes, classes being top-level), imenu always
shows them at the top of the menu and unsorted. Only sibling leaves of
the menu tree are sorted.

To fix this, just sort the output of imenu--split submenus when a custom
imenu-sort-function was required by the user:

(defun imenu--split-submenus (alist)
  "Split up each long alist that are nested within ALIST into nested alists.
Return a split and sorted copy of ALIST.  The returned alist DOES
NOT share structure with ALIST."
  (let ((menulist (mapcar (lambda (elt)
                            (if (imenu--subalist-p elt)
                                (imenu--split-menu (cdr elt) (car elt))
                              elt))
                          alist)))
    (if imenu-sort-function
	(sort menulist imenu-sort-function)
      menulist)))

Regards
--
Carlos

In GNU Emacs 24.3.92.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.12.2)
 of 2014-08-07 on memeplex
Windowing system distributor `The X.Org Foundation', version 11.0.11600000
Configured using:
 `configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib
 --localstatedir=/var --with-x-toolkit=gtk3 --with-xft
 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong
 --param=ssp-buffer-size=4' CPPFLAGS=-D_FORTIFY_SOURCE=2
 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro'

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  shell-dirtrack-mode: t
  show-paren-mode: t
  winner-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  ido-everywhere: t
  global-auto-complete-mode: t
  auto-complete-mode: t
  tooltip-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  global-prettify-symbols-mode: t
  prettify-symbols-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
<up> <up> <up> <up> <up> <up> <up> <up> <up> C-SPC 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> C-w <return> C-x C-s <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <prior> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <S-left> <down> <down> <down> C-x d <return> <S-right> 
<down> <down> <down> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
C-e ( r e q u i r e SPC ' i m e n u - a n y w h e e 
r <backspace> <backspace> r e ) C-x C-e <up> <up> <down> 
C-e C-x C-e <S-left> <up> <down> <down> <down> d <down> 
x y e s <return> <up> <up> <up> <return> C-x C-s <down> 
<down> <down> <down> <down> C-x b s c <return> <S-right> 
<next> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <return> ( r e q 
u i r e SPC ' f i x e s ) C-x C-e C-g C-x C-s <up> 
<up> <S-left> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> M-x r e p o <tab> 
r t <tab> <return>

Recent messages:
End of buffer [3 times]
imenu-anywhere
imenu--sort-by-name
Deleting...done
(No changes need to be saved)
progn: Required feature `fixes' was not provided
Quit
Saving file /home/carlos/.emacs...
Wrote /home/carlos/.emacs
Making completion list...

Load-path shadows:
~/.emacs.d/lisp/python hides /usr/share/emacs/24.3.92/lisp/progmodes/python
~/.emacs.d/lisp/rmail hides /usr/share/emacs/24.3.92/lisp/mail/rmail

Features:
(shadow sort mail-extr emacsbug message idna rfc822 mml mml-sec
mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils
mailheader sendmail rfc2047 rfc2045 ietf-drums mail-utils debug
mule-util tramp-cache tramp tramp-compat tramp-loaddefs trampver shell
image-file org-rmail org-mhe org-irc org-info org-gnus org-docview
doc-view image-mode dired org-bibtex bibtex org-bbdb org-w3m org-capture
org org-macro org-footnote org-pcomplete pcomplete org-list org-faces
org-entities noutline outline easy-mmode org-version ob-emacs-lisp ob
ob-tangle org-src ob-ref ob-lob ob-table ob-keys ob-exp ob-comint
ob-core ob-eval org-compat org-macs org-loaddefs format-spec cal-menu
calendar cal-loaddefs edebug misearch multi-isearch jka-compr eieio-opt
speedbar sb-image ezimage dframe network-stream auth-source eieio
byte-opt bytecomp byte-compile cconv eieio-core gnus-util mm-util
mail-prsvr password-cache starttls tls warnings vc-git jedi
python-environment epc ctable concurrent deferred python skeleton
derived pcase rx json imenu-anywhere cl-macs imenu thingatpt find-func
flymake compile comint ansi-color paren winner ring windmove advice
help-fns yasnippet help-mode cl gv ido auto-complete-config
auto-complete popup edmacro kmacro cl-loaddefs cl-lib info easymenu
package wombat-theme time-date tooltip electric uniquify ediff-hook
vc-hooks lisp-float-type mwheel x-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list newcomment lisp-mode prog-mode register
page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock
font-lock syntax facemenu font-core frame cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew
greek romanian slovak czech european ethiopic indian cyrillic chinese
case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
gfilenotify dynamic-setting system-font-setting font-render-setting
move-toolbar gtk x-toolkit x multi-tty emacs)

Memory information:
((conses 16 361814 22370)
 (symbols 48 36390 0)
 (miscs 40 1153 1328)
 (strings 32 103033 9931)
 (string-bytes 1 2189271)
 (vectors 16 35814)
 (vector-slots 8 1446654 27798)
 (floats 8 665 911)
 (intervals 56 9261 0)
 (buffers 960 26)
 (heap 1024 67756 2517))