home *** CD-ROM | disk | FTP | other *** search
- ;;;
- ;;; Copyright (c) 1985 Massachusetts Institute of Technology
- ;;;
- ;;; This material was developed by the Scheme project at the
- ;;; Massachusetts Institute of Technology, Department of
- ;;; Electrical Engineering and Computer Science. Permission to
- ;;; copy this software, to redistribute it, and to use it for any
- ;;; purpose is granted, subject to the following restrictions and
- ;;; understandings.
- ;;;
- ;;; 1. Any copy made of this software must include this copyright
- ;;; notice in full.
- ;;;
- ;;; 2. Users of this software agree to make their best efforts (a)
- ;;; to return to the MIT Scheme project any improvements or
- ;;; extensions that they make, so that these may be included in
- ;;; future releases; and (b) to inform MIT of noteworthy uses of
- ;;; this software.
- ;;;
- ;;; 3. All materials developed as a consequence of the use of
- ;;; this software shall duly acknowledge such use, in accordance
- ;;; with the usual standards of acknowledging credit in academic
- ;;; research.
- ;;;
- ;;; 4. MIT has made no warrantee or representation that the
- ;;; operation of this software will be error-free, and MIT is
- ;;; under no obligation to provide any services, by way of
- ;;; maintenance, update, or otherwise.
- ;;;
- ;;; 5. In conjunction with products arising from the use of this
- ;;; material, there shall be no use of the name of the
- ;;; Massachusetts Institute of Technology nor of any adaptation
- ;;; thereof in any advertising, promotional, or sales literature
- ;;; without prior written consent from MIT in each case.
- ;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; Modified by Texas Instruments Inc 8/15/85
- ;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
- ;;;; Textual Entities
-
- ;;;; Motion Primitives
-
- ;;; This file "defines" various kinds of things like lines, pages,
- ;;; words, etc. The "definition" of a FOO entity consists of two
- ;;; procedures, FORWARD-FOO and BACKWARD-FOO, each of which takes
- ;;; three arguments: [1] a mark to start from, [2] the number of FOOs
- ;;; to traverse, and [3] a limit for LIMIT-MARK-MOTION. The value of
- ;;; the procedure should be either a mark or #F.
-
- ;;; If the number is positive, traverse that many FOOs in the given
- ;;; direction; if negative, in the opposite direction; and zero means
- ;;; don't move. It is assumed that no two FOOs overlap; they may or
- ;;; may not touch one another. When moving forward, stop to the right
- ;;; of the rightmost edge of the FOO. When moving backward, stop to
- ;;; the left of the leftmost edge.
-
- ;;; MAKE-MOTION-PAIR will generate these two procedures, given the
- ;;; simpler primitives to move forward or backward once.
-
- (define (move-thing forward-thing argument)
- (set-current-point! (forward-thing (current-point) argument 'BEEP)))
-
- (define (make-motion-pair forward-one-thing backward-one-thing receiver)
- (define (forward-thing mark n limit?)
- (cond ((positive? n) (%forward-thing mark n limit?))
- ((negative? n) (%backward-thing mark (- n) limit?))
- (else mark)))
-
- (define (%forward-thing mark n limit?)
- (define (loop mark n)
- (let ((end (forward-one-thing mark (group-end mark))))
- (cond ((not end) (limit-mark-motion limit? mark))
- ((= n 1) end)
- (else (loop end (-1+ n))))))
- (loop mark n))
-
- (define (backward-thing mark n limit?)
- (cond ((positive? n) (%backward-thing mark n limit?))
- ((negative? n) (%forward-thing mark (- n) limit?))
- (else mark)))
-
- (define (%backward-thing mark n limit?)
- (define (loop mark n)
- (let ((start (backward-one-thing mark (group-start mark))))
- (cond ((not start) (limit-mark-motion limit? mark))
- ((= n 1) start)
- (else (loop start (-1+ n))))))
- (loop mark n))
-
- (receiver forward-thing backward-thing))
-
- ;;;; Generic Operations
-
- (define (move-thing-saving-point forward-thing argument)
- (let ((mark (current-point)))
- (push-current-mark! mark)
- (set-current-point! (forward-thing mark argument 'BEEP))))
-
- (define (mark-thing forward-thing n)
- (push-current-mark! (forward-thing (current-point) n 'ERROR)))
-
- (define (kill-thing forward-thing n)
- (kill-region (forward-thing (current-point) n 'ERROR)))
-
- ;;;(define (transpose-things forward-thing n)
- ;;; (define (forward-once i)
- ;;; (let ((m4 (mark-right-inserting (forward-thing (current-point) 1 'ERROR))))
- ;;; (set-current-point! m4)
- ;;; (let ((m2 (mark-permanent! (forward-thing m4 -1 'ERROR))))
- ;;; (let ((m1 (mark-permanent! (forward-thing m2 -1 'ERROR))))
- ;;; (let ((m3 (forward-thing m1 1 'ERROR)))
- ;;; (region-insert! m4 (region-extract! (make-region m1 m3)))
- ;;; (region-insert! m1 (region-extract! (make-region m2 m4))))))))
- ;;;
- ;;; (define (backward-once i)
- ;;; (let ((m2 (mark-permanent! (forward-thing (current-point) -1 'ERROR))))
- ;;; (let ((m1 (mark-left-inserting (forward-thing m2 -1 'ERROR))))
- ;;; (let ((m3 (forward-thing m1 1 'ERROR))
- ;;; (m4 (mark-right-inserting (forward-thing m2 1 'ERROR))))
- ;;; (region-insert! m4 (region-extract! (make-region m1 m3)))
- ;;; (region-insert! m1 (region-extract! (make-region m2 m4))))
- ;;; (set-current-point! m1))))
- ;;;
- ;;; (define (special)
- ;;; (let ((m1 (normalize (current-point)))
- ;;; (m2 (normalize (current-mark))))
- ;;; (cond ((mark< m1 m2)
- ;;; (exchange m1 m2
- ;;; (lambda (m1 m2)
- ;;; (set-current-point! m2)
- ;;; (set-current-mark! m1))))
- ;;; ((mark< m2 m1)
- ;;; (exchange m2 m1
- ;;; (lambda (m2 m1)
- ;;; (set-current-point! m2)
- ;;; (set-current-mark! m1)))))))
- ;;;
- ;;; (define (exchange m1 m2 receiver)
- ;;; (let ((m1 (mark-right-inserting m1))
- ;;; (m3 (forward-thing m1 1 'ERROR))
- ;;; (m2 (mark-permanent! m2))
- ;;; (m4 (mark-right-inserting (forward-thing m2 1 'ERROR))))
- ;;; (region-insert! m4 (region-extract! (make-region m1 m3)))
- ;;; (region-insert! m1 (region-extract! (make-region m2 m4)))
- ;;; (receiver m4 m1)))
- ;;;
- ;;; (define (normalize m)
- ;;; (forward-thing (forward-thing m 1 'ERROR) -1 'ERROR))
- ;;;
- ;;; (cond ((positive? n) (dotimes n forward-once))
- ;;; ((negative? n) (dotimes (- n) backward-once))
- ;;; (else (special))))
-
- ;;;; Horizontal Space
-
- (define (region-blank? region)
- (not (find-next-non-blank (region-start region)
- (region-end region)
- #F)))
-
- (define (line-blank? mark)
- (not (find-next-non-blank (line-start mark 0 #F)
- (line-end mark 0 #F)
- #F)))
-
- (define (horizontal-space-region mark)
- (make-region (horizontal-space-start mark)
- (horizontal-space-end mark)))
-
- (define (horizontal-space-start mark)
- (find-previous-non-blank mark (line-start mark 0 #F) 'LIMIT))
-
- (define (horizontal-space-end mark)
- (find-next-non-blank mark (line-end mark 0 #F) 'LIMIT))
-
- ;(define (compute-horizontal-space c1 c2 receiver)
- ;;; ;; Compute the number of tabs/spaces required to fill from column C1
- ;;; ;; to C2 with whitespace. It is assumed that C1 >= C2.
- ;;; (if indent-tabs-mode
- ;;; (let ((qr (integer-divide c2 tab-width)))
- ;;; (receiver (- (integer-divide-quotient qr) (quotient c1 tab-width))
- ;;; (integer-divide-remainder qr)))
- ;;; (receiver (- c2 c1) 0)))
- ;;;
- ;;;(define (insert-horizontal-space target-column #!optional point)
- ;;; (set! point
- ;;; (if (unassigned? point) (current-point) (mark-left-inserting point)))
- ;;; (compute-horizontal-space (mark-column point) target-column
- ;;; (lambda (n-tabs n-spaces)
- ;;; (insert-chars #\Tab n-tabs point)
- ;;; (insert-chars #\Space n-spaces point))))
-
- (define (delete-horizontal-space)
- (let ((point (current-point)))
- (region-delete! (horizontal-space-region point))))
-
- (define find-next-non-blank (char-set-forward-search char-set:non-blanks))
- (define find-previous-non-blank (char-set-backward-search char-set:non-blanks))
-
-
- ;;;; Lines
- ; I could not find any calls to the following functions, so I commented
- ; them out. Note, they must have the #!optional fixed before they are added
- ; back in
-
- ;;;(define (forward-line mark n #!optional limit?)
- ;;; (if (unassigned? limit?) (set! limit? #F))
- ;;; (cond ((positive? n) (%forward-line mark n limit?))
- ;;; ((negative? n) (%backward-line mark (- n) limit?))
- ;;; (else mark)))
-
- ;;;(define %forward-line
- ;;; line-start)
-
- ;;;(define (backward-line mark n #!optional limit?)
- ;;; (if (unassigned? limit?) (set! limit? #F))
- ;;; (cond ((positive? n) (%backward-line mark n limit?))
- ;;; ((negative? n) (%forward-line mark (- n) limit?))
- ;;; (else mark)))
-
- ;;;(define (%backward-line mark n limit?)
- ;;; (line-start mark
- ;;; (- (if (line-start? mark)
- ;;; n
- ;;; (-1+ n)))
- ;;; limit?))
-