;;; including key bindings.
;; Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007 Free Software Foundation, Inc.
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Michael Staats <michael@thp.Uni-Duisburg.DE>
;; Keywords: convenience emulation
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; programs (which is the same as the MAC gui and (sorry for that) MS-Windows).
;; It modifies the keybindings of the cursor keys and the next, prior,
;; home and end keys. They will modify mark-active.
-;; You can still get the old behaviour of cursor moving with the
+;; You can still get the old behavior of cursor moving with the
;; control sequences C-f, C-b, etc.
;; This package uses transient-mark-mode and
;; delete-selection-mode.
;; which will operate on the active region
;; It was not possible to bind them to C-v, C-x and C-c for obvious
;; emacs reasons.
-;; They will be bound according to the "old" behaviour to S-delete (cut),
+;; They will be bound according to the "old" behavior to S-delete (cut),
;; S-insert (paste) and C-insert (copy). These keys do the same in many
;; other programs.
;;
(unless pc-select-default-key-bindings
(let ((lst
- ;; This is to avoid confusion with the delete-selection-mode
- ;; On simple displays you cant see that a region is active and
+ ;; This is to avoid confusion with the delete-selection-mode.
+ ;; On simple displays you can't see that a region is active and
;; will be deleted on the next keypress IMHO especially for
;; copy-region-as-kill this is confusing.
;; The same goes for exchange-point-and-mark
([prior] . scroll-down-nomark)
;; Next four lines are from Pete Forman.
- ([C-down] . forward-paragraph-nomark) ; KNextPara cDn
+ ([C-down] . forward-paragraph-nomark) ; KNextPara cDn
([C-up] . backward-paragraph-nomark) ; KPrevPara cUp
([S-C-down] . forward-paragraph-mark)
([S-C-up] . backward-paragraph-mark))))
;;;;
;; non-interactive
;;;;
-(defun ensure-mark()
+(defun pc-select-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))
+ ;; Remember who activated the mark.
+ (setq mark-active 'pc-select))
+
+(defun pc-select-maybe-deactivate-mark ()
+ ;; maybe switch off mark (only if *we* switched it on)
+ (when (eq mark-active 'pc-select)
+ (deactivate-mark)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;; forward and mark
"Ensure mark is active; move point right ARG characters (left if ARG negative).
On reaching end of buffer, stop and signal error."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(forward-char arg))
(defun forward-word-mark (&optional arg)
If an edge of the buffer is reached, point is left there
and nil is returned."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(forward-word arg))
(defun forward-line-mark (&optional arg)
"Ensure mark is active; move cursor vertically down ARG lines."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(forward-line arg)
(setq this-command 'forward-line)
)
With argument, do it that many times. Negative arg -N means
move backward across N balanced expressions."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(forward-sexp arg))
(defun forward-paragraph-mark (&optional arg)
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")
- (ensure-mark)
+ (pc-select-ensure-mark)
(forward-paragraph arg))
(defun next-line-mark (&optional arg)
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")
- (ensure-mark)
- (next-line arg)
+ (pc-select-ensure-mark)
+ (with-no-warnings (next-line arg))
(setq this-command 'next-line))
(defun end-of-line-mark (&optional arg)
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")
- (ensure-mark)
+ (pc-select-ensure-mark)
(end-of-line arg)
(setq this-command 'end-of-line))
(defun backward-line-mark (&optional arg)
"Ensure mark is active; move cursor vertically up ARG lines."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(if (null arg)
(setq arg 1))
(forward-line (- arg))
Negative ARG means scroll upward.
When calling from a program, supply a number as argument or nil."
(interactive "P")
- (ensure-mark)
+ (pc-select-ensure-mark)
(cond (pc-select-override-scroll-error
(condition-case nil (scroll-down arg)
(beginning-of-buffer (goto-char (point-min)))))
Don't use this command in Lisp programs!
\(goto-char \(point-max)) is faster and avoids clobbering the mark."
(interactive "P")
- (ensure-mark)
+ (pc-select-ensure-mark)
(let ((size (- (point-max) (point-min))))
(goto-char (if arg
(- (point-max)
"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)
+ (pc-select-maybe-deactivate-mark)
(forward-char arg))
(defun forward-word-nomark (&optional arg)
If an edge of the buffer is reached, point is left there
and nil is returned."
(interactive "p")
- (setq mark-active nil)
+ (pc-select-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)
+ (pc-select-maybe-deactivate-mark)
(forward-line arg)
(setq this-command 'forward-line)
)
With argument, do it that many times. Negative arg -N means
move backward across N balanced expressions."
(interactive "p")
- (setq mark-active nil)
+ (pc-select-maybe-deactivate-mark)
(forward-sexp arg))
(defun forward-paragraph-nomark (&optional arg)
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)
+ (pc-select-maybe-deactivate-mark)
(forward-paragraph arg))
(defun next-line-nomark (&optional arg)
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)
- (next-line arg)
+ (pc-select-maybe-deactivate-mark)
+ (with-no-warnings (next-line arg))
(setq this-command 'next-line))
(defun end-of-line-nomark (&optional arg)
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)
+ (pc-select-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)
+ (pc-select-maybe-deactivate-mark)
(if (null arg)
(setq arg 1))
(forward-line (- arg))
Negative ARG means scroll upward.
When calling from a program, supply a number as argument or nil."
(interactive "P")
- (setq mark-active nil)
+ (pc-select-maybe-deactivate-mark)
(cond (pc-select-override-scroll-error
(condition-case nil (scroll-down arg)
(beginning-of-buffer (goto-char (point-min)))))
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)
+ (pc-select-maybe-deactivate-mark)
(let ((size (- (point-max) (point-min))))
(goto-char (if arg
(- (point-max)
"Ensure mark is active; move point left ARG characters (right if ARG negative).
On attempt to pass beginning or end of buffer, stop and signal error."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(backward-char arg))
(defun backward-word-mark (&optional arg)
"Ensure mark is active; move backward until encountering the end of a word.
With argument, do this that many times."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(backward-word arg))
(defun backward-sexp-mark (&optional arg)
With argument, do it that many times. Negative arg -N means
move forward across N balanced expressions."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(backward-sexp arg))
(defun backward-paragraph-mark (&optional arg)
See `forward-paragraph' for more information."
(interactive "p")
- (ensure-mark)
+ (pc-select-ensure-mark)
(backward-paragraph arg))
(defun previous-line-mark (&optional arg)
`forward-line' with a negative argument instead. It is usually easier
to use and more reliable (no dependence on goal column, etc.)."
(interactive "p")
- (ensure-mark)
- (previous-line arg)
+ (pc-select-ensure-mark)
+ (with-no-warnings (previous-line arg))
(setq this-command 'previous-line))
(defun beginning-of-line-mark (&optional arg)
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")
- (ensure-mark)
+ (pc-select-ensure-mark)
(beginning-of-line arg))
Negative ARG means scroll downward.
When calling from a program, supply a number as argument or nil."
(interactive "P")
- (ensure-mark)
+ (pc-select-ensure-mark)
(cond (pc-select-override-scroll-error
(condition-case nil (scroll-up arg)
(end-of-buffer (goto-char (point-max)))))
Don't use this command in Lisp programs!
\(goto-char (p\oint-min)) is faster and avoids clobbering the mark."
(interactive "P")
- (ensure-mark)
+ (pc-select-ensure-mark)
(let ((size (- (point-max) (point-min))))
(goto-char (if arg
(+ (point-min)
"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)
+ (pc-select-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)
+ (pc-select-maybe-deactivate-mark)
(backward-word arg))
(defun backward-sexp-nomark (&optional arg)
With argument, do it that many times. Negative arg -N means
move forward across N balanced expressions."
(interactive "p")
- (setq mark-active nil)
+ (pc-select-maybe-deactivate-mark)
(backward-sexp arg))
(defun backward-paragraph-nomark (&optional arg)
See `forward-paragraph' for more information."
(interactive "p")
- (setq mark-active nil)
+ (pc-select-maybe-deactivate-mark)
(backward-paragraph arg))
(defun previous-line-nomark (&optional arg)
a semipermanent goal column to which this command always moves.
Then it does not try to move vertically."
(interactive "p")
- (setq mark-active nil)
- (previous-line arg)
+ (pc-select-maybe-deactivate-mark)
+ (with-no-warnings (previous-line arg))
(setq this-command 'previous-line))
(defun beginning-of-line-nomark (&optional arg)
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)
+ (pc-select-maybe-deactivate-mark)
(beginning-of-line arg))
(defun scroll-up-nomark (&optional arg)
Negative ARG means scroll downward.
When calling from a program, supply a number as argument or nil."
(interactive "P")
- (setq mark-active nil)
+ (pc-select-maybe-deactivate-mark)
(cond (pc-select-override-scroll-error
(condition-case nil (scroll-up arg)
(end-of-buffer (goto-char (point-max)))))
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)
+ (pc-select-maybe-deactivate-mark)
(let ((size (- (point-max) (point-min))))
(goto-char (if arg
(+ (point-min)
(setq pc-select-key-bindings-alist nil
pc-select-saved-settings-alist nil))))
-
-;;;###autoload
-(defcustom pc-selection-mode nil
- "Toggle PC Selection mode.
-Change mark behavior to emulate Motif, MAC or MS-Windows cut and paste style,
-and cursor movement commands.
-This mode enables Delete Selection mode and Transient Mark mode.
-Setting this variable directly does not take effect;
-you must modify it using \\[customize] or \\[pc-selection-mode]."
- :set (lambda (symbol value)
- (pc-selection-mode (if value 1 -1)))
- :initialize 'custom-initialize-default
- :type 'boolean
- :group 'pc-select
- :require 'pc-select)
-
-;;; arch-tag: 10697b70-ae07-4f3e-ad23-7814a3f418c2
+;; arch-tag: 10697b70-ae07-4f3e-ad23-7814a3f418c2
;;; pc-select.el ends here