[ESS] C-c C-c on a short function

Martin Maechler maechler at stat.math.ethz.ch
Wed Jun 25 09:19:11 CEST 2008

>>>>> "TS" == tyler  <tyler.smith at mail.mcgill.ca>
>>>>>     on Fri, 20 Jun 2008 09:11:08 -0300 writes:

    TS> markleeds at verizon.net writes:
    >> When I use control cc on a function such as 

 mindiff <- function(df) df[which.min(df$diff), ]

    >> only the
    >> mindiff <- function(df) df
    >> part gets recognized by R so the function does nothing.
    >> But, if I put squiggly brackets around the same function
    >> , as in
    >> mindiff <- function(df) { df[which.min(df$diff), ] }
    >> then everything works fine. If this not something that
    >> can be fixed by setting ESS options, then that's okay and
    >> I'll always put the squiggly brackets. But, if it can be
    >> fixed and someone knows what to put in my init.el, that
    >> would be great. thanks.

    TS> After a quick scan of the code I couldn't find a proper
    TS> fix, but if your short function is only one line long
    TS> you can use C-c C-n to send it. If it's more than one
    TS> line, and there's a blank line after it, you can send it
    TS> with C-c C-p.

    TS> HTH,

well... not too much in my view.

This is actually a very old "infelicity" in basic ESS.
It all amounts to what the emacs-lisp function
   ess-end-of-function  {in  <ESS>/lisp/ess-mode.el }
And what it does it basically the following algorithm:

 1) jump backwards to the beginning of the function
     {and that also is not perfect in complicated S4
      setMethod(.) settings , but that's a different story}
 2) jump forwards over the argument list
 3) jump forward one (Syntax-specific) "SEXP"; for R this
    means typically means  '{ ... }'

Now we could add a to the above algorithm an

 4) jump forward to end of line

But that would be a bit a kludge, since
in this situation 

f1 <- function(x) be.friendly(x, force=TRUE); f2 <- function(x,y) x*sin(pi*x)

it would do "the wrong thing" and jump over both function definitions.
Also, step '4)' still would not help in a case like

mindiff <- function(df) df[which.min(df$diff),

Now these examples suggest to me
to use
   4')  if(not at end of line)  jump-forward another SEXP

This may be a real improvement to the current behavior,
but I am sure there will still be cases where it won't work

What do others think?


More information about the ESS-help mailing list