From 9cec78342c003b09a961c1b501eba55e14ef32cc Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Thu, 8 Mar 2012 11:32:57 +0000 Subject: [PATCH] Make c-mark-defun extend region when repeated, and leave a mark. Fixes bugs #5525, #10906. --- lisp/ChangeLog | 7 +++++++ lisp/progmodes/cc-cmds.el | 27 ++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index bc097448aeb..7673b1fc429 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2012-03-08 Alan Mackenzie + + * 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 * files.el (locate-dominating-file, dir-locals-find-file): diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el index 509bb203f78..55ab6c9981c 100644 --- a/lisp/progmodes/cc-cmds.el +++ b/lisp/progmodes/cc-cmds.el @@ -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." -- 2.11.4.GIT