Make c-mark-defun extend region when repeated, and leave a mark.

Fixes bugs #5525, #10906.
This commit is contained in:
Alan Mackenzie 2012-03-08 11:32:57 +00:00
parent 5aca4f7140
commit 9cec78342c
2 changed files with 31 additions and 3 deletions

View file

@ -1,3 +1,10 @@
2012-03-08 Alan Mackenzie <acm@muc.de>
* progmodes/cc-cmds.el (c-mark-function): Make it leave a mark at
the starting position; make it extend the marked region when
invoked repeatedly - all under appropriate circumstances.
Fixes bugs #5525, #10906.
2012-03-08 Glenn Morris <rgm@gnu.org>
* files.el (locate-dominating-file, dir-locals-find-file):

View file

@ -1958,7 +1958,12 @@ with a brace block."
(defun c-mark-function ()
"Put mark at end of the current top-level declaration or macro, point at beginning.
If point is not inside any then the closest following one is chosen.
If point is not inside any then the closest following one is
chosen. Each successive call of this command extends the marked
region by one function.
A mark is left where the command started, unless the region is already active
\(in Transient Mark mode).
As opposed to \\[c-beginning-of-defun] and \\[c-end-of-defun], this
function does not require the declaration to contain a brace block."
@ -1974,8 +1979,24 @@ function does not require the declaration to contain a brace block."
(if (not decl-limits)
(error "Cannot find any declaration")
(goto-char (car decl-limits))
(push-mark (cdr decl-limits) nil t))))
(let* ((extend-region-p
(and (eq this-command 'c-mark-function)
(eq last-command 'c-mark-function)))
(push-mark-p (and (eq this-command 'c-mark-function)
(not extend-region-p)
(not (and transient-mark-mode mark-active)))))
(if push-mark-p (push-mark (point)))
(if extend-region-p
(progn
(exchange-point-and-mark)
(setq decl-limits (c-declaration-limits t))
(when (not decl-limits)
(exchange-point-and-mark)
(error "Cannot find any declaration"))
(goto-char (cdr decl-limits))
(exchange-point-and-mark))
(goto-char (car decl-limits))
(push-mark (cdr decl-limits) nil t))))))
(defun c-cpp-define-name ()
"Return the name of the current CPP macro, or NIL if we're not in one."