From: Krishnakumar B <ki...@dr...> - 2004-04-09 19:30:22
|
On Friday, 9 April 2004, Martin Stjernholm wrote: > ki...@dr... (Krishnakumar Balasubramanian) wrote: > > > c-beginning-of-defun and c-end-of-defun don't move point to the beginning > > and the end of the functions when the function is defined inside a > > namespace or a class and doesn't start at the beginning of a line. This is > > easily reproduced with the following example: > > > > namespace Foo > > { > > void fn() > > { > > foo(); > > bar(); > > } > > > > void bar() > > { > > foo(); > > > > foo_bar(); > > > > } > > }; > > > > Placing the cursor after foo(); and doing M-x c-beginning-of-defun takes > > point to the namespace declaration instead of void. > > Yes, it's that way because a "defun" is taken to be an outermost paren > list. That has then been extended in CC Mode to mean the entire > definition that the paren is part of. But the effect of this is much more than the two functions c-beginning-of-defun and c-end-of-defun. For example, I frequently indent a function using C-M-h followed by C-M-\ and this is broken too. > I'd also like to see functions for moving by functions/struct/classes/ > etc even when they're nested inside each other. That's however a > different thing which should be accomplished by some new functions, > perhaps called c-(beginning|end)-of-method. Agreed. Frequently I also need to make the beginning of a function as the first line in a window and I used to use c-beginning-of-defun for that. Even that doesn't work anymore. With more and more C++ compilers supporting namespaces, even we have started relying on compilers that support namespaces and hence a lot of new C++ code is written like the example above. So it would be very nice to have this support. > The main reason why such things don't exist already is that it's not > entirely easy to go into such constructs and accurately find a nested > function. A complicating factor is that in some languages there can be > class or function definitions inside normal code, even in the middle of > expressions. Should the functions stop at those too? Atleast in C++, functions can be defined at 1. Global level 2. Namespace level 3. Class level With respect to finding beginning and end of functions, classes and namespaces can be treated as the same. While it is possible to define functions inside functions, this can only happen inside nested class/namespace definitions (so you should see the identifier class/namespace) C is a lot more stringent on this and I think you can only define functions at the global level. I don't know Java well enought to comment on it. Same for AWK and other languages supported by CC mode. I think it would be acceptable to highlight/move point to the smallest enclosing function definition wherever that might be. After all such code is very rare... -kitty. |