Module /emacs/lisp/progmodes/js.el In js-mode, editing a short javascript file, the imenu indexing works nicely but the actual menu is incomplete, truncated. The defun js--pitems-to-imenu seems to make an insufficient effort, when nested function definitions are used in the source. For example, supposing this js source: jQuery(document).ready(function () { var $th = jQuery('thead > tr > th'); $th.each(function(column, elt) { jQuery(this).addClass('sortable').click(function() { ... }); }); }); (this is fairly typical with javascript) In this case js-mode will index all of the anonymous functions, but will produce an imenu that contains only the outer anonymous function. This is done in js--pitems-to-imenu. Also, in the same defun, the imenu entry uses "Unknown" as the name of the anonymous function. I propose 2 things: - replace the name "unknown" with "Anonymous" - recurse into js--pitems-to-imenu for functions that define child functions. The proposed new code for the defun is: (defun js--pitems-to-imenu (pitems unknown-ctr) "Convert list of pitems PITEMS to imenu format" (let (imenu-items pitem pitem-type pitem-name subitems) (while (setq pitem (pop pitems)) (setq pitem-type (js--pitem-type pitem)) (setq pitem-name (js--pitem-strname pitem)) (when (eq pitem-name t) (setq pitem-name (format "Anonymous %s" (incf (car unknown-ctr))))) (cond ((memq pitem-type '(function macro)) (assert (integerp (js--pitem-h-begin pitem))) ;; DPC check for children (nested fnc defns) (cond ((js--pitem-children pitem) (setq subitems (js--pitems-to-imenu (js--pitem-children pitem) unknown-ctr)) (cond (subitems ;; DPC index "top" and "bottom" of the enclosure (push (cons "(top)" (js--maybe-make-marker (js--pitem-h-begin pitem))) subitems) (let ((b-end (js--pitem-b-end pitem))) (if b-end (setq subitems (append subitems (list (cons "(bottom)" (js--maybe-make-marker b-end))) subitems)))) (push (cons pitem-name subitems) imenu-items)) (t (push (cons pitem-name (js--maybe-make-marker (js--pitem-h-begin pitem))) imenu-items)))) (t (push (cons pitem-name (js--maybe-make-marker (js--pitem-h-begin pitem))) imenu-items)))) ((consp pitem-type) ; class definition (setq subitems (js--pitems-to-imenu (js--pitem-children pitem) unknown-ctr)) (cond (subitems (push (cons pitem-name subitems) imenu-items)) ((js--pitem-h-begin pitem) (assert (integerp (js--pitem-h-begin pitem))) (setq subitems (list (cons "[empty]" (js--maybe-make-marker (js--pitem-h-begin pitem))))) (push (cons pitem-name subitems) imenu-items)))) (t (error "Unknown item type: %S" pitem-type)))) imenu-items)) In GNU Emacs 23.2.1 (i386-mingw-nt6.1.7601) of 2010-05-08 on G41R2F1 Windowing system distributor `Microsoft Corp.', version 6.1.7601 configured using `configure --with-gcc (3.4) --no-opt --cflags -Ic:/xpm/include' Important settings: value of $LC_ALL: nil value of $LC_COLLATE: nil value of $LC_CTYPE: nil value of $LC_MESSAGES: nil value of $LC_MONETARY: nil value of $LC_NUMERIC: nil value of $LC_TIME: nil value of $LANG: ENU value of $XMODIFIERS: nil locale-coding-system: cp1252 default enable-multibyte-characters: t Major mode: Emacs-Lisp Minor modes in effect: auto-revert-mode: t yas/minor-mode: t global-hl-line-mode: t hl-line-mode: t global-auto-complete-mode: t auto-complete-mode: t tooltip-mode: t mouse-wheel-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-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t Recent messages: Mark saved where search started Mark set No closing parenthesis found Mark set Matches '(... [-73-] Matches (eval-after-load "js" [-74] Mark set [2 times] Saving file c:/Users/Dino/elisp/emacs.el... Wrote c:/Users/Dino/elisp/emacs.el Mark set Load-path shadows: /users/dino/elisp/linum hides c:/emacs/lisp/linum /users/dino/elisp/css-mode hides c:/emacs/lisp/textmodes/css-mode Features: (shadow sort mail-extr message ecomplete rfc822 mml mml-sec password-cache mm-decode mm-bodies mm-encode mailcap mail-parse rfc2231 rfc2047 rfc2045 qp ietf-drums mailabbrev nnheader gnus-util netrc time-date mm-util mail-prsvr gmm-utils wid-edit mailheader canlock sha1 hex-util hashcash mail-utils emacsbug help-mode view js find-func dired-aux flymake-for-jslint-for-wsh flymake-cursor flymake autopair espresso bytecomp byte-compile ido json thingatpt etags imenu newcomment cc-mode cc-fonts cc-menus cc-cmds multi-isearch grep compile comint ring time-stamp sgml-mode autorevert server cperl-mode paren mic-paren hideshow easymenu cc-styles cc-align cc-engine cc-vars cc-defs dired regexp-opt defaultcontent yasnippet-bundle dropdown-list yasnippet easy-mmode cl cl-19 tfs skeleton httpget hl-line advice help-fns advice-preload auto-complete-config auto-complete edmacro kmacro popup tooltip ediff-hook vc-hooks lisp-float-type mwheel dos-w32 disp-table ls-lisp w32-win w32-vars tool-bar dnd fontset image fringe lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar mldrag 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 loaddefs button minibuffer faces cus-face files text-properties overlay md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote make-network-process multi-tty emacs)