;;; vcursor.el --- manipulate an alternative ("virtual") cursor
;; Copyright (C) 1994, 1996, 1998, 2001, 2002, 2003,
-;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
;; Author: Peter Stephenson <pws@ibmth.df.unipi.it>
;; Maintainer: FSF
;; 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 3, 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:
;; - *IMPORTANT* vcursor-key-bindings is now nil by default, to avoid
;; side-effects when the package is loaded. This means no keys are
;; bound by default. Use customize to change it to t to restore
-;; the old behaviour. (If you do it by hand in .emacs, it
+;; the old behavior. (If you do it by hand in .emacs, it
;; must come before vcursor is loaded.)
;; - You can alter the main variables and the vcursor face via
;; M-x customize: go to the Editing group and find Vcursor.
;; Virtual cursor commands. I got this idea from the old BBC micro.
;; You need Emacs 19 or 20 and a window system for the best effects.
;; For character terminals, at least Emacs 19.29 is required
-;; (special behaviour for the overlay property
+;; (special behavior for the overlay property
;; "before-string" must be implemented). Search for "dumb terminals"
;; for more information.
;;
;; In the "on" state, moving the virtual cursor will copy the
;; moved-over text to the normal cursor position (including when going
;; backwards, though each piece of text moved over is copied forwards:
-;; compare the behaviour of C-S-up and C-S-left).
+;; compare the behavior of C-S-up and C-S-left).
;;
;; However, that's just a small part of the magic. If the virtual
;; cursor goes off the display, it will be redisplayed in some other
;; and also as usual \C-h in this map will list the key definitions, which
;; are designed to be easy to remember.
;;
-;; A special feature is provided by (vcursor-toggle-vcursor-map), bound
+;; A special feature is provided by (vcursor-use-vcursor-map), bound
;; to t in that keymap. With this in effect, the main keymap
;; is overridden by the vcursor map, so keys like \C-p and so on
;; move the vcursor instead. Remember how to turn it off (type t),
:group 'vcursor)
(defcustom vcursor-auto-disable nil
- "*If non-nil, disable the virtual cursor after use.
+ "If non-nil, disable the virtual cursor after use.
Any non-vcursor command will force `vcursor-disable' to be called.
If non-nil but not t, just make sure copying is toggled off, but don't
disable the vcursor."
:group 'vcursor)
(defcustom vcursor-modifiers (list 'control 'shift)
- "*A list of modifiers that are used to define vcursor key bindings."
+ "A list of modifiers that are used to define vcursor key bindings."
:type '(repeat symbol)
:group 'vcursor)
)))
(defcustom vcursor-key-bindings nil
- "*How to bind keys when vcursor is loaded.
+ "How to bind keys when vcursor is loaded.
If t, guess; if `xterm', use bindings suitable for an X terminal; if
`oemacs', use bindings which work on a PC with Oemacs. If nil, don't
define any key bindings.
:version "20.3")
(defcustom vcursor-interpret-input nil
- "*If non-nil, input from the vcursor is treated as interactive input.
+ "If non-nil, input from the vcursor is treated as interactive input.
This will cause text insertion to be much slower. Note that no special
interpretation of strings is done: \"\C-x\" is a string of four
characters. The default is simply to copy strings."
;; automatically handle any new commands using the primitives.
(defcustom vcursor-copy-flag nil
- "*Non-nil means moving vcursor should copy characters moved over to point."
+ "Non-nil means moving vcursor should copy characters moved over to point."
:type 'boolean
:group 'vcursor)
(defvar vcursor-temp-goal-column nil
"Keeps track of temporary goal columns for the virtual cursor.")
-(defvar vcursor-use-vcursor-map nil
- "Non-nil if the vcursor map is mapped directly onto the main keymap.
-See `vcursor-toggle-vcursor-map'.")
-(make-variable-buffer-local 'vcursor-use-vcursor-map)
-
-(defvar vcursor-map nil "Keymap for vcursor command.")
-(define-prefix-command 'vcursor-map)
-
-(define-key vcursor-map "t" 'vcursor-toggle-vcursor-map)
-
-(define-key vcursor-map "\C-p" 'vcursor-previous-line)
-(define-key vcursor-map "\C-n" 'vcursor-next-line)
-(define-key vcursor-map "\C-b" 'vcursor-backward-char)
-(define-key vcursor-map "\C-f" 'vcursor-forward-char)
-
-(define-key vcursor-map "\r" 'vcursor-disable)
-(define-key vcursor-map " " 'vcursor-copy)
-(define-key vcursor-map "\C-y" 'vcursor-copy-word)
-(define-key vcursor-map "\C-i" 'vcursor-toggle-copy)
-(define-key vcursor-map "<" 'vcursor-beginning-of-buffer)
-(define-key vcursor-map ">" 'vcursor-end-of-buffer)
-(define-key vcursor-map "\M-v" 'vcursor-scroll-down)
-(define-key vcursor-map "\C-v" 'vcursor-scroll-up)
-(define-key vcursor-map "o" 'vcursor-other-window)
-(define-key vcursor-map "g" 'vcursor-goto)
-(define-key vcursor-map "x" 'vcursor-swap-point)
-(define-key vcursor-map "\C-s" 'vcursor-isearch-forward)
-(define-key vcursor-map "\C-r" 'vcursor-isearch-backward)
-(define-key vcursor-map "\C-a" 'vcursor-beginning-of-line)
-(define-key vcursor-map "\C-e" 'vcursor-end-of-line)
-(define-key vcursor-map "\M-w" 'vcursor-forward-word)
-(define-key vcursor-map "\M-b" 'vcursor-backward-word)
-(define-key vcursor-map "\M-l" 'vcursor-copy-line)
-(define-key vcursor-map "c" 'vcursor-compare-windows)
-(define-key vcursor-map "k" 'vcursor-execute-key)
-(define-key vcursor-map "\M-x" 'vcursor-execute-command)
+(defvar vcursor-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "t" 'vcursor-use-vcursor-map)
+
+ (define-key map "\C-p" 'vcursor-previous-line)
+ (define-key map "\C-n" 'vcursor-next-line)
+ (define-key map "\C-b" 'vcursor-backward-char)
+ (define-key map "\C-f" 'vcursor-forward-char)
+
+ (define-key map "\r" 'vcursor-disable)
+ (define-key map " " 'vcursor-copy)
+ (define-key map "\C-y" 'vcursor-copy-word)
+ (define-key map "\C-i" 'vcursor-toggle-copy)
+ (define-key map "<" 'vcursor-beginning-of-buffer)
+ (define-key map ">" 'vcursor-end-of-buffer)
+ (define-key map "\M-v" 'vcursor-scroll-down)
+ (define-key map "\C-v" 'vcursor-scroll-up)
+ (define-key map "o" 'vcursor-other-window)
+ (define-key map "g" 'vcursor-goto)
+ (define-key map "x" 'vcursor-swap-point)
+ (define-key map "\C-s" 'vcursor-isearch-forward)
+ (define-key map "\C-r" 'vcursor-isearch-backward)
+ (define-key map "\C-a" 'vcursor-beginning-of-line)
+ (define-key map "\C-e" 'vcursor-end-of-line)
+ (define-key map "\M-w" 'vcursor-forward-word)
+ (define-key map "\M-b" 'vcursor-backward-word)
+ (define-key map "\M-l" 'vcursor-copy-line)
+ (define-key map "c" 'vcursor-compare-windows)
+ (define-key map "k" 'vcursor-execute-key)
+ (define-key map "\M-x" 'vcursor-execute-command)
+ map)
+ "Keymap for vcursor command.")
+;; This seems unused, but it was done as part of define-prefix-command,
+;; so let's keep it for now.
+(fset 'vcursor-map vcursor-map)
;; If vcursor-key-bindings is already set on loading, bind the keys now.
;; This hybrid way of doing it retains compatibility while allowing
(interactive)
(let ((buf (current-buffer)) (here (point)) (win (selected-window)))
(vcursor-goto) ; will disable the vcursor
- (save-excursion
- (set-buffer buf)
+ (with-current-buffer buf
(setq vcursor-window win)
(vcursor-move here)))
)
out how much to copy."
(vcursor-check)
- (save-excursion
- (set-buffer (overlay-buffer vcursor-overlay))
+ (with-current-buffer (overlay-buffer vcursor-overlay)
(let ((start (goto-char (overlay-start vcursor-overlay))))
(- (progn (apply func args) (point)) start)))
)
(t (error "The virtual cursor is not active now")))
)
+(define-minor-mode vcursor-use-vcursor-map
+ "Toggle the state of the vcursor key map.
+When on, the keys defined in it are mapped directly on top of the main
+keymap, allowing you to move the vcursor with ordinary motion keys.
+An indication \"!VC\" appears in the mode list. The effect is
+local to the current buffer.
+Disabling the vcursor automatically turns this off."
+ :keymap vcursor-map
+ :lighter " !VC")
+
(defun vcursor-disable (&optional arg)
"Disable the virtual cursor.
Next time you use it, it will start from point.
((and arg (< (prefix-numeric-value arg) 0))
(vcursor-move (point))
(setq vcursor-window (selected-window)))
- (vcursor-use-vcursor-map (vcursor-toggle-vcursor-map 0)))
+ (vcursor-use-vcursor-map (vcursor-use-vcursor-map 0)))
(setq vcursor-copy-flag nil)
)
;; We don't use fancy vcursor-find-window trickery, since we're
;; quite happy to have the vcursor cycle back into the current
;; window.
- (let ((sw (selected-window))
- (win (vcursor-find-window nil nil (not all-frames))))
+ (let ((win (vcursor-find-window nil nil (not all-frames))))
(if win (select-window win))
;; else start from here
(other-window n all-frames)
;; (vcursor-window-funcall 'compare-windows arg)
(require 'compare-w)
(let* (p1 p2 maxp1 maxp2 b1 b2 w2
- success size
+ success
(opoint1 (point))
opoint2
(skip-whitespace (if ignore-whitespace
(setq p2 (point) b2 (current-buffer)))
(setq opoint2 p2)
(setq maxp1 (point-max))
- (save-excursion
- (set-buffer b2)
+ (with-current-buffer b2
(setq maxp2 (point-max)))
(setq success t)
(and skip-whitespace
(save-excursion
- (let (p1a p2a w1 w2 result1 result2)
+ (let (p1a p2a result1 result2)
(setq result1
(if (stringp skip-whitespace)
(compare-windows-skip-whitespace opoint1)
(interactive "p")
(vcursor-check)
(vcursor-insert
- (save-excursion
- (set-buffer (overlay-buffer vcursor-overlay))
+ (with-current-buffer (overlay-buffer vcursor-overlay)
(let* ((ostart (overlay-start vcursor-overlay))
(end (+ ostart arg)))
(prog1
(vcursor-copy (if (or (= count 0) arg) (1+ count) count)))
)
-(defun vcursor-toggle-vcursor-map (&optional force noredisp)
- "Toggle the state of the vcursor key map.
-When on, the keys defined in it are mapped directly on top of the main
-keymap, allowing you to move the vcursor with ordinary motion keys.
-An indication \"!VC\" appears in the mode list. The effect is
-local to the current buffer.
-With prefix FORCE, turn on, or off if it is 0.
-With NOREDISP, don't force redisplay.
-Disabling the vcursor automatically turns this off."
- (interactive "P")
- (let ((new (cond ((not force) (not vcursor-use-vcursor-map))
- ((eq force 0) nil)
- (t))))
- (or (eq new vcursor-use-vcursor-map)
- (progn
- (setq vcursor-use-vcursor-map new)
- (or (assq 'vcursor-use-vcursor-map minor-mode-map-alist)
- (setq minor-mode-map-alist
- (cons (cons 'vcursor-use-vcursor-map vcursor-map)
- minor-mode-map-alist)))
- (or (assq 'vcursor-use-vcursor-map minor-mode-alist)
- (setq minor-mode-alist
- (cons (list 'vcursor-use-vcursor-map " !VC")
- minor-mode-alist)))
- (or noredisp (redraw-display)))))
- )
+(define-obsolete-function-alias
+ 'vcursor-toggle-vcursor-map 'vcursor-use-vcursor-map "23.1")
(defun vcursor-post-command ()
(and vcursor-auto-disable (not vcursor-last-command)
(provide 'vcursor)
-;;; arch-tag: cdfe1cdc-2c46-4046-88e4-ed57d20f7aca
+;; arch-tag: cdfe1cdc-2c46-4046-88e4-ed57d20f7aca
;;; vcursor.el ends here