GNU bug report logs -
#10906
24.0.94; `c-mark-function' does set the mark well
Previous Next
Reported by: Dani Moncayo <dmoncayo <at> gmail.com>
Date: Tue, 28 Feb 2012 12:41:01 UTC
Severity: normal
Found in version 24.0.94
Done: Alan Mackenzie <acm <at> muc.de>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Hello, Dani.
On Mon, Mar 05, 2012 at 11:36:52PM +0100, Dani Moncayo wrote:
> On Mon, Mar 5, 2012 at 19:41, Alan Mackenzie <acm <at> muc.de> wrote:
> > Here is a patch which should fix these problems. The logic around
> > transient-mark-mode is somewhat complicated, so I would be grateful if
> > you would check the patch does the Right Thing. I haven't amended the
> > doc string yet. Thanks!
> Thank you.
> I've tried your patch, and it seems to work[*], at least with my usage
> pattern, i.e., with `transient-mark-mode' enabled.
> [*] Except for one thing:
> - If you do `C-M-h' several times in a row until the mark reaches the
> end of the file, the point ends up at the end of the region, and the
> mark at the beginning (which doesn't seem right).
> - If you try the same experiment with `mark-defun', the mark stays at
> the end and the point at the start of the region (as expected).
Thanks for spotting that.
Here's a revised patch. I think it'll work this time.
diff -r f6961b0b1c51 cc-cmds.el
--- a/cc-cmds.el Fri Mar 02 21:25:40 2012 +0000
+++ b/cc-cmds.el Wed Mar 07 21:06:31 2012 +0000
@@ -1950,7 +1950,12 @@
(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."
@@ -1966,8 +1971,24 @@
(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
+ (or (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."
> --
> Dani Moncayo
--
Alan Mackenzie (Nuremberg, Germany).
This bug report was last modified 13 years and 133 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.