bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patch for pc-select.el


From: Martin Pohlack
Subject: Patch for pc-select.el
Date: Wed, 14 Nov 2007 22:18:07 +0100
User-agent: Thunderbird 2.0.0.6 (X11/20070802)

Hi,

I tried to send the patch below to the author of pc-select.el, but his
address is no longer valid.  So I'm resending it to this address.

----------------------------------------------------------------------

Hi,

I just recently switched to emacs (from xemacs) and found the behavior
of pc-selection-mode (pc-select.el) a little bit irritating.

Attached is a patch which fixes this.  It basically allows using the
shift+move selection at the same time as Ctrl-Space+Move selection mode.

Originally, normal move operations (without shift) would disable the
mark unconditionally, thereby disabling the region for
Ctrl-Space-started operations.

Cheers,
Martin Pohlack

This patch adds tracking whether we ourselves did activate the mark.
If not, we should not deactivate it later on with our move functions.

This prevents interference between manually starting a selection
(Ctrl-Space + Move) and doing shifted moves.  Both can now be used at
the same time (as in xemacs).

--- /usr/share/emacs/23.0.60/lisp/emulation/pc-select.el        2007-11-06 
10:12:29.000000000 +0100
+++ pc-select.el        2007-11-14 18:05:22.000000000 +0100
@@ -254,6 +254,10 @@
 `function-key-map' before PC Selection mode had changed that
 association.")
 
+(defvar pc-select-shifted-mark nil
+  "Holds whether we ourselves did activate the mark.  Only then
+  should we deactivate if later on.")
+
 ;;;;
 ;; misc
 ;;;;
@@ -284,7 +288,15 @@
 (defun ensure-mark()
   ;; make sure mark is active
   ;; test if it is active, if it isn't, set it and activate it
-  (or mark-active (set-mark-command nil)))
+  (or mark-active (set-mark-command nil))
+  (setq pc-select-shifted-mark t))
+
+(defun maybe-deactivate-mark()
+  ;; maybe switch off mark (only if *we* switched it on)
+  (if pc-select-shifted-mark
+      (progn
+        (setq mark-active nil)
+        (setq pc-select-shifted-mark nil))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;; forward and mark
@@ -427,7 +439,7 @@
   "Deactivate mark; move point right ARG characters \(left if ARG negative).
 On reaching end of buffer, stop and signal error."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (forward-char arg))
 
 (defun forward-word-nomark (&optional arg)
@@ -436,13 +448,13 @@
 If an edge of the buffer is reached, point is left there
 and nil is returned."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (forward-word arg))
 
 (defun forward-line-nomark (&optional arg)
   "Deactivate mark; move cursor vertically down ARG lines."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (forward-line arg)
   (setq this-command 'forward-line)
 )
@@ -452,7 +464,7 @@
 With argument, do it that many times.  Negative arg -N means
 move backward across N balanced expressions."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (forward-sexp arg))
 
 (defun forward-paragraph-nomark (&optional arg)
@@ -464,7 +476,7 @@
 A paragraph end is the beginning of a line which is not part of the paragraph
 to which the end of the previous line belongs, or the end of the buffer."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (forward-paragraph arg))
 
 (defun next-line-nomark (&optional arg)
@@ -483,7 +495,7 @@
 Then it does not try to move vertically.  This goal column is stored
 in `goal-column', which is nil when there is none."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (with-no-warnings (next-line arg))
   (setq this-command 'next-line))
 
@@ -492,14 +504,14 @@
 With argument ARG not nil or 1, move forward ARG - 1 lines first.
 If scan reaches end of buffer, stop there without error."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (end-of-line arg)
   (setq this-command 'end-of-line))
 
 (defun backward-line-nomark (&optional arg)
   "Deactivate mark; move cursor vertically up ARG lines."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (if (null arg)
       (setq arg 1))
   (forward-line (- arg))
@@ -512,7 +524,7 @@
 Negative ARG means scroll upward.
 When calling from a program, supply a number as argument or nil."
   (interactive "P")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (cond (pc-select-override-scroll-error
         (condition-case nil (scroll-down arg)
           (beginning-of-buffer (goto-char (point-min)))))
@@ -528,7 +540,7 @@
 Don't use this command in Lisp programs!
 \(goto-char (point-max)) is faster and avoids clobbering the mark."
   (interactive "P")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (let ((size (- (point-max) (point-min))))
     (goto-char (if arg
                   (- (point-max)
@@ -663,14 +675,14 @@
   "Deactivate mark; move point left ARG characters (right if ARG negative).
 On attempt to pass beginning or end of buffer, stop and signal error."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (backward-char arg))
 
 (defun backward-word-nomark (&optional arg)
   "Deactivate mark; move backward until encountering the end of a word.
 With argument, do this that many times."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (backward-word arg))
 
 (defun backward-sexp-nomark (&optional arg)
@@ -678,7 +690,7 @@
 With argument, do it that many times.  Negative arg -N means
 move forward across N balanced expressions."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (backward-sexp arg))
 
 (defun backward-paragraph-nomark (&optional arg)
@@ -693,7 +705,7 @@
 
 See `forward-paragraph' for more information."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (backward-paragraph arg))
 
 (defun previous-line-nomark (&optional arg)
@@ -706,7 +718,7 @@
 a semipermanent goal column to which this command always moves.
 Then it does not try to move vertically."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (with-no-warnings (previous-line arg))
   (setq this-command 'previous-line))
 
@@ -715,7 +727,7 @@
 With argument ARG not nil or 1, move forward ARG - 1 lines first.
 If scan reaches end of buffer, stop there without error."
   (interactive "p")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (beginning-of-line arg))
 
 (defun scroll-up-nomark (&optional arg)
@@ -724,7 +736,7 @@
 Negative ARG means scroll downward.
 When calling from a program, supply a number as argument or nil."
   (interactive "P")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (cond (pc-select-override-scroll-error
         (condition-case nil (scroll-up arg)
           (end-of-buffer (goto-char (point-max)))))
@@ -740,7 +752,7 @@
 Don't use this command in Lisp programs!
 \(goto-char (point-min)) is faster and avoids clobbering the mark."
   (interactive "P")
-  (setq mark-active nil)
+  (maybe-deactivate-mark)
   (let ((size (- (point-max) (point-min))))
     (goto-char (if arg
                   (+ (point-min)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]