From e75fcff6b0909e32fbe7967edac857b46b1d4cb1 Mon Sep 17 00:00:00 2001 From: Chris Hanson Date: Tue, 8 Aug 1989 10:06:36 +0000 Subject: [PATCH] * Implement `save-buffers-kill-edwin' which kills Edwin and returns to 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) --- v7/src/edwin/basic.scm | 17 +++- v7/src/edwin/buffer.scm | 97 +++++++++++++++++++--- v7/src/edwin/buffrm.scm | 25 +++--- v7/src/edwin/bufwin.scm | 111 ++++++++++++++++++------- v7/src/edwin/bufwiu.scm | 129 +++++++++++++++++------------ v7/src/edwin/bufwmc.scm | 24 ++++-- v7/src/edwin/calias.scm | 12 ++- v7/src/edwin/comman.scm | 37 ++++++++- v7/src/edwin/comred.scm | 6 +- v7/src/edwin/curren.scm | 25 +++--- v7/src/edwin/editor.scm | 4 +- v7/src/edwin/edtfrm.scm | 11 ++- v7/src/edwin/edtstr.scm | 9 ++ v7/src/edwin/edwin.pkg | 4 +- v7/src/edwin/fill.scm | 14 ++-- v7/src/edwin/lincom.scm | 8 +- v7/src/edwin/macros.scm | 15 +++- v7/src/edwin/make.scm | 4 +- v7/src/edwin/modefs.scm | 6 +- v7/src/edwin/sercom.scm | 8 +- v7/src/edwin/utlwin.scm | 176 ++++++++++++++++++++++++---------------- v7/src/edwin/wincom.scm | 45 +++++++--- 22 files changed, 553 insertions(+), 234 deletions(-) diff --git a/v7/src/edwin/basic.scm b/v7/src/edwin/basic.scm index fa0461fec..56e3ad742 100644 --- a/v7/src/edwin/basic.scm +++ b/v7/src/edwin/basic.scm @@ -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." diff --git a/v7/src/edwin/buffer.scm b/v7/src/edwin/buffer.scm index f6e38f1b2..3fe830430 100644 --- a/v7/src/edwin/buffer.scm +++ b/v7/src/edwin/buffer.scm @@ -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)))) + +(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))) + (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)))))) + ;;;; Modes (define-integrable (buffer-major-mode buffer) diff --git a/v7/src/edwin/buffrm.scm b/v7/src/edwin/buffrm.scm index 9e06c038a..ddbd9ccd9 100644 --- a/v7/src/edwin/buffrm.scm +++ b/v7/src/edwin/buffrm.scm @@ -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)) @@ -169,16 +171,12 @@ (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 () @@ -301,4 +299,7 @@ (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 diff --git a/v7/src/edwin/bufwin.scm b/v7/src/edwin/bufwin.scm index d3c5defb7..3fcb376e5 100644 --- a/v7/src/edwin/bufwin.scm +++ b/v7/src/edwin/bufwin.scm @@ -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) @@ -81,15 +82,37 @@ (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!) @@ -160,9 +183,12 @@ (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) @@ -226,7 +252,7 @@ (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 @@ -258,7 +284,8 @@ (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) @@ -391,28 +418,52 @@ (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))) + +(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) @@ -422,10 +473,10 @@ (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) @@ -467,7 +518,9 @@ (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 () diff --git a/v7/src/edwin/bufwiu.scm b/v7/src/edwin/bufwiu.scm index 9c35f7581..a10d6f5e5 100644 --- a/v7/src/edwin/bufwiu.scm +++ b/v7/src/edwin/bufwiu.scm @@ -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 ;;; @@ -111,52 +111,65 @@ (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!)))))) (define (recompute-image!:top-changed window) (with-instance-variables buffer-window window () @@ -166,7 +179,8 @@ (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!))) @@ -178,7 +192,8 @@ (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)) @@ -206,7 +221,8 @@ (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*) @@ -229,7 +245,8 @@ ;; 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 @@ -252,7 +269,8 @@ ;; 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 @@ -268,10 +286,13 @@ (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))) diff --git a/v7/src/edwin/bufwmc.scm b/v7/src/edwin/bufwmc.scm index 7dec42d6f..2771a6040 100644 --- a/v7/src/edwin/bufwmc.scm +++ b/v7/src/edwin/bufwmc.scm @@ -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 @@ -87,12 +89,15 @@ (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 @@ -138,11 +143,20 @@ (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) diff --git a/v7/src/edwin/calias.scm b/v7/src/edwin/calias.scm index b9ccf6668..f2b6826d7 100644 --- a/v7/src/edwin/calias.scm +++ b/v7/src/edwin/calias.scm @@ -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 ;;; @@ -74,7 +74,15 @@ (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))) diff --git a/v7/src/edwin/comman.scm b/v7/src/edwin/comman.scm index f4b7badce..4fa6103a5 100644 --- a/v7/src/edwin/comman.scm +++ b/v7/src/edwin/comman.scm @@ -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)))) @@ -108,8 +109,27 @@ (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)) @@ -117,7 +137,16 @@ (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)) diff --git a/v7/src/edwin/comred.scm b/v7/src/edwin/comred.scm index 788dabb65..b224aeab9 100644 --- a/v7/src/edwin/comred.scm +++ b/v7/src/edwin/comred.scm @@ -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 ;;; @@ -213,7 +213,9 @@ ((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)) diff --git a/v7/src/edwin/curren.scm b/v7/src/edwin/curren.scm index ccb898647..0d097c637 100644 --- a/v7/src/edwin/curren.scm +++ b/v7/src/edwin/curren.scm @@ -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 ;;; @@ -66,13 +66,13 @@ (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) @@ -190,10 +190,11 @@ (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)) diff --git a/v7/src/edwin/editor.scm b/v7/src/edwin/editor.scm index 0fae32e51..7982f113b 100644 --- a/v7/src/edwin/editor.scm +++ b/v7/src/edwin/editor.scm @@ -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 diff --git a/v7/src/edwin/edtfrm.scm b/v7/src/edwin/edtfrm.scm index 2835804ce..3f84f3c8b 100644 --- a/v7/src/edwin/edtfrm.scm +++ b/v7/src/edwin/edtfrm.scm @@ -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 ;;; @@ -132,6 +132,15 @@ (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*)) diff --git a/v7/src/edwin/edtstr.scm b/v7/src/edwin/edtstr.scm index dfc0b0247..c9e80828f 100644 --- a/v7/src/edwin/edtstr.scm +++ b/v7/src/edwin/edtstr.scm @@ -71,8 +71,17 @@ (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)) diff --git a/v7/src/edwin/edwin.pkg b/v7/src/edwin/edwin.pkg index bddd74bdc..d06de3459 100644 --- a/v7/src/edwin/edwin.pkg +++ b/v7/src/edwin/edwin.pkg @@ -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 diff --git a/v7/src/edwin/fill.scm b/v7/src/edwin/fill.scm index 8677cbc51..503355dec 100644 --- a/v7/src/edwin/fill.scm +++ b/v7/src/edwin/fill.scm @@ -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))) diff --git a/v7/src/edwin/lincom.scm b/v7/src/edwin/lincom.scm index 47c20bd75..60c76b8dc 100644 --- a/v7/src/edwin/lincom.scm +++ b/v7/src/edwin/lincom.scm @@ -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 #\))) -(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." diff --git a/v7/src/edwin/macros.scm b/v7/src/edwin/macros.scm index 61e7eff34..2a020e5de 100644 --- a/v7/src/edwin/macros.scm +++ b/v7/src/edwin/macros.scm @@ -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 ;;; @@ -136,6 +136,19 @@ ',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)))) diff --git a/v7/src/edwin/make.scm b/v7/src/edwin/make.scm index 6ab88b152..b1ca734cc 100644 --- a/v7/src/edwin/make.scm +++ b/v7/src/edwin/make.scm @@ -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 diff --git a/v7/src/edwin/modefs.scm b/v7/src/edwin/modefs.scm index f15628406..3effbdacc 100644 --- a/v7/src/edwin/modefs.scm +++ b/v7/src/edwin/modefs.scm @@ -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) diff --git a/v7/src/edwin/sercom.scm b/v7/src/edwin/sercom.scm index 8b912d7c6..8e6a2df27 100644 --- a/v7/src/edwin/sercom.scm +++ b/v7/src/edwin/sercom.scm @@ -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 ;;; @@ -48,8 +48,10 @@ ;;;; 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. diff --git a/v7/src/edwin/utlwin.scm b/v7/src/edwin/utlwin.scm index 1b1c7d271..38965b0c4 100644 --- a/v7/src/edwin/utlwin.scm +++ b/v7/src/edwin/utlwin.scm @@ -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)) @@ -102,103 +103,122 @@ (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) -(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)))))) -(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)))) @@ -237,33 +257,47 @@ (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))))))) + (set! representation rep) + (setup-redisplay-flags! redisplay-flags))))))) + ;;;; Blank Window (define-class blank-window vanilla-window diff --git a/v7/src/edwin/wincom.scm b/v7/src/edwin/wincom.scm index 479f4033d..e33da095c 100644 --- a/v7/src/edwin/wincom.scm +++ b/v7/src/edwin/wincom.scm @@ -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!)) (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 -- 2.25.1