From 63038285e563c453d89a3fdaea2afc4f0c5a3d41 Mon Sep 17 00:00:00 2001 From: Max New Date: Mon, 9 Mar 2015 17:12:43 -0500 Subject: [PATCH] Delete trailing whitespace on return --- gui-doc/scribblings/framework/racket.scrbl | 1 + gui-lib/framework/private/racket.rkt | 36 ++++++++++++-------- gui-test/framework/tests/racket.rkt | 38 ++++++++++++++++++++++ 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/gui-doc/scribblings/framework/racket.scrbl b/gui-doc/scribblings/framework/racket.scrbl index 6364f77d..6ba0f0f0 100644 --- a/gui-doc/scribblings/framework/racket.scrbl +++ b/gui-doc/scribblings/framework/racket.scrbl @@ -86,6 +86,7 @@ @defmethod*[(((insert-return) void?))]{ Inserts a newline into the buffer. If @method[racket:text<%> tabify-on-return?] returns @racket[#t], this will tabify the new line. + Deletes any trailing whitespace from the old line. } @defmethod*[(((box-comment-out-selection diff --git a/gui-lib/framework/private/racket.rkt b/gui-lib/framework/private/racket.rkt index 38662f20..c0d86887 100644 --- a/gui-lib/framework/private/racket.rkt +++ b/gui-lib/framework/private/racket.rkt @@ -756,20 +756,28 @@ (define (tabify-all) (tabify-selection 0 (last-position))) (define (insert-return) - (if (tabify-on-return?) - (begin - (begin-edit-sequence #t #f) - (insert #\newline) - (tabify (get-start-position)) - (set-position - (let loop ([new-pos (get-start-position)]) - (if (let ([next (get-character new-pos)]) - (and (char-whitespace? next) - (not (char=? next #\newline)))) - (loop (add1 new-pos)) - new-pos))) - (end-edit-sequence)) - (insert #\newline))) + (begin-edit-sequence #t #f) + (define end-of-whitespace (get-start-position)) + (define start-cutoff + (paragraph-start-position (position-paragraph end-of-whitespace))) + (define start-of-whitespace + (let loop ([pos end-of-whitespace]) + (if (and (> pos start-cutoff) + (char-whitespace? (get-character (sub1 pos)))) + (loop (sub1 pos)) + pos))) + (delete start-of-whitespace end-of-whitespace) + (insert #\newline) + (when (and (tabify-on-return?) + (tabify (get-start-position))) + (set-position + (let loop ([new-pos (get-start-position)]) + (if (let ([next (get-character new-pos)]) + (and (char-whitespace? next) + (not (char=? next #\newline)))) + (loop (add1 new-pos)) + new-pos)))) + (end-edit-sequence)) (define (calc-last-para last-pos) (let ([last-para (position-paragraph last-pos #t)]) diff --git a/gui-test/framework/tests/racket.rkt b/gui-test/framework/tests/racket.rkt index 9239f8b0..ce2799ff 100644 --- a/gui-test/framework/tests/racket.rkt +++ b/gui-test/framework/tests/racket.rkt @@ -185,6 +185,44 @@ (test-magic-square-bracket 'for/fold1 "(for/fold (" "(for/fold ([") (test-magic-square-bracket 'for/fold2 "(for/fold ([x 1]) (" "(for/fold ([x 1]) ([") +(define (test-insert-return/proc line before-txt before-pos after-txt after-pos #:tabify? [tabify? #t]) + (test + (string->symbol (format "racket:test-insert-return ~a" line)) + (λ (x) + (and (equal? (car x) after-pos) + (equal? (cadr x) after-txt))) + (λ () + (queue-sexp-to-mred + `(let () + (define t (new (class racket:text% + (define/override (tabify-on-return?) ,tabify?) + (super-new)))) + (send t insert ,before-txt) + (send t set-position ,before-pos) + (send t insert-return) + (list (send t get-start-position) + (send t get-text))))))) + +(define-syntax (test-insert-return stx) + (syntax-case stx () + [(_ before-txt before-pos after-txt after-pos . args) + (with-syntax ([line (syntax-line stx)]) + #'(test-insert-return/proc line before-txt before-pos after-txt after-pos . args))])) + +(test-insert-return "" 0 "\n" 1) +(test-insert-return "" 0 "\n" 1 #:tabify? #f) +(test-insert-return " " 1 "\n" 1) +(test-insert-return " " 1 "\n" 1 #:tabify? #f) +(test-insert-return "( " 2 "(\n " 3) +(test-insert-return "( " 2 "(\n" 2 #:tabify? #f) +(test-insert-return "hellothere" 5 "hello\nthere" 6) +(test-insert-return "hellothere" 5 "hello\nthere" 6 #:tabify? #f) +(test-insert-return "#lang racket\n(+ 123 456)\n 4" 20 "#lang racket\n(+ 123\n 456)\n 4" 22) +(test-insert-return "#lang racket\n(+ 123 456)\n 4" 20 "#lang racket\n(+ 123\n456)\n 4" 20 #:tabify? #f) +(test-insert-return "#lang racket\n(+ 123 456)\n 4" 22 "#lang racket\n(+ 123\n 456)\n 4" 22) +(test-insert-return "#lang racket\n(+ 123 456)\n 4" 22 "#lang racket\n(+ 123\n 456)\n 4" 20 #:tabify? #f) +(test-insert-return "#lang racket\n(+ 123 \n 456)\n 4" 22 "#lang racket\n(+ 123 \n\n 456)\n 4" 24) +(test-insert-return "#lang racket\n(+ 123 \n 456)\n 4" 22 "#lang racket\n(+ 123 \n\n 456)\n 4" 22 #:tabify? #f) (define (test-message-send/proc line before expected pos msg #:check-result? [check-result? #f]