* Implement `save-buffers-kill-edwin' which kills Edwin and returns to
authorChris Hanson <org/chris-hanson/cph>
Tue, 8 Aug 1989 10:06:36 +0000 (10:06 +0000)
committerChris Hanson <org/chris-hanson/cph>
Tue, 8 Aug 1989 10:06:36 +0000 (10:06 +0000)
Scheme.  This is bound to C-x c in fundamental mode.

* Change `unmap-alias-char' to leave the following characters
unchanged: tab, linefeed, page, return, altmode.  This compensates for
the previous change to `ascii-controlified?'.

* Implement `editor-frame-windows' which returns all of the
buffer-frames which are inferiors of an editor-frame.

* Implement `all-screens', `all-editor-frames', and `all-windows',
which return lists of all of the respective objects.

* The procedure `(window-redraw! window redraw-type)' has been
changed.  Now, it delays the actual work until update time, and
`redraw-type' can be one of:

value meaning
----- -------
'START preserve the start position of the window
'POINT preserve the point position of the window
'BUFFER-CURSOR-Y move point to last known position, or recenter
y move point to the y'th row
other center the point vertically in the window

* Implementation of `truncate-lines' functionality.  The following
changes are in support of this:

* Implementation of editor variable "assignment daemons" which allow
some arbitrary code to be executed whenever a specific variable is
assigned.

* Significant overhaul of local-variable binding:

** Implementation of "per-buffer" variables; that is, variables which
become buffer-local whenever they are set.  The new special form
`define-variable-per-buffer' supports this functionality.  The
following variables are defined as "per-buffer":

fill-column
left-margin
tab-width
case-fold-search
truncate-lines

** Implementation of new operations to access the local and default
value of a variable:

(variable-local-value? buffer variable)
(variable-local-value buffer variable)
(set-variable-local-value! buffer variable value)
(variable-default-value variable)
(set-variable-default-value! variable value)

22 files changed:
v7/src/edwin/basic.scm
v7/src/edwin/buffer.scm
v7/src/edwin/buffrm.scm
v7/src/edwin/bufwin.scm
v7/src/edwin/bufwiu.scm
v7/src/edwin/bufwmc.scm
v7/src/edwin/calias.scm
v7/src/edwin/comman.scm
v7/src/edwin/comred.scm
v7/src/edwin/curren.scm
v7/src/edwin/editor.scm
v7/src/edwin/edtfrm.scm
v7/src/edwin/edtstr.scm
v7/src/edwin/edwin.pkg
v7/src/edwin/fill.scm
v7/src/edwin/lincom.scm
v7/src/edwin/macros.scm
v7/src/edwin/make.scm
v7/src/edwin/modefs.scm
v7/src/edwin/sercom.scm
v7/src/edwin/utlwin.scm
v7/src/edwin/wincom.scm

index fa0461fec09dac8f3956a8284894467432000178..56e3ad7423ecf7728810260c1ed6810b29d62c60 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/basic.scm,v 1.101 1989/08/07 08:44:14 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/basic.scm,v 1.102 1989/08/08 10:05:18 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -249,7 +249,20 @@ With prefix arg, silently save all file-visiting buffers, then kill."
     (set! edwin-finalization
          (lambda ()
            (set! edwin-finalization false)
-           (%exit)))    ((ref-command suspend-edwin))))
+           (%exit)))
+    ((ref-command suspend-edwin))))
+
+(define-command save-buffers-kill-edwin
+  "Offer to save each buffer, then kill Edwin, returning to Scheme.
+With prefix arg, silently save all file-visiting buffers, then kill."
+  "P"
+  (lambda (no-confirmation?)
+    (save-some-buffers no-confirmation?)
+    (set! edwin-finalization
+         (lambda ()
+           (set! edwin-finalization false)
+           (reset-editor)))
+    ((ref-command suspend-edwin))))
 
 (define-command exit-recursive-edit
   "Exit normally from a subsystem of a level of editing."
index f6e38f1b26c31520f174ce56b4977a7bd90ab4c5..3fe830430b8a91d44980013c188f38f97badfd3a 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/buffer.scm,v 1.130 1989/04/28 22:47:15 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/buffer.scm,v 1.131 1989/08/08 10:05:22 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -324,7 +324,8 @@ The buffer is guaranteed to be deselected at that time."
    (lambda ()
      (let ((buffer (current-buffer))
           (old-value (variable-value variable)))
-       (set-variable-value! variable new-value)
+       (%set-variable-value! variable new-value)
+       (invoke-variable-assignment-daemons! variable)
        (let ((bindings (buffer-local-bindings buffer)))
         (let ((binding (assq variable bindings)))
           (if (not binding)
@@ -341,7 +342,8 @@ The buffer is guaranteed to be deselected at that time."
         (let ((binding (assq variable bindings)))
           (if binding
               (begin
-                (set-variable-value! variable (cdr binding))
+                (%set-variable-value! variable (cdr binding))
+                (invoke-variable-assignment-daemons! variable)
                 (vector-set! buffer
                              buffer-index:local-bindings
                              (delq! binding bindings)))))))
@@ -352,20 +354,91 @@ The buffer is guaranteed to be deselected at that time."
    (lambda ()
      (let ((buffer (current-buffer)))
        (for-each (lambda (binding)
-                  (set-variable-value! (car binding) (cdr binding)))
+                  (let ((variable (car binding)))
+                    (%set-variable-value! variable (cdr binding))
+                    (invoke-variable-assignment-daemons! variable)))
                 (buffer-local-bindings buffer))
        (vector-set! buffer buffer-index:local-bindings '()))
      unspecific)))
 
-(define (%wind-local-bindings! buffer)
-  ;; Assumes that interrupts are disabled and that BUFFER is selected.
-  (for-each (lambda (binding)
-             (let ((variable (car binding)))
-               (let ((old-value (variable-value variable)))
-                 (set-variable-value! variable (cdr binding))
-                 (set-cdr! binding old-value)))
+(define (change-local-bindings! old-buffer new-buffer select-buffer!)
+  ;; Assumes that interrupts are disabled and that OLD-BUFFER is selected.
+  (let ((variables '()))
+    (for-each (lambda (binding)
+               (let ((variable (car binding)))
+                 (let ((old-value (variable-value variable)))
+                   (%set-variable-value! variable (cdr binding))
+                   (set-cdr! binding old-value))
+                 (if (not (null? (variable-assignment-daemons variable)))
+                     (begin
+                       (set! variables (cons variable variables))
+                       unspecific))))
+             (buffer-local-bindings old-buffer))
+    (select-buffer!)
+    (for-each (lambda (binding)
+               (let ((variable (car binding)))
+                 (let ((old-value (variable-value variable)))
+                   (%set-variable-value! variable (cdr binding))
+                   (set-cdr! binding old-value))
+                 (if (and (not (null? (variable-assignment-daemons variable)))
+                          (not (memq variable variables)))
+                     (begin
+                       (set! variables (cons variable variables))
+                       unspecific))))
+             (buffer-local-bindings new-buffer))
+    (perform-buffer-initializations! new-buffer)
+    (if (not (null? variables))
+       (for-each invoke-variable-assignment-daemons! variables))))
+\f
+(define (variable-local-value buffer variable)
+  (let ((buffer* (current-buffer))
+       (in-cell
+        (lambda ()
+          (variable-value variable))))
+    (if (eq? buffer buffer*)
+       (in-cell)
+       (let ((binding (assq variable (buffer-local-bindings buffer))))
+         (cond (binding
+                (cdr binding))
+               ((variable-buffer-local? variable)
+                (let ((binding
+                       (assq variable (buffer-local-bindings buffer*))))
+                  (if binding
+                      (cdr binding)
+                      (in-cell))))
+               (else
+                (in-cell)))))))
+
+(define (set-variable-local-value! buffer variable value)
+  (if (eq? buffer (current-buffer))
+      (set-variable-value! variable value)
+      (let ((binding (assq variable (buffer-local-bindings buffer))))
+       (if binding
+           (begin
+             (set-cdr! binding value)
              unspecific)
-           (buffer-local-bindings buffer)))\f
+           (set-variable-value! variable value)))))
+
+(define (variable-local-value? buffer variable)
+  (assq variable (buffer-local-bindings buffer)))
+
+(define (variable-default-value variable)
+  (let ((binding (assq variable (buffer-local-bindings (current-buffer)))))
+    (if binding
+       (cdr binding)
+       (variable-value variable))))
+
+(define (set-variable-default-value! variable value)
+  (let ((binding (assq variable (buffer-local-bindings (current-buffer)))))
+    (if binding
+       (begin
+         (set-cdr! binding value)
+         unspecific)
+       (without-interrupts
+        (lambda ()
+          (%set-variable-value! variable value)
+          (invoke-variable-assignment-daemons! variable))))))
+\f
 ;;;; Modes
 
 (define-integrable (buffer-major-mode buffer)
index 9e06c038abcc64617109a316c434efca0ab16af4..ddbd9ccd9382236c8fae275130652f8179ad800b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/buffrm.scm,v 1.32 1989/04/28 22:47:21 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/buffrm.scm,v 1.33 1989/08/08 10:05:25 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -54,7 +54,9 @@
 
 (define (make-buffer-frame superior new-buffer modeline?)
   (let ((frame (=> superior :make-inferior buffer-frame)))
-    (initial-buffer! (frame-text-inferior frame) new-buffer)
+    (let ((window (frame-text-inferior frame)))
+      (initial-buffer! window new-buffer)
+      (%window-setup-truncate-lines! window false))
     (initial-modeline! frame modeline?)
     frame))
 
   (let ((window (frame-text-inferior frame)))
     (%set-window-point! window (clip-mark-to-display window point))))
 
-(define (window-redraw! frame #!optional preserve-point?)
-  (let ((window (frame-text-inferior frame)))
-    (%window-redraw! window
-                    (if (and (not (default-object? preserve-point?))
-                             preserve-point?)
-                        (%window-point-y window)
-                        (%window-y-center window)))))
+(define (window-redraw! frame redraw-type)
+  (%window-force-redraw! (frame-text-inferior frame) redraw-type))
 
-(define-integrable (window-redraw-preserving-point! window)
-  (window-redraw! window true))
+(define (window-redraw-preserving-point! frame)
+  (let ((window (frame-text-inferior frame)))
+    (%window-force-redraw! window (%window-point-y window))))
 
 (define-integrable (window-needs-redisplay? frame)
   (with-instance-variables buffer-frame frame ()
 (define (window-coordinates->mark frame x y)
   (let ((window (frame-text-inferior frame)))
     (maybe-recompute-image! window)
-    (%window-coordinates->mark window x y)))
\ No newline at end of file
+    (%window-coordinates->mark window x y)))
+
+(define (window-setup-truncate-lines! frame)
+  (%window-setup-truncate-lines! (frame-text-inferior frame) 'START))
\ No newline at end of file
index d3c5defb7829937918341289f0adec62b3ff5107..3fcb376e5be39cd525f6779bf1bd693c67dcad86 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufwin.scm,v 1.279 1989/04/28 22:47:54 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufwin.scm,v 1.280 1989/08/08 10:05:29 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -55,7 +55,7 @@
          start-clip-mark end-clip-mark
          saved-screen saved-x-start saved-y-start
          saved-xl saved-xu saved-yl saved-yu
-         override-inferior))
+         override-inferior truncate-lines? force-redraw?))
 
 (define-method buffer-window (:initialize! window window*)
   (usual=> window :initialize! window*)
@@ -64,6 +64,7 @@
   (set! changes-daemon (make-changes-daemon window))
   (set! clip-daemon (make-clip-daemon window))
   (set! override-inferior false)
+  (set! force-redraw? 'BUFFER-CURSOR-Y)
   unspecific)
 
 (define-method buffer-window (:kill! window)
 (define (set-buffer-window-size! window x y)
   (with-instance-variables buffer-window window (x y)
     (set! saved-screen false)
-    (%window-redraw! window
-                    (let ((old-y y-size))
-                      (usual=> window :set-size! x y)
-                      ;; Preserve point y unless it is offscreen now.
-                      (or (and old-y
-                               (let ((y (inferior-y-start cursor-inferior)))
-                                 (and (< y y-size) y)))
-                          (let ((y (buffer-cursor-y buffer)))
-                            (and y (< y y-size) y)))))))
+    (let ((old-y y-size))
+      (usual=> window :set-size! x y)
+      ;; Preserve point y unless it is offscreen now.
+      (%window-setup-truncate-lines! window false)
+      (%window-force-redraw!
+       window
+       (or (and old-y
+               (let ((y (inferior-y-start cursor-inferior)))
+                 (and (< y y-size) y)))
+          (%window-buffer-cursor-y window))))))
+
+(define (%window-setup-truncate-lines! window redraw-type)
+  (with-instance-variables buffer-window window ()
+    (if (not (within-editor?))
+       (begin
+         (set! truncate-lines?
+               (variable-value (ref-variable-object truncate-lines)))
+         unspecific)
+       (let ((new-truncate-lines?
+              (or (and (variable-local-value
+                        buffer
+                        (ref-variable-object truncate-partial-width-windows))
+                       (window-has-horizontal-neighbor? superior))
+                  (variable-local-value
+                   buffer
+                   (ref-variable-object truncate-lines)))))
+         (if (not (boolean=? truncate-lines? new-truncate-lines?))
+             (begin
+               (set! truncate-lines? new-truncate-lines?)
+               (if (and redraw-type (not force-redraw?))
+                   (%window-force-redraw! window redraw-type))))))))
 
 (define-method buffer-window :set-size!
   set-buffer-window-size!)
     (delete-window-buffer! window)
     (initial-buffer! window new-buffer)
     (window-modeline-event! superior 'NEW-BUFFER)
-    (%window-redraw! window
-                    (let ((y (buffer-cursor-y buffer)))
-                      (and y (< y y-size) y)))))
+    (%window-force-redraw! window (%window-buffer-cursor-y window))))
+
+(define (%window-buffer-cursor-y window)
+  (with-instance-variables buffer-window window (new-buffer)
+    (let ((y (buffer-cursor-y buffer)))
+      (and y (< y y-size) y))))
 
 (define (initial-buffer! window new-buffer)
   (with-instance-variables buffer-window window (new-buffer)
                (list override-inferior cursor-inferior blank-inferior))
          (set-inferior-start! override-inferior 0 0)))
     (let ((override-window (inferior-window override-inferior)))
-      (set-line-window-string! override-window message)
+      (set-line-window-string! override-window message truncate-lines?)
       (set-inferior-position!
        cursor-inferior
        (string-base:index->coordinates override-window
     (let ((inferior (make-inferior window line-window)))
       (set-line-window-string! (inferior-window inferior)
                               (group-extract-string (buffer-group buffer)
-                                                    start end))
+                                                    start end)
+                              truncate-lines?)
       inferior)))
 
 (define-integrable (first-line-inferior window)
 
 (define (maybe-recenter! window)
   (with-instance-variables buffer-window window ()
-    (let ((threshold (ref-variable cursor-centering-threshold)))
+    (let ((threshold (ref-variable cursor-centering-threshold))
+         (recenter!
+          (lambda ()
+            (%window-redraw! window (%window-y-center window)))))
       (if (zero? threshold)
-         (%window-redraw! window (%window-y-center window))
+         (recenter!)
          (if (< (mark-index point) (mark-index start-mark))
              (let ((limit
                     (%window-coordinates->index window 0 (- threshold))))
-               (if (or (not limit)
-                       (>= (mark-index point) limit))
+               (if (or (not limit) (>= (mark-index point) limit))
                    (%window-scroll-y-relative! window
                                                (%window-point-y window))
-                   (%window-redraw! window (%window-y-center window))))
+                   (recenter!)))
              (let ((limit
                     (%window-coordinates->index window
                                                 0
                                                 (+ (window-y-size window)
                                                    threshold))))
-               (if (or (not limit)
-                       (< (mark-index point) limit))
+               (if (or (not limit) (< (mark-index point) limit))
                    (%window-scroll-y-relative!
                     window
                     (- (%window-point-y window) (-1+ (window-y-size window))))
-                   (%window-redraw! window (%window-y-center window)))))))))
+                   (recenter!))))))))
+
+(define (%window-force-redraw! window redraw-type)
+  (with-instance-variables buffer-window window ()
+    (set! force-redraw? (or redraw-type 'CENTER))
+    (setup-redisplay-flags! redisplay-flags)))
+\f
+(define (%window-redraw-preserving-start! window)
+  (with-instance-variables buffer-window window ()
+    (let ((group (mark-group start-mark))
+         (start-line (mark-index start-line-mark)))
+      (let ((start (if truncate-lines? start-line (mark-index start-mark)))
+           (end (line-end-index group start-line)))
+       (let ((inferior (make-line-inferior window start-line end)))
+         (set-inferior-start!
+          inferior
+          0
+          (- (string-base:index->y (inferior-window inferior)
+                                   (- start start-line))))
+         (set-line-inferiors!
+          window
+          (cons inferior (fill-bottom window (inferior-y-end inferior) end))
+          start)))))
+  (everything-changed! window maybe-recenter!))
 
 (define (%window-redraw! window y)
   (with-instance-variables buffer-window window (y)
                        (begin
                          (if (or (< y 0) (>= y y-size))
                              (error "Attempt to scroll point off window" y))
-                         y)))
-    (everything-changed! window
-      (lambda (w)
-       (error "%WINDOW-REDRAW! left point offscreen -- get a wizard" w)))))
+                         y))))
+  (everything-changed! window
+    (lambda (w)
+      (error "%WINDOW-REDRAW! left point offscreen -- get a wizard" w))))
 
 (define (redraw-screen! window y)
   (with-instance-variables buffer-window window (y)
     (set! start-changes-mark false)
     (set! end-changes-mark false)
     (set! start-clip-mark false)
-    (set! end-clip-mark false)    unspecific))
+    (set! end-clip-mark false)
+    (set! force-redraw? false)
+    unspecific))
 
 (define (start-mark-changed! window)
   (with-instance-variables buffer-window window ()
index 9c35f7581f5772c00a3937f8b5fc3aa94ba1f5fb..a10d6f5e54854d162cfc0015341ea8089e1d6cd6 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufwiu.scm,v 1.9 1989/04/28 22:48:00 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufwiu.scm,v 1.10 1989/08/08 10:05:33 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
 
 (define (%recompute-image! window)
   (with-instance-variables buffer-window window ()
-    (let ((group (mark-group start-mark))
-         (start-line (mark-index start-line-mark))
-         (start (mark-index start-mark))
-         (end (mark-index end-mark))
-         (point-index (mark-index point)))
-      (if start-clip-mark
-         (let ((new-clip-start (group-start-index group))
-               (new-clip-end (group-end-index group)))
-           (cond ((< point-index new-clip-start)
-                  (%set-buffer-point! buffer (group-display-start group))
-                  (set! point (buffer-point buffer)))
-                 ((> point-index new-clip-end)
-                  (%set-buffer-point! buffer (group-display-end group))
-                  (set! point (buffer-point buffer))))
-           (cond ((> new-clip-start start-line)
-                  (%window-redraw! window false))
-                 ((or (< new-clip-end end)
-                      (and (< new-clip-start start-line)
-                           (= start-line (mark-index start-clip-mark)))
-                      (and (> new-clip-end end)
-                           (= end (mark-index end-clip-mark))))
-                  (%window-redraw! window
-                                   (and (not start-changes-mark)
-                                        (>= point-index start)
-                                        (<= point-index end)
-                                        (%window-point-y window))))
-                 (else
-                  (set! start-clip-mark false)
-                  (set! end-clip-mark false)))))
-      (if start-changes-mark
-         (let ((start-changes (mark-index start-changes-mark))
-               (end-changes (mark-index end-changes-mark)))
-           (if (and (>= end-changes start-line)
-                    (<= start-changes end))
-               (if (<= start-changes start)
-                   (if (< end-changes end)
-                       (recompute-image!:top-changed window)
-                       (%window-redraw! window false))
-                   (if (>= end-changes end)
-                       (recompute-image!:bottom-changed window)
-                       (recompute-image!:middle-changed window)))
-               (begin
-                 (set! start-changes-mark false)
-                 (set! end-changes-mark false))))))
-    (if point-moved?
-       (update-cursor! window maybe-recenter!))))
+    (cond ((eq? 'START force-redraw?)
+          (%window-redraw-preserving-start! window))
+         ((eq? 'POINT force-redraw?)
+          (%window-redraw! window (%window-point-y window)))
+         ((eq? 'BUFFER-CURSOR-Y force-redraw?)
+          (%window-redraw! window (%window-buffer-cursor-y window)))
+         ((and (integer? force-redraw?)
+               (not (negative? force-redraw?))
+               (< force-redraw? y-size))
+          (%window-redraw! window force-redraw?))
+         (force-redraw?
+          (%window-redraw! window (%window-y-center window)))
+         (else
+          (let ((group (mark-group start-mark))
+                (start-line (mark-index start-line-mark))
+                (start (mark-index start-mark))
+                (end (mark-index end-mark))
+                (point-index (mark-index point)))
+            (if start-clip-mark
+                (let ((new-clip-start (group-start-index group))
+                      (new-clip-end (group-end-index group)))
+                  (cond ((< point-index new-clip-start)
+                         (%set-buffer-point! buffer
+                                             (group-display-start group))
+                         (set! point (buffer-point buffer)))
+                        ((> point-index new-clip-end)
+                         (%set-buffer-point! buffer (group-display-end group))
+                         (set! point (buffer-point buffer))))
+                  (cond ((> new-clip-start start-line)
+                         (%window-redraw! window false))
+                        ((or (< new-clip-end end)
+                             (and (< new-clip-start start-line)
+                                  (= start-line (mark-index start-clip-mark)))
+                             (and (> new-clip-end end)
+                                  (= end (mark-index end-clip-mark))))
+                         (%window-redraw! window
+                                          (and (not start-changes-mark)
+                                               (>= point-index start)
+                                               (<= point-index end)
+                                               (%window-point-y window))))
+                        (else
+                         (set! start-clip-mark false)
+                         (set! end-clip-mark false)))))
+            (if start-changes-mark
+                (let ((start-changes (mark-index start-changes-mark))
+                      (end-changes (mark-index end-changes-mark)))
+                  (if (and (>= end-changes start-line)
+                           (<= start-changes end))
+                      (if (<= start-changes start)
+                          (if (< end-changes end)
+                              (recompute-image!:top-changed window)
+                              (%window-redraw! window false))
+                          (if (>= end-changes end)
+                              (recompute-image!:bottom-changed window)
+                              (recompute-image!:middle-changed window)))
+                      (begin
+                        (set! start-changes-mark false)                         (set! end-changes-mark false))))))
+          (if point-moved?
+              (update-cursor! window maybe-recenter!))))))
 \f
 (define (recompute-image!:top-changed window)
   (with-instance-variables buffer-window window ()
       (let ((start-index (line-start-index group index)))
        (set-line-window-string!
         (inferior-window (car inferiors))
-        (group-extract-string group start-index (line-end-index group index)))
+        (group-extract-string group start-index (line-end-index group index))
+        truncate-lines?)
        (fill-top! window inferiors start-index true)))
     (everything-changed! window maybe-recenter!)))
 
       (let ((end-index (line-end-index group index)))
        (set-line-window-string!
         (inferior-window (car inferiors))
-        (group-extract-string group (line-start-index group index) end-index))
+        (group-extract-string group (line-start-index group index) end-index)
+        truncate-lines?)
        (set-cdr! inferiors
                  (fill-bottom window
                               (inferior-y-end (car inferiors))
   (let ((y-end (inferior-y-end (car start-inferiors))))
     (set-line-window-string!
      (inferior-window (car start-inferiors))
-     (group-extract-string group start-start start-end))
+     (group-extract-string group start-start start-end)
+     truncate-lines?)
     (let ((y-end* (inferior-y-end (car start-inferiors))))
       (if (= y-end y-end*)
          (maybe-marks-changed! window start-inferiors y-end*)
   ;; several, so we need to insert a bunch of new lines.
   (begin
    (set-line-window-string! (inferior-window (car start-inferiors))
-                           (group-extract-string group start-start start-end))
+                           (group-extract-string group start-start start-end)
+                           truncate-lines?)
    (set-cdr! start-inferiors
             (if (null? (cdr start-inferiors))
                 (fill-bottom window
   ;; We must scroll the bottom of the screen up to fill in.
   (begin
    (set-line-window-string! (inferior-window (car start-inferiors))
-                           (group-extract-string group start-start start-end))
+                           (group-extract-string group start-start start-end)
+                           truncate-lines?)
    (set-cdr! start-inferiors
             (if (null? (cdr end-inferiors))
                 (fill-bottom window
   (begin
     (set-line-window-string!
      (inferior-window (car start-inferiors))
-     (group-extract-string group start-start start-end))
+     (group-extract-string group start-start start-end)
+     truncate-lines?)
     (let ((old-y-end (inferior-y-end (car end-inferiors))))
       (set-line-window-string! (inferior-window (car end-inferiors))
-                              (group-extract-string group end-start end-end))      (let ((y-end (inferior-y-end (car end-inferiors)))
+                              (group-extract-string group end-start end-end)
+                              truncate-lines?)
+      (let ((y-end (inferior-y-end (car end-inferiors)))
            (tail (cdr end-inferiors)))
        (cond ((> y-end old-y-end)
               (set-cdr! end-inferiors (scroll-lines-down! window tail y-end)))
index 7dec42d6f11321742c3c4edecad6ff02f5f2a7fd..2771a604048de4ba5c8be4ed747d99c3e2c74123 100644 (file)
@@ -1,5 +1,7 @@
 ;;; -*-Scheme-*-
 ;;;
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/bufwmc.scm,v 1.5 1989/08/08 10:05:36 cph Exp $
+;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
 ;;;    This material was developed by the Scheme project at the
                (done start columns y-start)
                (search-downwards (1+ end)
                                  (+ y-start
-                                    (column->y-size columns x-size)))))))
+                                    (column->y-size columns
+                                                    x-size
+                                                    truncate-lines?)))))))
 
       (define-integrable (done start columns y-start)
        (let ((xy
               (column->coordinates columns
                                    x-size
+                                   truncate-lines?
                                    (group-column-length group
                                                         start
                                                         index
                       (search-downwards end y-end)))))))
 
       (define-integrable (y-delta start end)
-       (column->y-size (group-column-length group start end 0) x-size))
+       (column->y-size (group-column-length group start end 0)
+                       x-size
+                       truncate-lines?))
+
+      (define (done start end y-start)
+       (let ((column-size (group-column-length group start end 0)))
+         (if (and truncate-lines? (= x (-1+ x-size)))
+             column-size
+             (group-column->index group start end 0
+                                  (min (coordinates->column x
+                                                            (- y y-start)
+                                                            x-size)
+                                       column-size)))))
 
-      (define-integrable (done start end y-start)
-       (group-column->index group start end 0
-                            (coordinates->column x (- y y-start) x-size)))
       (let ((start (inferior-y-start (first-line-inferior window)))
            (end (inferior-y-end last-line-inferior)))
        (cond ((< y start)
index b9ccf66684dfb7d99d554af646f008a7f49ada53..f2b6826d71606a3b46227a5496135900207bb517 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/calias.scm,v 1.6 1989/08/07 08:44:17 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/calias.scm,v 1.7 1989/08/08 10:05:40 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
          (else char))))
 
 (define (unmap-alias-char char)
-  (if (and (ascii-controlified? char)     (even? (quotient (char-bits char) 2)))
+  (if (and (ascii-controlified? char)
+          (let ((code (char-code char)))
+            (not (or (= code #x09)     ;tab
+                     (= code #x0A)     ;linefeed
+                     (= code #x0C)     ;page
+                     (= code #x0D)     ;return
+                     (= code #x1B)     ;altmode
+                     )))
+          (even? (quotient (char-bits char) 2)))
       (unmap-alias-char
        (make-char (let ((code (char-code char)))
                    (+ code (if (<= #x01 code #x1A) #x60 #x40)))
index f4b7badceab7fe332ef4fdaadc45680f14f2ee2b..4fa6103a56b64bbb30f890f61a11090fd7f52309 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comman.scm,v 1.58 1989/04/28 22:48:38 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comman.scm,v 1.59 1989/08/08 10:05:43 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -93,8 +93,9 @@
 (define-named-structure "Variable"
   name
   description
-  value)
-
+  value
+  assignment-daemons
+  buffer-local?)
 (define (variable-name-string variable)
   (editor-name/internal->external (symbol->string (variable-name variable))))
 
     (vector-set! variable variable-index:name name)
     (vector-set! variable variable-index:description description)
     (vector-set! variable variable-index:value value)
+    (vector-set! variable variable-index:assignment-daemons '())
+    (vector-set! variable variable-index:buffer-local? false)
     variable))
 
+(define-integrable (make-variable-buffer-local! variable)
+  (vector-set! variable variable-index:buffer-local? true)
+  unspecific)
+
+(define (add-variable-assignment-daemon! variable daemon)
+  (let ((daemons (variable-assignment-daemons variable)))
+    (if (not (memq daemon daemons))
+       (begin
+         (vector-set! variable
+                      variable-index:assignment-daemons
+                      (cons daemon daemons))
+         unspecific))))
+
+(define (invoke-variable-assignment-daemons! variable)
+  (for-each (lambda (daemon) (daemon variable))
+           (variable-assignment-daemons variable)))
+
 (define editor-variables
   (make-string-table 50))
 
   (let ((name (canonicalize-name name)))
     (or (string-table-get editor-variables (symbol->string name))
        (make-variable name "" false))))
-(define-integrable (set-variable-value! variable value)  (vector-set! variable variable-index:value value)
+(define (set-variable-value! variable value)
+  (if (variable-buffer-local? variable)
+      (make-local-binding! variable value)
+      (without-interrupts
+       (lambda ()
+        (%set-variable-value! variable value)
+        (invoke-variable-assignment-daemons! variable)))))
+
+(define-integrable (%set-variable-value! variable value)
+  (vector-set! variable variable-index:value value)
   unspecific)
 (define (with-variable-value! variable new-value thunk)
   (let ((old-value))
index 788dabb658416350ba2c6cbe01f602c7c4df8837..b224aeab96c64a43963a5b8fe7b3dc520c3efb38 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comred.scm,v 1.76 1989/08/07 08:44:21 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/comred.scm,v 1.77 1989/08/08 10:05:47 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
                        ((eq? procedure (ref-command backward-char))
                         (if (and (not (group-start? point))
                                  (char-graphic? (mark-left-char point))
-                                 (positive? point-x))                       (window-direct-output-backward-char! window)
+                                 (positive? point-x)
+                                 (< point-x (-1+ (window-x-size window))))
+                            (window-direct-output-backward-char! window)
                             (normal)))
                        (else
                         (if (not (typein-window? window))
index ccb898647c99a39c42f83bb8cb741506a23b807e..0d097c6377e551fe97b39f21e4963bc09e657b0f 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/curren.scm,v 1.83 1989/04/28 22:49:03 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/curren.scm,v 1.84 1989/08/08 10:05:50 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
 (define (select-window window)
   (without-interrupts
    (lambda ()
-     (let ((frame (current-editor-frame)))
-       (%wind-local-bindings!
-       (window-buffer (editor-frame-selected-window frame)))
-       (editor-frame-select-window! frame window))
-     (let ((buffer (window-buffer window)))
-       (%wind-local-bindings! buffer)
-       (perform-buffer-initializations! buffer)
+     (let ((frame (current-editor-frame))
+          (buffer (window-buffer window)))
+       (change-local-bindings!
+       (window-buffer (editor-frame-selected-window frame))
+       buffer
+       (lambda ()
+         (editor-frame-select-window! frame window)))
        (bufferset-select-buffer! (current-bufferset) buffer)))))
 
 (define-integrable (select-cursor window)
    (lambda ()
      (if (current-window? window)
         (begin
-          (%wind-local-bindings! (window-buffer window))
-          (%set-window-buffer! window buffer)
-          (%wind-local-bindings! buffer)
-          (perform-buffer-initializations! buffer)        (if record? (bufferset-select-buffer! (current-bufferset) buffer)))
+          (change-local-bindings!
+           (window-buffer window)
+           buffer
+           (lambda () (%set-window-buffer! window buffer)))
+          (if record? (bufferset-select-buffer! (current-bufferset) buffer)))
         (%set-window-buffer! window buffer)))))
 (define (with-selected-buffer buffer thunk)
   (let ((old-buffer))
index 0fae32e5126c5c9be01559a8b8191dc8fef3c3dc..7982f113b79c0d004c933e11da12ff4e49040638 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/editor.scm,v 1.188 1989/08/07 08:44:38 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/editor.scm,v 1.189 1989/08/08 10:05:54 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -99,6 +99,8 @@
              (recursive-edit-continuation false)
              (recursive-edit-level 0))
     (thunk)))
+(define (within-editor?)
+  (not (unassigned? current-editor)))
 (define (enter-recursive-edit)
   (let ((value
         (call-with-current-continuation
index 2835804ce12c9c49f9969ebc41625aa23baa3bf9..3f84f3c8be82b4b389cae6764a89049a423945b4 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edtfrm.scm,v 1.77 1989/06/21 10:35:31 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edtfrm.scm,v 1.78 1989/08/08 10:05:57 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989 Massachusetts Institute of Technology
 ;;;
 (define-integrable (editor-frame-screen window)
   (with-instance-variables editor-frame window ()
     screen))
+(define (editor-frame-windows window)
+  (cons (editor-frame-typein-window window)
+       (let ((start (editor-frame-window0 window)))
+         (cons start
+               (let loop ((window (window1+ start)))
+                 (if (eq? window start)
+                     '()
+                     (cons window (loop (window1+ window)))))))))
+
 (define (editor-frame-select-window! window window*)
   (with-instance-variables editor-frame window (window*)
     (if (not (buffer-frame? window*))
index dfc0b02471d7813b79e79b93bd404be32c72cbb2..c9e80828f57bab09be23d421a7f2b6313db0e157 100644 (file)
 (define-integrable (current-screen)
   (editor-screen current-editor))
 
+(define-integrable (all-screens)
+  (list (current-screen)))
 (define-integrable (current-editor-frame)
   (editor-frame-window current-editor))
+
+(define-integrable (all-editor-frames)
+  (list (current-editor-frame)))
+
+(define-integrable (all-windows)
+  #|(append-map editor-frame-windows (all-editor-frames))|#
+  (editor-frame-windows (current-editor-frame)))
 (define-integrable (current-bufferset)
   (editor-bufferset current-editor))
 
index bddd74bdc5de8b2532d715e7f2b3fa194384e45f..d06de34599f8bee0f28857ed3901faa7cf3825bb 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.pkg,v 1.7 1989/08/07 08:44:45 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/edwin.pkg,v 1.8 1989/08/08 10:06:04 cph Exp $
 
 Copyright (c) 1989 Massachusetts Institute of Technology
 
@@ -262,6 +262,7 @@ MIT in each case. |#
          editor-frame-selected-window
          editor-frame-typein-window
          editor-frame-window0
+         editor-frame-windows
          edwin-discard-state!
          edwin-display
          edwin-editor
@@ -307,6 +308,7 @@ MIT in each case. |#
          window-scroll-y-relative!
          window-select-time
          window-set-override-message!
+         window-setup-truncate-lines!
          window-start-mark
          window-y-center
          with-editor-interrupts
index 8677cbc51dfed382a00801f24102b2b4cb98e304..503355dec328624809306eeb168d1a5130ced378 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/fill.scm,v 1.44 1989/04/28 22:49:55 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/fill.scm,v 1.45 1989/08/08 10:06:07 cph Rel $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -59,8 +59,9 @@ Point stays the same."
   (lambda (region)
     (fill-region region)))
 
-(define-variable fill-column
-  "Controls where \\[fill-paragraph] and auto-fill mode put the right margin."
+(define-variable-per-buffer fill-column
+  "*Column beyond which automatic line-wrapping should happen.
+Automatically becomes local when set in any fashion."
   70)
 
 (define-command set-fill-column
@@ -200,8 +201,11 @@ With argument, turn auto-fill mode on iff argument is positive."
   (and (> (mark-column point) (ref-variable fill-column))
        (line-end? (horizontal-space-end point))))
 
-(define-variable left-margin
-  "The number of columns to indent each line."  0)
+(define-variable-per-buffer left-margin
+  "*Column for the default indent-line-function to indent to.
+Linefeed indents to this column in Fundamental mode.
+Automatically becomes local when set in any fashion."
+  0)
 
 (define (center-line mark)
   (let ((mark (mark-permanent! mark)))
index 47c20bd75efd655643871eeaea69a1e0fd3ddff0..60c76b8dc89985fc1ce73a3d51c89b3764a240f5 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/lincom.scm,v 1.103 1989/04/28 22:50:51 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/lincom.scm,v 1.104 1989/08/08 10:06:12 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -341,8 +341,10 @@ moves down one line first (killing newline after current line)."
   "\\[delete-indentation] won't insert a space to the left of these."
   (char-set #\)))
 \f
-(define-variable tab-width
-  "Distance between tab stops (for display of tab characters), in columns."  8)
+(define-variable-per-buffer tab-width
+  "Distance between tab stops (for display of tab characters), in columns.
+Automatically becomes local when set in any fashion."
+  8)
 
 (define-variable indent-tabs-mode
   "If false, do not use tabs for indentation or horizontal spacing."
index 61e7eff34f7bb15c219a9e83c919e49c3699b49f..2a020e5ded4e52eb489befd8c4fedde56b74a26b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/macros.scm,v 1.47 1989/06/19 22:46:06 markf Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/macros.scm,v 1.48 1989/08/08 10:06:18 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
                          ',description
                          ,(if (default-object? value) '#F value)))
         ',name))))
+
+(syntax-table-define edwin-syntax-table 'DEFINE-VARIABLE-PER-BUFFER
+  (lambda (name description #!optional value)
+    (let ((name (canonicalize-name name)))
+      (let ((scheme-name (variable-name->scheme-name name)))
+       `(BEGIN
+          (DEFINE ,scheme-name
+            (MAKE-VARIABLE ',name
+                           ',description
+                           ,(if (default-object? value) '#F value)))
+          (MAKE-VARIABLE-BUFFER-LOCAL! ,scheme-name)
+          ',name)))))
+
 (syntax-table-define edwin-syntax-table 'REF-VARIABLE-OBJECT
   (lambda (name)
     (variable-name->scheme-name (canonicalize-name name))))
index 6ab88b1527459b41538cbd51a9cb642af84a3efc..b1ca734ccfd2e697a73ab2b75f207c22ee1d462a 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/make.scm,v 3.12 1989/08/07 08:44:59 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/make.scm,v 3.13 1989/08/08 10:06:22 cph Exp $
 
 Copyright (c) 1989 Massachusetts Institute of Technology
 
@@ -37,4 +37,4 @@ MIT in each case. |#
 (declare (usual-integrations))
 
 (package/system-loader "edwin" '() 'QUERY)
-(add-system! (make-system "Edwin" 3 12 '()))
\ No newline at end of file
+(add-system! (make-system "Edwin" 3 13 '()))
\ No newline at end of file
index f156284068c806f64db908a85d20875598d178bb..3effbdaccd8d6e465f444e2299cbfafffde0e340 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/modefs.scm,v 1.118 1989/08/07 08:45:08 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/modefs.scm,v 1.119 1989/08/08 10:06:25 cph Exp $
 ;;;
 ;;;    Copyright (c) 1985, 1989 Massachusetts Institute of Technology
 ;;;
@@ -278,7 +278,9 @@ and the cdrs of which are major modes."
 (define-key 'fundamental '(#\c-x #\[) 'backward-page)
 (define-key 'fundamental '(#\c-x #\]) 'forward-page)
 (define-key 'fundamental '(#\c-x #\^) 'enlarge-window)
-(define-key 'fundamental '(#\c-x #\b) 'switch-to-buffer)(define-key 'fundamental '(#\c-x #\d) 'dired)
+(define-key 'fundamental '(#\c-x #\b) 'switch-to-buffer)
+(define-key 'fundamental '(#\c-x #\c) 'save-buffers-kill-edwin)
+(define-key 'fundamental '(#\c-x #\d) 'dired)
 (define-key 'fundamental '(#\c-x #\e) 'call-last-kbd-macro)
 (define-key 'fundamental '(#\c-x #\f) 'set-fill-column)
 (define-key 'fundamental '(#\c-x #\g) 'insert-register)
index 8b912d7c6a2872dd25be74767f85e553977e9333..8e6a2df2791372ffbe5f75039046d6d047701f6c 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/sercom.scm,v 1.54 1989/04/28 22:53:17 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/sercom.scm,v 1.55 1989/08/08 10:06:29 cph Rel $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
 \f
 ;;;; Variables
 
-(define-variable case-fold-search
-  "*True if searches should ignore case."  true)
+(define-variable-per-buffer case-fold-search
+  "*True if searches should ignore case.
+Automatically becomes local when set in any fashion."
+  true)
 
 (define-variable search-last-string
   "Last string search for by a non-regexp search command.
index 1b1c7d271a7a500656594359864e1d447329fa48..38965b0c4fe7defd344542ff3349318fea5ead8e 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/utlwin.scm,v 1.51 1989/04/28 22:54:27 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/utlwin.scm,v 1.52 1989/08/08 10:06:32 cph Exp $
 ;;;
 ;;;    Copyright (c) 1986, 1989 Massachusetts Institute of Technology
 ;;;
@@ -52,7 +52,7 @@
 ;;;  from which methods can be built.
 
 (define-class string-base vanilla-window
-  (image representation))
+  (image representation truncate-lines?))
 
 (define-method string-base (:update-display! window screen x-start y-start
                                             xl xu yl yu display-style)
@@ -66,7 +66,8 @@
 #|
                (subscreen-clear! screen
                                  (+ x-start xl) (+ x-start xu)
-                                 (+ y-start yl) (+ y-start yu))|#
+                                 (+ y-start yl) (+ y-start yu))
+|#
                )
               ((< yl yu)
                (let ((start (cdr representation))
                      (let ((x-start (+ x-start end)))
                        (subscreen-clear! screen
                                          (+ x-start xl) (+ x-start xu)
-                                         ayl ayu))))|#
+                                         ayl ayu))))
+|#
                  ))))
        (else
         (screen-write-substrings! screen (+ x-start xl) (+ y-start yl)
                                   representation xl xu yl yu)))
   true)
 \f
-(define (string-base:set-size-given-x! window x)
-  (with-instance-variables string-base window (x)
+(define (string-base:set-size-given-x! window x *truncate-lines?)
+  (with-instance-variables string-base window (x *truncate-lines?)
+    (set! truncate-lines? *truncate-lines?)
     (set! x-size x)
     (set! y-size (string-base:desired-y-size window x))
     (string-base:refresh! window)))
 
-(define (string-base:set-size-given-y! window y)
-  (with-instance-variables string-base window (y)
+(define (string-base:set-size-given-y! window y *truncate-lines?)
+  (with-instance-variables string-base window (y *truncate-lines?)
+    (set! truncate-lines? *truncate-lines?)
     (set! x-size (string-base:desired-x-size window y))
     (set! y-size y)
     (string-base:refresh! window)))
 
-(define-integrable (string-base:desired-x-size window y-size)
+(define (string-base:desired-x-size window y-size)
   (with-instance-variables string-base window (y-size)
-    (column->x-size (image-column-size image) y-size)))
+    (column->x-size (image-column-size image) y-size truncate-lines?)))
 
-(define-integrable (string-base:desired-y-size window x-size)
+(define (string-base:desired-y-size window x-size)
   (with-instance-variables string-base window (x-size)
-    (column->y-size (image-column-size image) x-size)))
+    (column->y-size (image-column-size image) x-size truncate-lines?)))
 
 (define (string-base:index->coordinates window index)
   (with-instance-variables string-base window (index)
     (column->coordinates (image-column-size image)
                         x-size
+                        truncate-lines?
                         (image-index->column image index))))
 
 (define (string-base:index->x window index)
   (with-instance-variables string-base window (index)
     (column->x (image-column-size image)
               x-size
+              truncate-lines?
               (image-index->column image index))))
 
 (define (string-base:index->y window index)
   (with-instance-variables string-base window (index)
     (column->y (image-column-size image)
               x-size
+              truncate-lines?
               (image-index->column image index))))
 
 (define (string-base:coordinates->index window x y)
   (with-instance-variables string-base window (x y)
     (image-column->index image
-                        (min (coordinates->column x y x-size)
-                             (image-column-size image)))))
+                        (let ((column-size (image-column-size image)))
+                          (if (and truncate-lines? (= x (-1+ x-size)))
+                              column-size
+                              (min (coordinates->column x y x-size)
+                                   column-size))))))
 \f
-(define (column->x-size column-size y-size)
+(define (column->x-size column-size y-size truncate-lines?)
   ;; Assume Y-SIZE > 0.
-  (let ((qr (integer-divide column-size y-size)))
-    (if (zero? (integer-divide-remainder qr))
-       (integer-divide-quotient qr)
-       (1+ (integer-divide-quotient qr)))))
+  (if truncate-lines?
+      column-size
+      (let ((qr (integer-divide column-size y-size)))
+       (if (zero? (integer-divide-remainder qr))
+           (integer-divide-quotient qr)
+           (1+ (integer-divide-quotient qr))))))
 
-(define (column->y-size column-size x-size)
+(define (column->y-size column-size x-size truncate-lines?)
   ;; Assume X-SIZE > 1.
-  (if (zero? column-size)
+  (if (or truncate-lines? (zero? column-size))
       1
       (let ((qr (integer-divide column-size (-1+ x-size))))
        (if (zero? (integer-divide-remainder qr))
            (integer-divide-quotient qr)
            (1+ (integer-divide-quotient qr))))))
 
-(define (column->coordinates column-size x-size column)
+(define (column->coordinates column-size x-size truncate-lines? column)
   (let ((-1+x-size (-1+ x-size)))
-    (if (< column -1+x-size)
-       (cons column 0)
-       (let ((qr (integer-divide column -1+x-size)))
-         (if (and (zero? (integer-divide-remainder qr))
-                  (= column column-size))
-             (cons -1+x-size
-                   (-1+ (integer-divide-quotient qr)))
-             (cons (integer-divide-remainder qr)
-                   (integer-divide-quotient qr)))))))
-
-(define (column->x column-size x-size column)
+    (cond ((< column -1+x-size)
+          (cons column 0))
+         (truncate-lines?
+          (cons -1+x-size 0))
+         (else
+          (let ((qr (integer-divide column -1+x-size)))
+            (if (and (zero? (integer-divide-remainder qr))
+                     (= column column-size))
+                (cons -1+x-size
+                      (-1+ (integer-divide-quotient qr)))
+                (cons (integer-divide-remainder qr)
+                      (integer-divide-quotient qr))))))))
+
+(define (column->x column-size x-size truncate-lines? column)
   (let ((-1+x-size (-1+ x-size)))
-    (if (< column -1+x-size)
-       column
-       (let ((r (remainder column -1+x-size)))
-         (if (and (zero? r) (= column column-size))
-             -1+x-size
-             r)))))
-
-(define (column->y column-size x-size column)
-  (let ((-1+x-size (-1+ x-size)))
-    (if (< column -1+x-size)
-       0
-       (let ((qr (integer-divide column -1+x-size)))
-         (if (and (zero? (integer-divide-remainder qr))
-                  (= column column-size))
-             (-1+ (integer-divide-quotient qr))
-             (integer-divide-quotient qr))))))
+    (cond ((< column -1+x-size)
+          column)
+         (truncate-lines?
+          -1+x-size)
+         (else
+          (let ((r (remainder column -1+x-size)))
+            (if (and (zero? r) (= column column-size))
+                -1+x-size
+                r))))))
+
+(define (column->y column-size x-size truncate-lines? column)
+  (if truncate-lines?
+      0
+      (let ((-1+x-size (-1+ x-size)))
+       (if (< column -1+x-size)
+           0
+           (let ((qr (integer-divide column -1+x-size)))
+             (if (and (zero? (integer-divide-remainder qr))
+                      (= column column-size))
+                 (-1+ (integer-divide-quotient qr))
+                 (integer-divide-quotient qr)))))))
 
 (define-integrable (coordinates->column x y x-size)
   (+ x (* y (-1+ x-size))))
 
 (define (string-base:refresh! window)
   (with-instance-variables string-base window ()
-    (let ((string (image-representation image)))
-      (let ((column-size (string-length string)))
-       (if (< column-size x-size)
-           (let ((start 
-                  (string-find-next-char-in-set string char-set:not-space)))
-             (if (not (and (pair? representation)
-                           (string=? (car representation) string)
-                           (eqv? (cdr representation) start)))
-                 (begin (set! representation (cons string start))
-                        (setup-redisplay-flags! redisplay-flags))))
-           (let ((rep (make-vector y-size '()))
-                 (x-max (-1+ x-size)))
-             (define (loop start y)
-               (let ((s (string-allocate x-size))
-                     (end (+ start x-max)))
-                 (vector-set! rep y s)
-                 (cond ((<= column-size end)
+    (define (one-liner string)
+      (let ((start 
+            (string-find-next-char-in-set string char-set:not-space)))
+       (if (not (and (pair? representation)
+                     (string=? (car representation) string)
+                     (eqv? (cdr representation) start)))
+           (begin
+             (set! representation (cons string start))
+             (setup-redisplay-flags! redisplay-flags)))))
+    (let* ((string (image-representation image))
+          (column-size (string-length string)))
+      (cond ((< column-size x-size)
+            (one-liner string))
+           (truncate-lines?
+            (one-liner
+             (let ((s (string-allocate x-size))
+                   (x-max (-1+ x-size)))
+               (substring-move-right! string 0 x-max s 0)
+               (string-set! s x-max #\$)
+               s)))
+           (else
+            (let ((rep (make-vector y-size '()))
+                  (x-max (-1+ x-size)))
+              (let loop ((start 0) (y 0))
+                (let ((s (string-allocate x-size))
+                      (end (+ start x-max)))
+                  (vector-set! rep y s)
+                  (if (<= column-size end)
+                      (begin
                         (substring-move-right! string start column-size s 0)
-                        (substring-fill! s (- column-size start) x-size
+                        (substring-fill! s
+                                         (- column-size start)
+                                         x-size
                                          #\space))
-                       (else
+                      (begin
                         (substring-move-right! string start end s 0)
                         (string-set! s x-max #\\)
                         (loop end (1+ y))))))
-             (loop 0 0)
-             (set! representation rep)
-             (setup-redisplay-flags! redisplay-flags)))))))\f
+              (set! representation rep)
+              (setup-redisplay-flags! redisplay-flags)))))))
+\f
 ;;;; Blank Window
 
 (define-class blank-window vanilla-window
index 479f4033d245e86ea30fead4ac6f7826ae63ba84..e33da095cd8127caa1c8ea076d7aaf9de425afd0 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/wincom.scm,v 1.93 1989/04/28 22:54:32 cph Rel $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/edwin/wincom.scm,v 1.94 1989/08/08 10:06:36 cph Exp $
 ;;;
 ;;;    Copyright (c) 1987, 1989 Massachusetts Institute of Technology
 ;;;
@@ -87,6 +87,31 @@ Do not set this variable below 1."
   "Pop-up windows would prefer to split the largest window if this large.
 If there is only one window, it is split regardless of this value."
   500)
+
+(define-variable-per-buffer truncate-lines
+  "*True means do not display continuation lines;
+give each line of text one screen line.
+Automatically becomes local when set in any fashion.
+
+Note that this is overridden by the variable
+truncate-partial-width-windows if that variable is true
+and this buffer is not full-screen width."
+  false)
+
+(define-variable truncate-partial-width-windows
+  "*True means truncate lines in all windows less than full screen wide."
+  true)
+
+(let ((setup-truncate-lines!
+       (lambda (variable)
+        variable                       ;ignore
+        (for-each window-setup-truncate-lines! (all-windows)))))
+  (add-variable-assignment-daemon!
+   (ref-variable-object truncate-lines)
+   setup-truncate-lines!)
+  (add-variable-assignment-daemon!
+   (ref-variable-object truncate-partial-width-windows)
+   setup-truncate-lines!))
 \f
 (define-command redraw-display
   "Redraws the entire display from scratch."
@@ -450,16 +475,16 @@ Also kills any pop up window it may have created."
 
 (define (largest-window)
   (let ((start (window0)))
-    (define (loop window largest largest-area)
+    (let loop
+       ((window (window1+ start))
+        (largest start)
+        (largest-area (* (window-x-size start) (window-y-size start))))
       (if (eq? window start)
          largest
          (let ((area (* (window-x-size window) (window-y-size window))))
            (if (> area largest-area)
                (loop (window1+ window) window area)
-               (loop (window1+ window) largest largest-area)))))
-    (loop (window1+ start)
-         start
-         (* (window-x-size start) (window-y-size start)))))
+               (loop (window1+ window) largest largest-area)))))))
 
 (define (lru-window)
   (let ((start (window0)))
@@ -492,8 +517,8 @@ Also kills any pop up window it may have created."
     (search-full-width (window1+ start) false false)))
 
 (define (delete-other-windows start)
-  (define (loop window)
+  (let loop ((window (window1+ start)))
     (if (not (eq? window start))
-       (begin (window-delete! window)
-              (loop (window1+ window)))))
-  (loop (window1+ start)))
\ No newline at end of file
+       (begin
+         (window-delete! window)
+         (loop (window1+ window))))))
\ No newline at end of file