changeset 5787:bef3a67ac893

(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.
author Richard M. Stallman <rms@gnu.org>
date Sat, 05 Feb 1994 02:19:28 +0000
parents 730053369cab
children 913f27480fad
files lisp/rect.el
diffstat 1 files changed, 38 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/rect.el	Sat Feb 05 01:33:12 1994 +0000
+++ b/lisp/rect.el	Sat Feb 05 02:19:28 1994 +0000
@@ -51,21 +51,20 @@
      (setq endlinepos (point-marker)))
     (if (< endcol startcol)
 	(setq startcol (prog1 endcol (setq endcol startcol))))
-    (if (/= endcol startcol)
-	(save-excursion
-	 (goto-char startlinepos)
-	 (while (< (point) endlinepos)
-	   (let (startpos begextra endextra)
-	     (move-to-column startcol coerce-tabs)
-	     (setq begextra (- (current-column) startcol))
-	     (setq startpos (point))
-	     (move-to-column endcol coerce-tabs)
-	     (setq endextra (- endcol (current-column)))
-	     (if (< begextra 0)
-		 (setq endextra (+ endextra begextra)
-		       begextra 0))
-	     (funcall function startpos begextra endextra))
-	   (forward-line 1))))
+    (save-excursion
+     (goto-char startlinepos)
+     (while (< (point) endlinepos)
+       (let (startpos begextra endextra)
+	 (move-to-column startcol coerce-tabs)
+	 (setq begextra (- (current-column) startcol))
+	 (setq startpos (point))
+	 (move-to-column endcol coerce-tabs)
+	 (setq endextra (- endcol (current-column)))
+	 (if (< begextra 0)
+	     (setq endextra (+ endextra begextra)
+		   begextra 0))
+	 (funcall function startpos begextra endextra))
+       (forward-line 1)))
     (- endcol startcol)))
 
 (defun delete-rectangle-line (startdelpos ignore ignore)
@@ -179,17 +178,19 @@
   (goto-char start))
 
 (defun open-rectangle-line (startpos begextra endextra)
-  (let ((column (+ (current-column) begextra endextra)))
+  ;; Column where rectangle ends.
+  (let ((endcol (+ (current-column) endextra))
+	whitewidth)
     (goto-char startpos)
-    (let ((ocol (current-column)))
+    ;; Column where rectangle begins.
+    (let ((begcol (- (current-column) begextra)))
       (skip-chars-forward " \t")
-      (setq column (+ column (- (current-column) ocol))))
-    (delete-region (point)
-		   ;; Use skip-chars-backward's LIM argument to leave
-		   ;; characters before STARTPOS undisturbed.
-                   (progn (skip-chars-backward " \t" startpos)
-			  (point)))
-    (indent-to column)))
+      ;; Width of whitespace to be deleted and recreated.
+      (setq whitewidth (- (current-column) begcol)))
+    ;; Delete the whitespace following the start column.
+    (delete-region startpos (point))
+    ;; Open the desired width, plus same amount of whitespace we just deleted.
+    (indent-to (+ endcol whitewidth))))
 
 ;;;###autoload
 (defun string-rectangle (start end string)
@@ -199,21 +200,22 @@
 
 Called from a program, takes three args; START, END and STRING."
   (interactive "r\nsString rectangle: ")
-  (operate-on-rectangle 'string-rectangle-line start end nil)
+  (operate-on-rectangle 'string-rectangle-line start end t)
   (goto-char start))
 
 (defun string-rectangle-line (startpos begextra endextra)
-  (let ((column (+ (current-column) begextra endextra)))
+  (let (whitespace)
     (goto-char startpos)
+    ;; Compute horizontal width of following whitespace.
     (let ((ocol (current-column)))
       (skip-chars-forward " \t")
-      (setq column (+ column (- (current-column) ocol))))
-    (delete-region (point)
-		   ;; Use skip-chars-backward's LIM argument to leave
-		   ;; characters before STARTPOS undisturbed.
-                   (progn (skip-chars-backward " \t" startpos)
-			  (point)))
-    (insert string)))
+      (setq whitespace (- (current-column) ocol)))
+    ;; Delete the following whitespace.
+    (delete-region startpos (point))
+    ;; Insert the desired string.
+    (insert string)
+    ;; Insert the same width of whitespace that we had before.
+    (indent-to (+ (current-column) whitespace))))
 
 ;;;###autoload
 (defun clear-rectangle (start end)
@@ -224,12 +226,15 @@
   (operate-on-rectangle 'clear-rectangle-line start end t))
 
 (defun clear-rectangle-line (startpos begextra endextra)
+  ;; Find end of whitespace after the rectangle.
   (skip-chars-forward " \t")
   (let ((column (+ (current-column) endextra)))
+    ;; Delete the text in the rectangle, and following whitespace.
     (delete-region (point)
                    (progn (goto-char startpos)
 			  (skip-chars-backward " \t")
 			  (point)))
+    ;; Reindent out to same column that we were at.
     (indent-to column)))
 
 (provide 'rect)