aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman1994-02-05 02:19:28 +0000
committerRichard M. Stallman1994-02-05 02:19:28 +0000
commitbc8ea5430e719711c5d7071d9c0cda36a9a725eb (patch)
treee9ba99a9de5369fb83bc97c12ae495e182d2af83
parent9d721a9e79c5dfd2807dca9a310dffcb6f5103ae (diff)
downloademacs-bc8ea5430e719711c5d7071d9c0cda36a9a725eb.tar.gz
emacs-bc8ea5430e719711c5d7071d9c0cda36a9a725eb.zip
(string-rectangle): Make operate-on-rectangle convert tabs.
(string-rectangle-line): After inserting string, insert the same width of whitespace that we deleted earlier. (operate-on-rectangle): Operate even if width is 0. (open-rectangle-line): Clean up.
-rw-r--r--lisp/rect.el71
1 files changed, 38 insertions, 33 deletions
diff --git a/lisp/rect.el b/lisp/rect.el
index ce29111f2e1..60a94877bbc 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -51,21 +51,20 @@ Point is at the end of the segment of this line within the rectangle."
51 (setq endlinepos (point-marker))) 51 (setq endlinepos (point-marker)))
52 (if (< endcol startcol) 52 (if (< endcol startcol)
53 (setq startcol (prog1 endcol (setq endcol startcol)))) 53 (setq startcol (prog1 endcol (setq endcol startcol))))
54 (if (/= endcol startcol) 54 (save-excursion
55 (save-excursion 55 (goto-char startlinepos)
56 (goto-char startlinepos) 56 (while (< (point) endlinepos)
57 (while (< (point) endlinepos) 57 (let (startpos begextra endextra)
58 (let (startpos begextra endextra) 58 (move-to-column startcol coerce-tabs)
59 (move-to-column startcol coerce-tabs) 59 (setq begextra (- (current-column) startcol))
60 (setq begextra (- (current-column) startcol)) 60 (setq startpos (point))
61 (setq startpos (point)) 61 (move-to-column endcol coerce-tabs)
62 (move-to-column endcol coerce-tabs) 62 (setq endextra (- endcol (current-column)))
63 (setq endextra (- endcol (current-column))) 63 (if (< begextra 0)
64 (if (< begextra 0) 64 (setq endextra (+ endextra begextra)
65 (setq endextra (+ endextra begextra) 65 begextra 0))
66 begextra 0)) 66 (funcall function startpos begextra endextra))
67 (funcall function startpos begextra endextra)) 67 (forward-line 1)))
68 (forward-line 1))))
69 (- endcol startcol))) 68 (- endcol startcol)))
70 69
71(defun delete-rectangle-line (startdelpos ignore ignore) 70(defun delete-rectangle-line (startdelpos ignore ignore)
@@ -179,17 +178,19 @@ but instead winds up to the right of the rectangle."
179 (goto-char start)) 178 (goto-char start))
180 179
181(defun open-rectangle-line (startpos begextra endextra) 180(defun open-rectangle-line (startpos begextra endextra)
182 (let ((column (+ (current-column) begextra endextra))) 181 ;; Column where rectangle ends.
182 (let ((endcol (+ (current-column) endextra))
183 whitewidth)
183 (goto-char startpos) 184 (goto-char startpos)
184 (let ((ocol (current-column))) 185 ;; Column where rectangle begins.
186 (let ((begcol (- (current-column) begextra)))
185 (skip-chars-forward " \t") 187 (skip-chars-forward " \t")
186 (setq column (+ column (- (current-column) ocol)))) 188 ;; Width of whitespace to be deleted and recreated.
187 (delete-region (point) 189 (setq whitewidth (- (current-column) begcol)))
188 ;; Use skip-chars-backward's LIM argument to leave 190 ;; Delete the whitespace following the start column.
189 ;; characters before STARTPOS undisturbed. 191 (delete-region startpos (point))
190 (progn (skip-chars-backward " \t" startpos) 192 ;; Open the desired width, plus same amount of whitespace we just deleted.
191 (point))) 193 (indent-to (+ endcol whitewidth))))
192 (indent-to column)))
193 194
194;;;###autoload 195;;;###autoload
195(defun string-rectangle (start end string) 196(defun string-rectangle (start end string)
@@ -199,21 +200,22 @@ This command does not delete or overwrite any existing text.
199 200
200Called from a program, takes three args; START, END and STRING." 201Called from a program, takes three args; START, END and STRING."
201 (interactive "r\nsString rectangle: ") 202 (interactive "r\nsString rectangle: ")
202 (operate-on-rectangle 'string-rectangle-line start end nil) 203 (operate-on-rectangle 'string-rectangle-line start end t)
203 (goto-char start)) 204 (goto-char start))
204 205
205(defun string-rectangle-line (startpos begextra endextra) 206(defun string-rectangle-line (startpos begextra endextra)
206 (let ((column (+ (current-column) begextra endextra))) 207 (let (whitespace)
207 (goto-char startpos) 208 (goto-char startpos)
209 ;; Compute horizontal width of following whitespace.
208 (let ((ocol (current-column))) 210 (let ((ocol (current-column)))
209 (skip-chars-forward " \t") 211 (skip-chars-forward " \t")
210 (setq column (+ column (- (current-column) ocol)))) 212 (setq whitespace (- (current-column) ocol)))
211 (delete-region (point) 213 ;; Delete the following whitespace.
212 ;; Use skip-chars-backward's LIM argument to leave 214 (delete-region startpos (point))
213 ;; characters before STARTPOS undisturbed. 215 ;; Insert the desired string.
214 (progn (skip-chars-backward " \t" startpos) 216 (insert string)
215 (point))) 217 ;; Insert the same width of whitespace that we had before.
216 (insert string))) 218 (indent-to (+ (current-column) whitespace))))
217 219
218;;;###autoload 220;;;###autoload
219(defun clear-rectangle (start end) 221(defun clear-rectangle (start end)
@@ -224,12 +226,15 @@ When called from a program, requires two args which specify the corners."
224 (operate-on-rectangle 'clear-rectangle-line start end t)) 226 (operate-on-rectangle 'clear-rectangle-line start end t))
225 227
226(defun clear-rectangle-line (startpos begextra endextra) 228(defun clear-rectangle-line (startpos begextra endextra)
229 ;; Find end of whitespace after the rectangle.
227 (skip-chars-forward " \t") 230 (skip-chars-forward " \t")
228 (let ((column (+ (current-column) endextra))) 231 (let ((column (+ (current-column) endextra)))
232 ;; Delete the text in the rectangle, and following whitespace.
229 (delete-region (point) 233 (delete-region (point)
230 (progn (goto-char startpos) 234 (progn (goto-char startpos)
231 (skip-chars-backward " \t") 235 (skip-chars-backward " \t")
232 (point))) 236 (point)))
237 ;; Reindent out to same column that we were at.
233 (indent-to column))) 238 (indent-to column)))
234 239
235(provide 'rect) 240(provide 'rect)