Regexp for imenu

Martin Maechler maechler at
Mon Jan 14 10:37:54 CET 2002

>>>>> "StEgl" == Stephen Eglen <stephen at> writes:

    StEgl> Wright, Kevin writes:
    >> I typically format my functions this way:
    >> a<-function(){...}
    >> but imenu fails to recognize this as a function,
    >> expecting spaces around the assignment operator:
    >> a <- function()

Just one *strong* comment :

Almost all experienced S (R and S-plus) programmers I know
*strongly* recommend using spaces around "<-" 

The current ESS behavior would encourage you to change your
(wrong space saving) behavior.   One other way to encourage the
" <- " is the fact that using "_" (underscore) has been
producing " <- " automagically in ESS for a while
{and yes; it also did it in SAS-mode once which *was* a bug ..}

    >> I think that the relevant part of ess-menu.el is
    >> "ess-S-imenu-function-regexp".  The default value for
    >> this string is
    >> "^\\(.+\\)\\s-*<-\\s-*function"
    >> I've tried playing around with this regexp, for example
    >> "^\\(.+\\)[ ]*<-[ ]*function" and "^\\(.+\\)<-function"
    >> It looks to me like any of these should work for me, but
    >> I'm not having any luck.  Am I missing something obvious?

The real problem with the imenu regexp is that it's not
compatible with, the Emacs syntax table or at least font-lock's
behavior, and IMO the real bug of ess-imenu's regexp is that

mylongnamedfunction.Method <-
   function(x, y, ....) {


is not `seen' by the current regexp!
So, yes, we *do* have to fix this, and may also allow the
VERY-UGLY-no-whitespace assignment arrow.


    StEgl> yes, the regexps you suggest look fine.  However, it
    StEgl> seems the imenu regexp is hardcoded (at least in
    StEgl> 5.1.19) in the function ess-imenu-S:

    StEgl> (defun ess-imenu-S (&optional arg) "S Language Imenu
    StEgl> support for ESS.  Initial version from Stephen Eglen
    StEgl> <stephen at>."  (interactive) (setq
    StEgl> imenu-generic-expression '( (nil
    StEgl> ;;ess-S-imenu-generic-expression
    StEgl> "^\\(.+\\)\\s-+<-\\s-+function" 1)))
    StEgl> (imenu-add-to-menubar "Imenu-S"))

    StEgl> You can do a couple of things as workaround:

    StEgl> 1) since imenu-generic-expression is buffer local,
    StEgl> evaluate the following in each R/S buffer that you
    StEgl> want imenu to work in:

    StEgl> (setq imenu-generic-expression '( (nil
    StEgl> "^\\(.+\\)\\s-*<-\\s-*function" 1)))

    StEgl>  (that worked for me when removing whitespace around
    StEgl> one of my function definitions).

    StEgl> 2) change the regexp in the defun above and visit a
    StEgl> new R buffer (or restart Emacs).

    StEgl> The problem you found is that are relevant variables
    StEgl> in ESS that you can set (such as
    StEgl> ess-S-imenu-function-regexp), but they are not being
    StEgl> used by ess-imenu-S.  (Why is
    StEgl> ess-S-imenu-generic-expression in the above defun
    StEgl> commented out?)

ess-help mailing list -- To (un)subscribe, send
subscribe	or	unsubscribe
(in the "body", not the subject !)  To: ess-help-request at

More information about the ESS-help mailing list