comp.emacs
[Top] [All Lists]

Re: how to find in cc-mode what is the function name at given point

Subject: Re: how to find in cc-mode what is the function name at given point
From: Alan Mackenzie
Date: Thu, 7 Aug 2008 22:01:34 +0000 UTC
Newsgroups: comp.emacs

dejfson@xxxxxxxxx <dejfson@xxxxxxxxx> wrote:
> Dear Experts,

> i would like to locate a function name currently being edited in cc-
> mode. I had an idea that walking back by compound-parenthesis ({)
> would give me a starting position where to look for function
> declaration. However this does not work because you never know in what
> sub-statement you are and what is the top-level parenthesis. then i
> looked into cc-mode sources and I have found 'c-show-syntactic-
> information'. This gives what I need (looking for defun-open and its
> anchor position) so I can reach the beginning of the function and by
> regular expressions look for class and function declarations.
> The problem with this solution is, that if the function is messy -
> like written in a single line, whatever cursor position is inside such
> function, I never get 'defun-open'. Instead I get ('topmost-intro'),
> with anchor point showing at the end of preceding function.

> is there an elegant way how to extract the belonging class(es) and
> function name of the code appearing at position of cursor?

No, there is no elegant way.  Only hard graft.  ;-)  The following
function will be appearing in the next release of CC Mode.  If you have
a reasonably recent GNU Emacs (22.1 or later), it should probably
work.  If not, complain!

(defun c-defun-name ()
  "Return the name of the current defun, or NIL if there isn't one.
\"Defun\" here means a function, or other top level construct
with a brace block."
  (interactive)
  (c-save-buffer-state
      (beginning-of-defun-function end-of-defun-function
       where pos name-end)

    (save-excursion
      ;; Move back out of any macro/comment/string we happen to be in.
      (c-beginning-of-macro)
      (setq pos (c-literal-limits))
      (if pos (goto-char (car pos)))

      (setq where (c-where-wrt-brace-construct))

      ;; Move to the beginning of the current defun, if any, if we're not
      ;; already there.
      (if (eq where 'outwith-function)
          nil
        (unless (eq where 'at-header)
          (c-backward-to-nth-BOF-{ 1 where)
          (c-beginning-of-decl-1))

        ;; Pick out the defun name, according to the type of defun.
        (cond
         ((and (looking-at c-type-prefix-key)
               (progn (c-forward-token-2 2) ; over "struct foo "
                      (eq (char-after) ?\{)))
          ;; struct, union, enum, or similar:
          (c-backward-syntactic-ws)
          (setq name-end (point))
          (buffer-substring-no-properties
           (progn
             (c-backward-token-2 2)
             (point))
           name-end))

         ((looking-at "DEFUN\\_>")
          ;; DEFUN ("file-name-directory", Ffile_name_directory, 
Sfile_name_directory, ...) ==> Ffile_name_directory
          ;; DEFUN(POSIX::STREAM-LOCK, stream lockp &key BLOCK SHARED START 
LENGTH) ==> POSIX::STREAM-LOCK
          (down-list 1)
          (c-forward-syntactic-ws)
          (when (eq (char-after) ?\")
            (forward-sexp 1)
            (c-forward-token-2))        ; over the comma and following WS.
          (buffer-substring-no-properties
           (point)
           (progn
             (c-forward-token-2)
             (c-backward-syntactic-ws)
             (point))))

         (t
         ;; Normal function or initializer.
          (when (c-syntactic-re-search-forward "[{(]" nil t)
            (backward-char)
            (c-backward-syntactic-ws)
            (when (eq (char-before) ?\=) ; struct foo bar = {0, 0} ;
              (c-backward-token-2)
              (c-backward-syntactic-ws))
            (setq name-end (point))
            (c-backward-token-2)
            (buffer-substring-no-properties (point) name-end))))))))



> Any help very appreciated..

Have fun!

> thanks
> d.

-- 
Alan Mackenzie (Nuremberg, Germany).


<Prev in Thread] Current Thread [Next in Thread>
Privacy Policy