mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-05 11:45:45 +00:00
CC Mode: Amend C-M-a/e to handle lambda function in C++ arglist
* lisp/progmodes/cc-cmds.el (c-where-wrt-brace-construct): Reformulate latter part such that the least enclosing braces and parentheses are used when determining containment in such. c-beginning-of-decl-1 has been superseded by list movement and syntactic whitespace movement. (c-backward-to-nth-BOF-{): Work on least enclosing parens rather than parens at any level when moving back to an opening brace. (c-forward-to-nth-EOF-\;-or-}): Work on least enclosing parens, as above. Move the correction of point when in a "function trailer" to after the main loop, correcting a minor bug.
This commit is contained in:
parent
d56b1f9e7c
commit
4d35faa1db
@ -1639,7 +1639,7 @@ No indentation or other \"electric\" behavior is performed."
|
||||
;;
|
||||
;; This function might do hidden buffer changes.
|
||||
(save-excursion
|
||||
(let* (kluge-start
|
||||
(let* (knr-start knr-res
|
||||
decl-result brace-decl-p
|
||||
(start (point))
|
||||
(paren-state (c-parse-state))
|
||||
@ -1670,63 +1670,39 @@ No indentation or other \"electric\" behavior is performed."
|
||||
(not (looking-at c-defun-type-name-decl-key))))))
|
||||
'at-function-end)
|
||||
(t
|
||||
;; Find the start of the current declaration. NOTE: If we're in the
|
||||
;; variables after a "struct/eval" type block, we don't get to the
|
||||
;; real declaration here - we detect and correct for this later.
|
||||
|
||||
;;If we're in the parameters' parens, move back out of them.
|
||||
(if least-enclosing (goto-char least-enclosing))
|
||||
;; Kluge so that c-beginning-of-decl-1 won't go back if we're already
|
||||
;; at a declaration.
|
||||
(if (or (and (eolp) (not (eobp))) ; EOL is matched by "\\s>"
|
||||
(not (looking-at
|
||||
"\\([;#]\\|\\'\\|\\s(\\|\\s)\\|\\s\"\\|\\s\\\\|\\s$\\|\\s<\\|\\s>\\|\\s!\\)")))
|
||||
(forward-char))
|
||||
(setq kluge-start (point))
|
||||
;; First approximation as to whether the current "header" we're in is
|
||||
;; one followed by braces.
|
||||
(setq brace-decl-p
|
||||
(save-excursion
|
||||
(and (c-syntactic-re-search-forward "[;{]" nil t t)
|
||||
(or (eq (char-before) ?\{)
|
||||
(and c-recognize-knr-p
|
||||
;; Might have stopped on the
|
||||
;; ';' in a K&R argdecl. In
|
||||
;; that case the declaration
|
||||
;; should contain a block.
|
||||
(c-in-knr-argdecl))))))
|
||||
(setq decl-result
|
||||
(car (c-beginning-of-decl-1
|
||||
;; NOTE: If we're in a K&R region, this might be the start
|
||||
;; of a parameter declaration, not the actual function.
|
||||
;; It might also leave us at a label or "label" like
|
||||
;; "private:".
|
||||
(and least-enclosing ; LIMIT for c-b-of-decl-1
|
||||
(c-safe-position least-enclosing paren-state)))))
|
||||
|
||||
;; Has the declaration we've gone back to got braces?
|
||||
(if (or (eq decl-result 'label)
|
||||
(looking-at c-protection-key))
|
||||
(setq brace-decl-p nil))
|
||||
|
||||
(cond
|
||||
((or (eq decl-result 'label) ; e.g. "private:" or invalid syntax.
|
||||
(= (point) kluge-start)) ; might be BOB or unbalanced parens.
|
||||
'outwith-function)
|
||||
((eq decl-result 'same)
|
||||
(if brace-decl-p
|
||||
(if (eq (point) start)
|
||||
'at-header
|
||||
(if (and least-enclosing
|
||||
(eq (char-after least-enclosing) ?\())
|
||||
(c-go-list-forward least-enclosing))
|
||||
(c-forward-syntactic-ws)
|
||||
(setq knr-start (point))
|
||||
(if (c-syntactic-re-search-forward "{" nil t t)
|
||||
(progn
|
||||
(backward-char)
|
||||
(cond
|
||||
((or (progn
|
||||
(c-backward-syntactic-ws)
|
||||
(<= (point) start))
|
||||
(and c-recognize-knr-p
|
||||
(and (setq knr-res (c-in-knr-argdecl))
|
||||
(<= knr-res knr-start))))
|
||||
'in-header)
|
||||
'outwith-function))
|
||||
((eq decl-result 'previous)
|
||||
(if (and (not brace-decl-p)
|
||||
(c-in-function-trailer-p))
|
||||
'at-function-end
|
||||
'outwith-function))
|
||||
(t (error
|
||||
"c-where-wrt-brace-construct: c-beginning-of-decl-1 returned %s"
|
||||
decl-result))))))))
|
||||
((and knr-res
|
||||
(goto-char knr-res)
|
||||
(c-backward-syntactic-ws))) ; Always returns nil.
|
||||
((and (eq (char-before) ?\))
|
||||
(c-go-list-backward))
|
||||
(c-syntactic-skip-backward "^;" start t)
|
||||
(if (eq (point) start)
|
||||
(if (progn (c-backward-syntactic-ws)
|
||||
(memq (char-before) '(?\; ?} nil)))
|
||||
(if (progn (c-forward-syntactic-ws)
|
||||
(eq (point) start))
|
||||
'at-header
|
||||
'outwith-function)
|
||||
'in-header)
|
||||
'outwith-function))
|
||||
(t 'outwith-function)))
|
||||
'outwith-function))))))
|
||||
|
||||
(defun c-backward-to-nth-BOF-{ (n where)
|
||||
;; Skip to the opening brace of the Nth function before point. If
|
||||
@ -1749,9 +1725,11 @@ No indentation or other \"electric\" behavior is performed."
|
||||
(goto-char (c-least-enclosing-brace (c-parse-state)))
|
||||
(setq n (1- n)))
|
||||
((eq where 'in-header)
|
||||
(c-syntactic-re-search-forward "{")
|
||||
(backward-char)
|
||||
(setq n (1- n)))
|
||||
(let ((encl-paren (c-least-enclosing-brace (c-parse-state))))
|
||||
(if encl-paren (goto-char encl-paren))
|
||||
(c-syntactic-re-search-forward "{" nil t t)
|
||||
(backward-char)
|
||||
(setq n (1- n))))
|
||||
((memq where '(at-header outwith-function at-function-end in-trailer))
|
||||
(c-syntactic-skip-backward "^}")
|
||||
(when (eq (char-before) ?\})
|
||||
@ -1965,21 +1943,24 @@ defun."
|
||||
;; The actual movement is done below.
|
||||
(setq n (1- n)))
|
||||
((memq where '(at-function-end outwith-function at-header in-header))
|
||||
(when (c-syntactic-re-search-forward "{" nil 'eob)
|
||||
(if (eq where 'in-header)
|
||||
(let ((pos (c-least-enclosing-brace (c-parse-state))))
|
||||
(if pos (c-go-list-forward pos))))
|
||||
(when (c-syntactic-re-search-forward "{" nil 'eob t)
|
||||
(backward-char)
|
||||
(forward-sexp)
|
||||
(setq n (1- n))))
|
||||
(t (error "c-forward-to-nth-EOF-\\;-or-}: `where' is %s" where)))
|
||||
|
||||
(when (c-in-function-trailer-p)
|
||||
(c-syntactic-re-search-forward ";" nil 'eob t))
|
||||
|
||||
;; Each time round the loop, go forward to a "}" at the outermost level.
|
||||
(while (and (> n 0) (not (eobp)))
|
||||
(when (c-syntactic-re-search-forward "{" nil 'eob)
|
||||
(backward-char)
|
||||
(forward-sexp)
|
||||
(setq n (1- n))))
|
||||
|
||||
(when (c-in-function-trailer-p)
|
||||
(c-syntactic-re-search-forward ";" nil 'eob t))
|
||||
n)
|
||||
|
||||
(defun c-end-of-defun (&optional arg)
|
||||
|
Loading…
Reference in New Issue
Block a user