changeset 18412:3febbe908cc3

(picture-draw-rectangle): New command. (picture-mode-map): Add binding for picture-draw-rectangle. (picture-mode): Doc fix. (picture-rectangle-ctl): New variable. (picture-rectangle-ctr): New variable. (picture-rectangle-cbr): New variable. (picture-rectangle-cbl): New variable. (picture-rectangle-v): New variable. (picture-rectangle-h): New variable. (move-to-column-force): Function deleted; calls changed to use move-to-column. (picture-insert): New function. (picture-self-insert): Use picture-insert. (picture-current-line): New function.
author Richard M. Stallman <rms@gnu.org>
date Mon, 23 Jun 1997 04:16:44 +0000
parents ed909ffc3c46
children 487c3d3c2283
files lisp/textmodes/picture.el
diffstat 1 files changed, 73 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/picture.el	Mon Jun 23 02:59:21 1997 +0000
+++ b/lisp/textmodes/picture.el	Mon Jun 23 04:16:44 1997 +0000
@@ -31,25 +31,19 @@
 
 ;;; Code:
 
-(defun move-to-column-force (column)
-  "Move to column COLUMN in current line.
-Differs from `move-to-column' in that it creates or modifies whitespace
-if necessary to attain exactly the specified column."
-  (or (natnump column) (setq column 0))
-  (move-to-column column)
-  (let ((col (current-column)))
-    (if (< col column)
-	(indent-to column)
-      (if (and (/= col column)
-	       (= (preceding-char) ?\t))
-	  (let (indent-tabs-mode)
-	    (delete-char -1)
-            (indent-to col)
-            (move-to-column column))))
-    ;; This call will go away when Emacs gets real horizontal autoscrolling
-    (hscroll-point-visible)))
+(defvar picture-rectangle-ctl ?+
+  "*Character picture-draw-rectangle uses for top left corners.")
+(defvar picture-rectangle-ctr ?+
+  "*Character picture-draw-rectangle uses for top right corners.")
+(defvar picture-rectangle-cbr ?+
+  "*Character picture-draw-rectangle uses for bottom right corners.")
+(defvar picture-rectangle-cbl ?+
+  "*Character picture-draw-rectangle uses for bottom left corners.")
+(defvar picture-rectangle-v   ?|
+  "*Character picture-draw-rectangle uses for vertical lines.")
+(defvar picture-rectangle-h   ?-
+  "*Character picture-draw-rectangle uses for horizontal lines.")
 
-
 ;; Picture Movement Commands
 
 (defun picture-beginning-of-line (&optional arg)
@@ -78,7 +72,7 @@
 With argument, move that many columns."
   (interactive "p")
   (let ((target-column (+ (current-column) arg)))
-    (move-to-column-force target-column)
+    (move-to-column target-column t)
     ;; Picture mode isn't really suited to multi-column characters,
     ;; but we might as well let the user move across them.
     (and (< arg 0)
@@ -97,7 +91,7 @@
   (interactive "p")
   (let ((col (current-column)))
     (picture-newline arg)
-    (move-to-column-force col)))
+    (move-to-column col t)))
 
 (defconst picture-vertical-step 0
   "Amount to move vertically after text character in Picture mode.")
@@ -188,19 +182,22 @@
 
 ;; Picture insertion and deletion.
 
+(defun picture-insert (ch arg)
+  (while (> arg 0)
+    (setq arg (1- arg))
+    (move-to-column (1+ (current-column)) t)
+    (delete-char -1)
+    (insert ch)
+    (forward-char -1)
+    (picture-move)))
+
 (defun picture-self-insert (arg)
   "Insert this character in place of character previously at the cursor.
 The cursor then moves in the direction you previously specified
 with the commands `picture-movement-right', `picture-movement-up', etc.
 Do \\[command-apropos] `picture-movement' to see those commands."
   (interactive "p")
-  (while (> arg 0)
-    (setq arg (1- arg))
-    (move-to-column-force (1+ (current-column)))
-    (delete-char -1)
-    (insert last-command-event)		; Always a character in this case.
-    (forward-char -1)
-    (picture-move)))
+  (picture-insert last-command-event arg)) ; Always a character in this case.
 
 (defun picture-clear-column (arg)
   "Clear out ARG columns after point without moving."
@@ -208,7 +205,7 @@
   (let* ((opoint (point))
 	 (original-col (current-column))
 	 (target-col (+ original-col arg)))
-    (move-to-column-force target-col)
+    (move-to-column target-col t)
     (delete-region opoint (point))
     (save-excursion
      (indent-to (max target-col original-col)))))
@@ -285,7 +282,7 @@
     (if (> change 0)
 	(delete-region (point)
 		       (progn
-			 (move-to-column-force (+ change (current-column)))
+			 (move-to-column (+ change (current-column)) t)
 			 (point))))
     (replace-match newtext fixedcase literal)
     (if (< change 0)
@@ -372,7 +369,7 @@
 	  (setq target (1- (current-column)))
 	(setq target nil)))
     (if target
-	(move-to-column-force target)
+	(move-to-column target t)
       (beginning-of-line))))
 
 (defun picture-tab (&optional arg)
@@ -418,7 +415,7 @@
                  (delete-extract-rectangle start end)
                (prog1 (extract-rectangle start end)
                       (clear-rectangle start end))))
-	   (move-to-column-force column))))
+	   (move-to-column column t))))
 
 (defun picture-yank-rectangle (&optional insertp)
   "Overlay rectangle saved by \\[picture-clear-rectangle]
@@ -468,6 +465,49 @@
     (push-mark)
     (insert-rectangle rectangle)))
 
+(defun picture-current-line ()
+  "Return the vertical position of point.  Top line is 1."
+  (+ (count-lines (point-min) (point))
+     (if (= (current-column) 0) 1 0)))
+
+(defun picture-draw-rectangle (start end)
+  "Draw a rectangle around region."
+  (interactive "*r")                    ; start will be less than end
+  (let* ((sl     (picture-current-line))
+         (sc     (current-column))
+         (pvs    picture-vertical-step)
+         (phs    picture-horizontal-step)
+         (c1     (progn (goto-char start) (current-column)))
+         (r1     (picture-current-line))
+         (c2     (progn (goto-char end) (current-column)))
+         (r2     (picture-current-line))
+         (right  (max c1 c2))
+         (left   (min c1 c2))
+         (top    (min r1 r2))
+         (bottom (max r1 r2)))
+    (goto-line top)
+    (move-to-column left)
+
+    (picture-movement-right)
+    (picture-insert picture-rectangle-ctl 1)
+    (picture-insert picture-rectangle-h (- right (current-column)))
+
+    (picture-movement-down)
+    (picture-insert picture-rectangle-ctr 1)
+    (picture-insert picture-rectangle-v (- bottom (picture-current-line)))
+
+    (picture-movement-left)
+    (picture-insert picture-rectangle-cbr 1)
+    (picture-insert picture-rectangle-h (- (current-column) left))
+
+    (picture-movement-up)
+    (picture-insert picture-rectangle-cbl 1)
+    (picture-insert picture-rectangle-v (- (picture-current-line) top))
+
+    (picture-set-motion pvs phs)
+    (goto-line sl)
+    (move-to-column sc t)))
+
 
 ;; Picture Keymap, entry and exit points.
 
@@ -508,6 +548,7 @@
       (define-key picture-mode-map "\C-c\C-w" 'picture-clear-rectangle-to-register)
       (define-key picture-mode-map "\C-c\C-y" 'picture-yank-rectangle)
       (define-key picture-mode-map "\C-c\C-x" 'picture-yank-rectangle-from-register)
+      (define-key picture-mode-map "\C-c\C-r" 'picture-draw-rectangle)
       (define-key picture-mode-map "\C-c\C-c" 'picture-mode-exit)
       (define-key picture-mode-map "\C-c\C-f" 'picture-motion)
       (define-key picture-mode-map "\C-c\C-b" 'picture-motion-reverse)
@@ -575,6 +616,7 @@
   C-c C-w Like C-c C-k except rectangle is saved in named register.
   C-c C-y Overlay (or insert) currently saved rectangle at point.
   C-c C-x Like C-c C-y except rectangle is taken from named register.
+  C-c C-r Draw a rectangular box around mark and point.
   \\[copy-rectangle-to-register]   Copies a rectangle to a register.
   \\[advertised-undo]   Can undo effects of rectangle overlay commands
 	    commands if invoked soon enough.