Move lisp/emacs-lisp/authors.el to admin/
[bpt/emacs.git] / lisp / obsolete / s-region.el
CommitLineData
e8af40ee 1;;; s-region.el --- set region using shift key
b578f267 2
ba318903 3;; Copyright (C) 1994-1995, 2001-2014 Free Software Foundation, Inc.
d6eac7d4 4
0acdb863 5;; Author: Morten Welinder <terra@diku.dk>
d6eac7d4 6;; Keywords: terminals
c5e87d10 7;; Favorite-brand-of-beer: None, I hate beer.
5e418f17 8;; Obsolete-since: 24.1
d6eac7d4
RS
9
10;; This file is part of GNU Emacs.
11
eb3fa2cf 12;; GNU Emacs is free software: you can redistribute it and/or modify
d6eac7d4 13;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
14;; the Free Software Foundation, either version 3 of the License, or
15;; (at your option) any later version.
d6eac7d4
RS
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
eb3fa2cf 23;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
d6eac7d4
RS
24
25;;; Commentary:
26
27;; Having loaded this code you can set the region by holding down the
28;; shift key and move the cursor to the other end of the region. The
a7acbbe4 29;; functionality provided by this code is similar to that provided by
d6eac7d4
RS
30;; the editors of Borland International's compilers for ms-dos.
31
32;; Currently, s-region-move may be bound only to events that are vectors
33;; of length one and whose last element is a symbol. Also, the functions
f1180544 34;; that are given this kind of overlay should be (interactive "p")
d6eac7d4
RS
35;; functions.
36
9af40217 37;; If the following keys are not already bound then...
d6eac7d4
RS
38;; C-insert is bound to copy-region-as-kill
39;; S-delete is bound to kill-region
40;; S-insert is bound to yank
41
42;;; Code:
43
44(defvar s-region-overlay (make-overlay 1 1))
45(overlay-put s-region-overlay 'face 'region)
46(overlay-put s-region-overlay 'priority 1000000) ; for hilit19
47
48(defun s-region-unshift (key)
49 "Remove shift modifier from last keypress KEY and return that as a key."
50 (if (vectorp key)
51 (let ((last (aref key (1- (length key)))))
52 (if (symbolp last)
53 (let* ((keyname (symbol-name last))
54 (pos (string-match "S-" keyname)))
55 (if pos
56 ;; We skip all initial parts of the event assuming that
57 ;; those are setting up the prefix argument to the command.
58 (vector (intern (concat (substring keyname 0 pos)
59 (substring keyname (+ 2 pos)))))
60 (error "Non-shifted key: %S" key)))
61 (error "Key does not end in a symbol: %S" key)))
62 (error "Non-vector key: %S" key)))
63
573228ae 64(defun s-region-move-p1 (&rest arg)
bd7c852a 65 "This is an overlay function to point-moving keys that are interactive \"p\"."
d6eac7d4 66 (interactive "p")
573228ae
KH
67 (apply (function s-region-move) arg))
68
69(defun s-region-move-p2 (&rest arg)
bd7c852a 70 "This is an overlay function to point-moving keys that are interactive \"P\"."
573228ae
KH
71 (interactive "P")
72 (apply (function s-region-move) arg))
73
74(defun s-region-move (&rest arg)
d6eac7d4
RS
75 (if (if mark-active (not (equal last-command 's-region-move)) t)
76 (set-mark-command nil)
77 (message "")) ; delete the "Mark set" message
573228ae 78 (setq this-command 's-region-move)
d6eac7d4
RS
79 (apply (key-binding (s-region-unshift (this-command-keys))) arg)
80 (move-overlay s-region-overlay (mark) (point) (current-buffer))
81 (sit-for 1)
82 (delete-overlay s-region-overlay))
83
84(defun s-region-bind (keylist &optional map)
bd7c852a
JB
85 "Bind shifted keys in KEYLIST to `s-region-move-p1' or `s-region-move-p2'.
86Each key in KEYLIST is shifted and bound to one of the `s-region-move'
573228ae 87functions provided it is already bound to some command or other.
bd7c852a 88Optional second argument MAP specifies keymap to add binding to, defaulting
573228ae
KH
89to global keymap."
90 (let ((p2 (list 'scroll-up 'scroll-down
91 'beginning-of-buffer 'end-of-buffer)))
92 (or map (setq map global-map))
93 (while keylist
94 (let* ((key (car keylist))
95 (binding (key-binding key)))
96 (if (commandp binding)
97 (define-key
98 map
99 (vector (intern (concat "S-" (symbol-name (aref key 0)))))
100 (cond ((memq binding p2)
101 's-region-move-p2)
102 (t 's-region-move-p1)))))
103 (setq keylist (cdr keylist)))))
104
105;; Single keys (plus modifiers) only!
d6eac7d4
RS
106(s-region-bind
107 (list [right] [left] [up] [down]
108 [C-left] [C-right] [C-up] [C-down]
109 [M-left] [M-right] [M-up] [M-down]
110 [next] [previous] [home] [end]
111 [C-next] [C-previous] [C-home] [C-end]
112 [M-next] [M-previous] [M-home] [M-end]))
113
9af40217
RS
114(or (global-key-binding [C-insert])
115 (global-set-key [C-insert] 'copy-region-as-kill))
5257b534 116(or (global-key-binding [S-delete])
9af40217
RS
117 (global-set-key [S-delete] 'kill-region))
118(or (global-key-binding [S-insert])
119 (global-set-key [S-insert] 'yank))
d6eac7d4
RS
120
121(provide 's-region)
122
e8af40ee 123;;; s-region.el ends here