annotate lisp/rect.el @ 5075:868a9ffcc37b

Normally return a compiled function if one argument, #'constantly. 2010-02-24 Aidan Kehoe <kehoea@parhasard.net> * cl-extra.el (constantly): Normally return a compiled function from #'constantly if we are handed a single argument. Shouldn't actually matter, the overhead for returning a single constant in a lambda form vs. in a compiled function is minuscule, but using compiled functions as much as possible is good style in XEmacs, our interpreter is not stellar (nor indeed should it need to be).
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 24 Feb 2010 17:17:13 +0000
parents c82f9db998d7
children 308d34e9f07d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; rect.el --- rectangle functions for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3 ;; Copyright (C) 1985-2000 Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5 ;; Maintainer: Didier Verna <didier@xemacs.org>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Keywords: internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; along with XEmacs; see the file COPYING. If not, write to the Free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;;; Synched up with: to be incorporated in a forthcoming GNU Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;; This package provides the operations on rectangles that are documented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;; in the XEmacs Reference Manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
32 ;; #### NOTE: this file has been almost completely rewritten by Didier Verna
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
33 ;; <didier@xemacs.org>, Jul 99. The purpose of this rewrite is to be less
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; intrusive and fill lines with whitespaces only when needed. A few functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; are untouched though, as noted above their definition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
40 ;; #### NOTE: this function is untouched, but not used anymore.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 ;; `apply-on-rectangle' is used instead. It's still there because it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 ;; documented so people might use it in their code, so I've decided not to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 ;; touch it. --dv
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 ;; XEmacs: extra-args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (defun operate-on-rectangle (function start end coerce-tabs &rest extra-args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 "Call FUNCTION for each line of rectangle with corners at START, END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 If COERCE-TABS is non-nil, convert multi-column characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 that span the starting or ending columns on any line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 to multiple spaces before calling FUNCTION.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 FUNCTION is called with three arguments:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 position of start of segment of this line within the rectangle,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 number of columns that belong to rectangle but are before that position,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 number of columns that belong to rectangle but are after point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Point is at the end of the segment of this line within the rectangle."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 (let (startcol startlinepos endcol endlinepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 (setq startcol (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 (setq startlinepos (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 (goto-char end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (setq endcol (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 (setq endlinepos (point-marker)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (if (< endcol startcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 ;; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (let ((tem startcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 (setq startcol endcol endcol tem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 (goto-char startlinepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (while (< (point) endlinepos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (let (startpos begextra endextra)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 (move-to-column startcol coerce-tabs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 (setq begextra (- (current-column) startcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 (setq startpos (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (move-to-column endcol coerce-tabs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 (setq endextra (- endcol (current-column)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (if (< begextra 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 (setq endextra (+ endextra begextra)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 begextra 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (if (< endextra 0) (setq endextra 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (apply function startpos begextra endextra extra-args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (forward-line 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 (- endcol startcol)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 ;; The replacement for `operate-on-rectangle' -- dv
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 (defun apply-on-rectangle (function start end &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 "Call FUNCTION for each line of rectangle with corners at START and END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 FUNCTION is called with two arguments: the start and end columns of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 rectangle, plus ARGS extra arguments. Point is at the beginning of line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 when the function is called."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (let (startcol startpt endcol endpt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (setq startcol (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (setq startpt (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 (goto-char end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 (setq endcol (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (setq endpt (point-marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 ;; ensure the start column is the left one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 (if (< endcol startcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (let ((col startcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (setq startcol endcol endcol col)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 ;; start looping over lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 (goto-char startpt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (while (< (point) endpt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 (apply function startcol endcol args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 (forward-line 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
115 (defun delete-rectangle-line (startcol endcol fill)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
116 (let ((pt (point-at-eol)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
117 (when (= (move-to-column startcol (or fill 'coerce)) startcol)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
118 (if (and (not fill) (<= pt endcol))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
119 (delete-region (point) pt)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
120 ;; else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
121 (setq pt (point))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
122 (move-to-column endcol t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
123 (delete-region pt (point))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
124 ))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (defun delete-rectangle (start end &optional fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 "Delete the text in the region-rectangle without saving it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 The same range of columns is deleted in each line starting with the line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 where the region begins and ending with the line where the region ends.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 When called from a program, the rectangle's corners are START and END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 With a prefix (or FILL) argument, also fill lines where nothing has to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 deleted."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (interactive "*r\nP")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (apply-on-rectangle 'delete-rectangle-line start end fill))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
139 ;; I love ascii art ;-)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
140 (defconst spaces-strings '[""
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
141 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
142 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
143 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
144 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
145 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
146 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
147 " "
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
148 " "])
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
150 ;; This function is untouched --dv
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
151 (defun spaces-string (n)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
152 (if (<= n 8) (aref spaces-strings n)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
153 (let ((val ""))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
154 (while (> n 8)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
155 (setq val (concat " " val)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
156 n (- n 8)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
157 (concat val (aref spaces-strings n)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
158
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 (defun delete-extract-rectangle-line (startcol endcol lines fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (let ((pt (point-at-eol)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (if (< (move-to-column startcol (or fill 'coerce)) startcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (setcdr lines (cons (spaces-string (- endcol startcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (cdr lines)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 ;; else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 (setq pt (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 (move-to-column endcol t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (setcdr lines (cons (buffer-substring pt (point)) (cdr lines)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 (delete-region pt (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 ;;;###autoload
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173 (defun delete-extract-rectangle (start end &optional fill)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
174 "Delete the contents of the rectangle with corners at START and END, and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 return it as a list of strings, one for each line of the rectangle.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
176
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
177 With an optional FILL argument, also fill lines where nothing has to be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
178 deleted."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (let ((lines (list nil)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
180 (apply-on-rectangle 'delete-extract-rectangle-line start end lines fill)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (nreverse (cdr lines))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
183
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
184 ;; #### NOTE: this is actually the only function that needs to do complicated
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 ;; stuff like what's happening in `operate-on-rectangle', because the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 ;; might be read-only. --dv
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (defun extract-rectangle-line (startcol endcol lines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (let (start end begextra endextra line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (move-to-column startcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (setq start (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 begextra (- (current-column) startcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (move-to-column endcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (setq end (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 endextra (- endcol (current-column)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 (setq line (buffer-substring start (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (if (< begextra 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (setq endextra (+ endextra begextra)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 begextra 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 (if (< endextra 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 (setq endextra 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (while (search-forward "\t" end t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 (let ((width (- (current-column)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
204 (save-excursion (backward-char 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 (current-column)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (setq line (concat (substring line 0 (- (point) end 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 (spaces-string width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (substring line (+ (length line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (- (point) end)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 (if (or (> begextra 0) (> endextra 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (setq line (concat (spaces-string begextra)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (spaces-string endextra))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 (setcdr lines (cons line (cdr lines)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
216 ;;;###autoload
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
217 (defun extract-rectangle (start end)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
218 "Return the contents of the rectangle with corners at START and END,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
219 as a list of strings, one for each line of the rectangle."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
220 (let ((lines (list nil)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
221 (apply-on-rectangle 'extract-rectangle-line start end lines)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
222 (nreverse (cdr lines))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
223
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
224
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
225 ;;;###autoload
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
226 (defvar killed-rectangle nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
227 "Rectangle for `yank-rectangle' to insert.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
228
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
229 ;;;###autoload
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
230 (defun kill-rectangle (start end &optional fill)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
231 "Delete the region-rectangle and save it as the last killed one.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
232 You might prefer to use `delete-extract-rectangle' from a program.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
233
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
234 When called from a program, the rectangle's corners are START and END.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
235 With a prefix (or FILL) argument, also fill lines where nothing has to be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
236 deleted."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 (interactive "*r\nP")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
238 (when buffer-read-only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
239 (setq killed-rectangle (extract-rectangle start end))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
240 (barf-if-buffer-read-only))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241 (setq killed-rectangle (delete-extract-rectangle start end fill)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ;; This function is untouched --dv
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (defun yank-rectangle ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 "Yank the last killed rectangle with upper left corner at point."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (insert-rectangle killed-rectangle))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
250
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 ;; This function is untouched --dv
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (defun insert-rectangle (rectangle)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 "Insert text of RECTANGLE with upper left corner at point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 RECTANGLE's first line is inserted at point, its second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 line is inserted at a point vertically under point, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 RECTANGLE should be a list of strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 After this command, the mark is at the upper left corner
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 and point is at the lower right corner."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (let ((lines rectangle)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (insertcolumn (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (first t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 (push-mark)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (while lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (or first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (or (bolp) (insert ?\n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (move-to-column insertcolumn t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 (setq first nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (insert (car lines))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 (setq lines (cdr lines)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
274
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 (defun open-rectangle-line (startcol endcol fill)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 (when (= (move-to-column startcol (or fill 'coerce)) startcol)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277 (unless (and (not fill)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 (= (point) (point-at-eol)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279 (indent-to endcol))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
280
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 (defun open-rectangle (start end &optional fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 "Blank out the region-rectangle, shifting text right.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 When called from a program, the rectangle's corners are START and END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 With a prefix (or FILL) argument, fill with blanks even if there is no text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 on the right side of the rectangle."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (interactive "*r\nP")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 (apply-on-rectangle 'open-rectangle-line start end fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 (goto-char start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
292
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
293 (defun string-rectangle-line (startcol endcol string delete)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
294 (move-to-column startcol t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
295 (if delete
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
296 (delete-rectangle-line startcol endcol nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
297 (insert string))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 ;;;###autoload
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (defun string-rectangle (start end string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 "Insert STRING on each line of the region-rectangle, shifting text right.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
302 The left edge of the rectangle specifies the column for insertion.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
303
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
304 If `pending-delete-mode' is active the string replace the region.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
305 Otherwise this command does not delete or overwrite any existing text.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 When called from a program, the rectangle's corners are START and END."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (interactive "*r\nsString rectangle: ")
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
309 (defvar pending-delete-mode)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
310 (apply-on-rectangle 'string-rectangle-line start end string
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
311 (and (boundp 'pending-delete-mode) pending-delete-mode)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312
686
c82f9db998d7 [xemacs-hg @ 2001-12-03 18:02:47 by didierv]
didierv
parents: 446
diff changeset
313 ;;;###autoload
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
314 (defun replace-rectangle (start end string)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
315 "Like `string-rectangle', but unconditionally replace the original region,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
316 as if `pending-delete-mode' were active."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
317 (interactive "*r\nsString rectangle: ")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
318 (apply-on-rectangle 'string-rectangle-line start end string t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 (defun clear-rectangle-line (startcol endcol fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (let ((pt (point-at-eol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 spaces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 (when (= (move-to-column startcol (or fill 'coerce)) startcol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (if (and (not fill)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (<= (save-excursion (goto-char pt) (current-column)) endcol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (delete-region (point) pt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 ;; else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (setq pt (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 (move-to-column endcol t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 (setq spaces (- (point) pt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (delete-region pt (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (indent-to (+ (current-column) spaces))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
336 ;;;###autoload
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
337 (defun clear-rectangle (start end &optional fill)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
338 "Blank out the region-rectangle.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
339 The text previously in the region is overwritten with blanks.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
340
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
341 When called from a program, the rectangle's corners are START and END.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
342 With a prefix (or FILL) argument, also fill with blanks the parts of the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
343 rectangle which were empty."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
344 (interactive "*r\nP")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
345 (apply-on-rectangle 'clear-rectangle-line start end fill))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
346
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
347
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 (provide 'rect)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 ;;; rect.el ends here