Skip to content

Commit

Permalink
Cleanup in editor.rkt. Create deletion.rkt to avoid cyclic requiremen…
Browse files Browse the repository at this point in the history
…ts between buffer.rkt and region.rkt
  • Loading branch information
soegaard committed Jun 2, 2018
1 parent 88e80bd commit 639fdf1
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 74 deletions.
5 changes: 3 additions & 2 deletions buffer.rkt
Expand Up @@ -8,8 +8,9 @@
"dlist.rkt"
"mark.rkt"
"line.rkt"
"region.rkt"
"mode.rkt")
"mode.rkt"
"region.rkt")

;;;
;;; BUFFER
;;;
Expand Down
47 changes: 47 additions & 0 deletions deletion.rkt
@@ -0,0 +1,47 @@
#lang racket
(provide region-delete
region-delete-between!)

;;;
;;; DELETION
;;;

(require "parameters.rkt"
"mark.rkt"
"point.rkt"
"buffer.rkt"
"region.rkt"
"representation.rkt")

; region-delete-between! : [buffer] -> void
; Delete all characters in region.
(define (region-delete-between! beg end [b (current-buffer)])
(cond
[(mark< beg end) (buffer-dirty! b)
(define n (- (mark-position end) (mark-position beg)))
(define end-is-a-mark? (member end (buffer-marks b) eq?))
; buffer-delete-backward-char! will update the positions
; of all marks in buffer-marks, so if end is a mark (not the point)
; we need to temporarily remove it.
(when end-is-a-mark?
(set-buffer-marks! b (remove end (buffer-marks b) eq?)))
(with-saved-point
(begin
(set-point! end)
(buffer-delete-backward-char! b n)))
(when end-is-a-mark?
(set-buffer-marks! b (cons end (buffer-marks b))))]
[(mark< end beg) (region-delete-between! end beg b)]
[else (void)]))

; region-delete! : [buffer] -> void
; Delete all characters in region.
(define (region-delete [b (current-buffer)])
(define mark (get-mark b))
(define point (get-point b))
(when (use-region? b)
(buffer-dirty! b)
(region-delete-between! mark point)
(mark-deactivate! mark)))

; Note: Emacs has delete-active-region, delete-and-extract-region, and, delete-region
71 changes: 5 additions & 66 deletions editor.rkt
Expand Up @@ -68,56 +68,17 @@
(require racket/gui/base syntax/to-string)
(require (only-in srfi/1 circular-list))

(require "parameters.rkt"
"representation.rkt"
"buffer.rkt"
(require "buffer.rkt"
"deletion.rkt"
"line.rkt"
"mark.rkt"
"parameters.rkt"
"point.rkt"
"region.rkt"
"representation.rkt"
"string-utils.rkt"
"text.rkt")


;;;
;;; REGION
;;;

; region-delete-between! : [buffer] -> void
; Delete all characters in region.
(define (region-delete-between! beg end [b (current-buffer)])
(cond
[(mark< beg end) (buffer-dirty! b)
(define n (- (mark-position end) (mark-position beg)))
(define end-is-a-mark? (member end (buffer-marks b) eq?))
; buffer-delete-backward-char! will update the positions
; of all marks in buffer-marks, so if end is a mark (not the point)
; we need to temporarily remove it.
(when end-is-a-mark?
(set-buffer-marks! b (remove end (buffer-marks b) eq?)))
(with-saved-point
(begin
(set-point! end)
(buffer-delete-backward-char! b n)))
(when end-is-a-mark?
(set-buffer-marks! b (cons end (buffer-marks b))))]
[(mark< end beg) (region-delete-between! end beg b)]
[else (void)]))

; region-delete! : [buffer] -> void
; Delete all characters in region.
(define (region-delete [b (current-buffer)])
(define mark (get-mark b))
(define point (get-point b))
(when (use-region? b)
(buffer-dirty! b)
(region-delete-between! mark point)
(mark-deactivate! mark)))

; Note: Emacs has delete-active-region, delete-and-extract-region, and, delete-region



;;;
;;; KILLING
;;;
Expand Down Expand Up @@ -1962,29 +1923,7 @@
(send f show #t))


(module+ test
(define ib illead-buffer)
;(current-buffer ib)
(current-buffer scratch-buffer)
(define f (frame #f #f #f #f #f))
(frame-install-frame%! f) ; installs frame% and panel

(define p (frame-panel f))
(define w (new-window f p scratch-buffer 'root))

;(define sp (vertical-split-window f #f #f #f #f #f #f))
; (define w (window f #f c sp ib))
; (define c2 #f)
; (define w2 (window f #f c2 sp (get-buffer "*scratch*")))
; (set-vertical-split-window-above! sp w)
; (set-vertical-split-window-below! sp w2)
; (set-frame-windows! f sp)

(set-frame-windows! f w)
(current-window w)
(current-frame f)

(send (window-canvas w) focus))


(define (display-file path)
(with-input-from-file path
Expand Down
5 changes: 3 additions & 2 deletions region.rkt
Expand Up @@ -10,7 +10,9 @@
;;; REGIONS
;;;

; region = text between point and the first mark is known as the region.
; The region is the text between point and the first mark.
; The representation of the region is therefore implicitly given by the point and the first mark.

; set-mark-command sets a mark, and then a region exists

(define (region-beginning [b (current-buffer)])
Expand Down Expand Up @@ -58,4 +60,3 @@
(and (not (empty? marks))
(first marks)))


25 changes: 25 additions & 0 deletions test.rkt
Expand Up @@ -2,6 +2,7 @@
(require "buffer.rkt"
"text.rkt"
"line.rkt"
"parameters.rkt"
"representation.rkt"
"dlist.rkt")

Expand Down Expand Up @@ -70,3 +71,27 @@
(append-to-buffer-from-file append-buffer "illead.txt")
(save-buffer! b) ; make sure the buffer is unmodified before comparison
#;(check-equal? (buffer-text append-buffer) (text-append! illead-text illead-text)))

#;(module+ test
(define ib illead-buffer)
;(current-buffer ib)
(current-buffer scratch-buffer)
(define f (frame #f #f #f #f #f))
(frame-install-frame%! f) ; installs frame% and panel

(define p (frame-panel f))
(define w (new-window f p scratch-buffer 'root))

;(define sp (vertical-split-window f #f #f #f #f #f #f))
; (define w (window f #f c sp ib))
; (define c2 #f)
; (define w2 (window f #f c2 sp (get-buffer "*scratch*")))
; (set-vertical-split-window-above! sp w)
; (set-vertical-split-window-below! sp w2)
; (set-frame-windows! f sp)

(set-frame-windows! f w)
(current-window w)
(current-frame f)

(send (window-canvas w) focus))
9 changes: 5 additions & 4 deletions text.rkt
Expand Up @@ -28,7 +28,7 @@
(cond
[(dempty? lines) (text (linked-line (new-line "\n") dempty dempty "no-version-yet" '()) 1)]
[else (text lines (for/sum ([l lines])
(line-length l)))]))
(line-length l)))]))

; text-line : text integer -> line
; the the ith line
Expand All @@ -44,8 +44,8 @@
; convert the text to a string
(define (text->string t)
(apply string-append
(for/list ([l (text-lines t)])
(line->string l))))
(for/list ([l (text-lines t)])
(line->string l))))

; subtext->string : text integer integer -> string
(define (subtext->string t p1 p2)
Expand Down Expand Up @@ -79,7 +79,7 @@

(define (text-num-chars t)
(for/sum ([line (text-lines t)])
(line-length line)))
(line-length line)))

(define (text-stats t)
(define-values (nlines nchars)
Expand Down Expand Up @@ -134,3 +134,4 @@
[else ;
(error 'todo)]))


0 comments on commit 639fdf1

Please sign in to comment.