I made small changes to the prose, starting from a typo. Hope it's okay -- Matthias
On Sep 23, 2011, at 5:37 PM, ro...@racket-lang.org wrote: > robby has updated `master' from ed6d3f3a6a to abda257295. > http://git.racket-lang.org/plt/ed6d3f3a6a..abda257295 > > =====[ 2 Commits ]====================================================== > > Directory summary: > 66.4% collects/drracket/private/syncheck/ > 8.0% collects/drracket/private/ > 18.7% collects/scribblings/drracket/ > 5.4% collects/tests/drracket/ > > ~~~~~~~~~~ > > a553cd7 Robby Findler <ro...@racket-lang.org> 2011-09-22 17:38 > : > | be more agressive about setting the current directory during check syntax > | also, minor Rackety > : > M collects/drracket/private/syncheck/gui.rkt | 337 +++++++++--------- > M collects/drracket/private/syncheck/traversals.rkt | 6 +- > > ~~~~~~~~~~ > > abda257 Robby Findler <ro...@racket-lang.org> 2011-09-23 16:36 > : > | moved the 'send to repl' keystrokes to the manual (and added a test > | suite to make sure the example code in the manual doesn't get stale) > : > M collects/drracket/private/rep.rkt | 7 --- > M collects/drracket/private/unit.rkt | 39 ---------------- > M collects/framework/test.rkt | 9 ++-- > M collects/scribblings/drracket/common.rkt | 8 ++- > A collects/scribblings/drracket/incremental-keybindings.rkt > M collects/scribblings/drracket/keybindings.scrbl | 49 +++++++++++++------ > A collects/tests/drracket/incremental-keybindings-test.rkt > > =====[ Overall Diff ]=================================================== > > collects/drracket/private/rep.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/drracket/private/rep.rkt > +++ NEW/collects/drracket/private/rep.rkt > @@ -281,13 +281,6 @@ TODO > (send drs-bindings-keymap map-function "c:x;0" "collapse") > (send drs-bindings-keymap map-function "c:x;2" "split") > > - (send drs-bindings-keymap map-function "esc;c:x" > "send-toplevel-form-to-repl") > - (send drs-bindings-keymap map-function "m:c:x" > "send-toplevel-form-to-repl") > - (send drs-bindings-keymap map-function "c:c;c:e" > "send-toplevel-form-to-repl") > - (send drs-bindings-keymap map-function "c:c;c:r" "send-selection-to-repl") > - (send drs-bindings-keymap map-function "c:c;m:e" > "send-toplevel-form-to-repl-and-go") > - (send drs-bindings-keymap map-function "c:c;m:r" > "send-selection-to-repl-and-go") > - > (send drs-bindings-keymap map-function "c:c;c:z" "move-to-interactions") > > (for ([i (in-range 1 10)]) > > collects/drracket/private/syncheck/gui.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/drracket/private/syncheck/gui.rkt > +++ NEW/collects/drracket/private/syncheck/gui.rkt > @@ -1640,180 +1640,177 @@ If the namespace does not, they are colored the > unbound color. > (inherit open-status-line close-status-line update-status-line > ensure-rep-hidden) > ;; syncheck:button-callback : (case-> (-> void) ((union #f syntax) -> > void) > ;; this is the only function that has any code running on the user's > thread > - (define/public syncheck:button-callback > - (case-lambda > - [() (syncheck:button-callback #f)] > - [(jump-to-id) (syncheck:button-callback jump-to-id > (preferences:get 'drracket:syncheck-mode))] > - [(jump-to-id mode) > - (when (send check-syntax-button is-enabled?) > - (open-status-line 'drracket:check-syntax:status) > - (update-status-line 'drracket:check-syntax:status status-init) > - (ensure-rep-hidden) > - (define definitions-text (get-definitions-text)) > - (define interactions-text (get-interactions-text)) > - (define drs-eventspace (current-eventspace)) > - (define the-tab (get-current-tab)) > - (define-values (old-break-thread old-custodian) (send the-tab > get-breakables)) > - > - ;; set by the init-proc > - (define expanded-expression void) > - (define expansion-completed void) > - (define user-custodian #f) > - > - (define normal-termination? #f) > - > - (define show-error-report/tab > - (λ () ; =drs= > - (send the-tab turn-on-error-report) > - (send (send the-tab get-error-report-text) > scroll-to-position 0) > - (when (eq? (get-current-tab) the-tab) > - (show-error-report)))) > - (define cleanup > - (λ () ; =drs= > - (send the-tab set-breakables old-break-thread > old-custodian) > - (send the-tab enable-evaluation) > - (set-syncheck-running-mode #f) > - (close-status-line 'drracket:check-syntax:status) > - > - ;; do this with some lag ... not great, but should be > okay. > - (let ([err-port (send (send the-tab > get-error-report-text) get-err-port)]) > - (thread > + (define/public (syncheck:button-callback [jump-to-id #f] > + [mode (preferences:get > 'drracket:syncheck-mode)]) > + (when (send check-syntax-button is-enabled?) > + (open-status-line 'drracket:check-syntax:status) > + (update-status-line 'drracket:check-syntax:status status-init) > + (ensure-rep-hidden) > + (define definitions-text (get-definitions-text)) > + (define interactions-text (get-interactions-text)) > + (define drs-eventspace (current-eventspace)) > + (define the-tab (get-current-tab)) > + (define-values (old-break-thread old-custodian) (send the-tab > get-breakables)) > + > + ;; set by the init-proc > + (define expanded-expression void) > + (define expansion-completed void) > + (define user-custodian #f) > + > + (define normal-termination? #f) > + > + (define show-error-report/tab > + (λ () ; =drs= > + (send the-tab turn-on-error-report) > + (send (send the-tab get-error-report-text) > scroll-to-position 0) > + (when (eq? (get-current-tab) the-tab) > + (show-error-report)))) > + (define cleanup > + (λ () ; =drs= > + (send the-tab set-breakables old-break-thread old-custodian) > + (send the-tab enable-evaluation) > + (set-syncheck-running-mode #f) > + (close-status-line 'drracket:check-syntax:status) > + > + ;; do this with some lag ... not great, but should be okay. > + (let ([err-port (send (send the-tab get-error-report-text) > get-err-port)]) > + (thread > + (λ () > + (flush-output err-port) > + (queue-callback > (λ () > - (flush-output err-port) > - (queue-callback > - (λ () > - (unless (= 0 (send (send the-tab > get-error-report-text) last-position)) > - (show-error-report/tab))))))))) > - (define kill-termination > - (λ () > - (unless normal-termination? > - (parameterize ([current-eventspace drs-eventspace]) > - (queue-callback > - (λ () > - (send the-tab syncheck:clear-highlighting) > - (cleanup) > - (custodian-shutdown-all user-custodian))))))) > - (define error-display-semaphore (make-semaphore 0)) > - (define uncaught-exception-raised > - (λ () ;; =user= > - (set! normal-termination? #t) > + (unless (= 0 (send (send the-tab > get-error-report-text) last-position)) > + (show-error-report/tab))))))))) > + (define kill-termination > + (λ () > + (unless normal-termination? > + (parameterize ([current-eventspace drs-eventspace]) > + (queue-callback > + (λ () > + (send the-tab syncheck:clear-highlighting) > + (cleanup) > + (custodian-shutdown-all user-custodian))))))) > + (define error-display-semaphore (make-semaphore 0)) > + (define uncaught-exception-raised > + (λ () ;; =user= > + (set! normal-termination? #t) > + (parameterize ([current-eventspace drs-eventspace]) > + (queue-callback > + (λ () ;; =drs= > + (yield error-display-semaphore) ;; let error display go > first > + (send the-tab syncheck:clear-highlighting) > + (cleanup) > + (custodian-shutdown-all user-custodian)))))) > + (define error-port (send (send the-tab get-error-report-text) > get-err-port)) > + (define output-port (send (send the-tab get-error-report-text) > get-out-port)) > + (define init-proc > + (λ () ; =user= > + (send the-tab set-breakables (current-thread) > (current-custodian)) > + (set-directory definitions-text) > + (current-error-port error-port) > + (current-output-port output-port) > + (error-display-handler > + (λ (msg exn) ;; =user= > (parameterize ([current-eventspace drs-eventspace]) > (queue-callback > - (λ () ;; =drs= > - (yield error-display-semaphore) ;; let error display > go first > - (send the-tab syncheck:clear-highlighting) > - (cleanup) > - (custodian-shutdown-all user-custodian)))))) > - (define error-port (send (send the-tab get-error-report-text) > get-err-port)) > - (define output-port (send (send the-tab > get-error-report-text) get-out-port)) > - (define init-proc > - (λ () ; =user= > - (send the-tab set-breakables (current-thread) > (current-custodian)) > - (set-directory definitions-text) > - (current-error-port error-port) > - (current-output-port output-port) > - (error-display-handler > - (λ (msg exn) ;; =user= > - (parameterize ([current-eventspace drs-eventspace]) > - (queue-callback > - (λ () ;; =drs= > - > - ;; this has to come first or else the positioning > - ;; computations in the highlight-errors/exn method > - ;; will be wrong by the size of the error report > box > - (show-error-report/tab) > - > - ;; a call like this one also happens in > - ;; drracket:debug:error-display-handler/stacktrace > - ;; but that call won't happen here, because > - ;; the rep is not in the current-rep parameter > - (send interactions-text highlight-errors/exn > exn)))) > - > - (drracket:debug:error-display-handler/stacktrace > - msg > - exn > - '() > - #:definitions-text definitions-text) > - > - (semaphore-post error-display-semaphore))) > + (λ () ;; =drs= > + > + ;; this has to come first or else the positioning > + ;; computations in the highlight-errors/exn method > + ;; will be wrong by the size of the error report box > + (show-error-report/tab) > + > + ;; a call like this one also happens in > + ;; drracket:debug:error-display-handler/stacktrace > + ;; but that call won't happen here, because > + ;; the rep is not in the current-rep parameter > + (send interactions-text highlight-errors/exn exn)))) > > - (error-print-source-location #f) ; need to build code to > render error first > - (uncaught-exception-handler > - (let ([oh (uncaught-exception-handler)]) > - (λ (exn) > - (uncaught-exception-raised) > - (oh exn)))) > - (update-status-line 'drracket:check-syntax:status > status-expanding-expression) > - (set!-values (expanded-expression expansion-completed) > - (make-traversal (current-namespace) > - (current-directory))) ;; set > by set-directory above > - (set! user-custodian (current-custodian)))) > - > - (set-syncheck-running-mode 'button) > - (send the-tab disable-evaluation) ;; this locks the editor, > so must be outside. > - (define definitions-text-copy > - (new (class text:basic% > - ;; overriding get-port-name like this ensures > - ;; that the resulting syntax objects are connected > - ;; to the actual definitions-text, not this copy > - (define/override (get-port-name) > - (send definitions-text get-port-name)) > - (super-new)))) > - (define settings (send definitions-text get-next-settings)) > - (define module-language? > - (is-a? > (drracket:language-configuration:language-settings-language settings) > - drracket:module-language:module-language<%>)) > - (send definitions-text-copy set-style-list (send > definitions-text get-style-list)) ;; speeds up the copy > - (send definitions-text copy-self-to definitions-text-copy) > - (with-lock/edit-sequence > - definitions-text-copy > - (λ () > - (send the-tab clear-annotations) > - (send the-tab reset-offer-kill) > - (send (send the-tab get-defs) syncheck:init-arrows) > - (drracket:eval:expand-program > - #:gui-modules? #f > - (drracket:language:make-text/pos definitions-text-copy 0 > (send definitions-text-copy last-position)) > - settings > - (not module-language?) > - init-proc > - kill-termination > - (λ (sexp loop) ; =user= > - (cond > - [(eof-object? sexp) > - (set! normal-termination? #t) > - (parameterize ([current-eventspace drs-eventspace]) > - (queue-callback > - (λ () ; =drs= > - (with-lock/edit-sequence > - definitions-text > - (λ () > - (parameterize ([current-annotations > definitions-text]) > - (expansion-completed)) > - (send (send (get-current-tab) get-defs) > set-syncheck-mode mode) > - (update-menu-status (get-current-tab)) > - (send definitions-text > syncheck:sort-bindings-table))) > - (cleanup) > - (custodian-shutdown-all user-custodian))))] > - [else > - (open-status-line 'drracket:check-syntax:status) > - (unless module-language? > - (update-status-line 'drracket:check-syntax:status > status-eval-compile-time) > - (eval-compile-time-part-of-top-level sexp)) > - (parameterize ([current-eventspace drs-eventspace]) > - (queue-callback > - (λ () ; =drs= > - (with-lock/edit-sequence > - definitions-text > - (λ () > - (open-status-line > 'drracket:check-syntax:status) > - (update-status-line > 'drracket:check-syntax:status status-coloring-program) > - (parameterize ([current-annotations > definitions-text]) > - (expanded-expression sexp (if jump-to-id > (make-visit-id jump-to-id) void))) > - (close-status-line > 'drracket:check-syntax:status)))))) > - (update-status-line 'drracket:check-syntax:status > status-expanding-expression) > - (close-status-line 'drracket:check-syntax:status) > - (loop)]))))))])) > + (drracket:debug:error-display-handler/stacktrace > + msg > + exn > + '() > + #:definitions-text definitions-text) > + > + (semaphore-post error-display-semaphore))) > + > + (error-print-source-location #f) ; need to build code to > render error first > + (uncaught-exception-handler > + (let ([oh (uncaught-exception-handler)]) > + (λ (exn) > + (uncaught-exception-raised) > + (oh exn)))) > + (update-status-line 'drracket:check-syntax:status > status-expanding-expression) > + (set!-values (expanded-expression expansion-completed) > + (make-traversal (current-namespace) > + (current-directory))) ;; set by > set-directory above > + (set! user-custodian (current-custodian)))) > + > + (set-syncheck-running-mode 'button) > + (send the-tab disable-evaluation) ;; this locks the editor, so > must be outside. > + (define definitions-text-copy > + (new (class text:basic% > + ;; overriding get-port-name like this ensures > + ;; that the resulting syntax objects are connected > + ;; to the actual definitions-text, not this copy > + (define/override (get-port-name) > + (send definitions-text get-port-name)) > + (super-new)))) > + (define settings (send definitions-text get-next-settings)) > + (define module-language? > + (is-a? > (drracket:language-configuration:language-settings-language settings) > + drracket:module-language:module-language<%>)) > + (send definitions-text-copy set-style-list (send > definitions-text get-style-list)) ;; speeds up the copy > + (send definitions-text copy-self-to definitions-text-copy) > + (with-lock/edit-sequence > + definitions-text-copy > + (λ () > + (send the-tab clear-annotations) > + (send the-tab reset-offer-kill) > + (send (send the-tab get-defs) syncheck:init-arrows) > + (drracket:eval:expand-program > + #:gui-modules? #f > + (drracket:language:make-text/pos definitions-text-copy 0 > (send definitions-text-copy last-position)) > + settings > + (not module-language?) > + init-proc > + kill-termination > + (λ (sexp loop) ; =user= > + (cond > + [(eof-object? sexp) > + (set! normal-termination? #t) > + (parameterize ([current-eventspace drs-eventspace]) > + (queue-callback > + (λ () ; =drs= > + (with-lock/edit-sequence > + definitions-text > + (λ () > + (parameterize ([current-annotations > definitions-text]) > + (expansion-completed)) > + (send (send (get-current-tab) get-defs) > set-syncheck-mode mode) > + (update-menu-status (get-current-tab)) > + (send definitions-text > syncheck:sort-bindings-table))) > + (cleanup) > + (custodian-shutdown-all user-custodian))))] > + [else > + (open-status-line 'drracket:check-syntax:status) > + (unless module-language? > + (update-status-line 'drracket:check-syntax:status > status-eval-compile-time) > + (eval-compile-time-part-of-top-level sexp)) > + (parameterize ([current-eventspace drs-eventspace]) > + (queue-callback > + (λ () ; =drs= > + (with-lock/edit-sequence > + definitions-text > + (λ () > + (open-status-line 'drracket:check-syntax:status) > + (update-status-line > 'drracket:check-syntax:status status-coloring-program) > + (parameterize ([current-annotations > definitions-text]) > + (expanded-expression sexp (if jump-to-id > (make-visit-id jump-to-id) void))) > + (close-status-line > 'drracket:check-syntax:status)))))) > + (update-status-line 'drracket:check-syntax:status > status-expanding-expression) > + (close-status-line 'drracket:check-syntax:status) > + (loop)]))))))) > > (define (make-visit-id jump-to-id) > (λ (vars) > > collects/drracket/private/syncheck/traversals.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/drracket/private/syncheck/traversals.rkt > +++ NEW/collects/drracket/private/syncheck/traversals.rkt > @@ -54,7 +54,8 @@ > [tl-module-lang-requires (make-hash)] > [expanded-expression > (λ (sexp [visit-id void]) > - (parameterize ([current-load-relative-directory > user-directory]) > + (parameterize ([current-directory (or user-directory > (current-directory))] > + [current-load-relative-directory > user-directory]) > (let ([is-module? (syntax-case sexp (module) > [(module . rest) #t] > [else #f])]) > @@ -107,7 +108,8 @@ > tl-phase-to-requires)]))))] > [expansion-completed > (λ () > - (parameterize ([current-load-relative-directory > user-directory]) > + (parameterize ([current-directory (or user-directory > (current-directory))] > + [current-load-relative-directory > user-directory]) > (annotate-variables user-namespace > user-directory > tl-phase-to-binders > > collects/drracket/private/unit.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/drracket/private/unit.rkt > +++ NEW/collects/drracket/private/unit.rkt > @@ -4013,48 +4013,9 @@ module browser threading seems wrong. > (send ed set-position (- (srcloc-position srcloc) 1)) > (send ed set-caret-owner #f 'global)) > > - > - (define/public (send-toplevel-form-to-repl shift-focus?) > - (define defs (get-definitions-text)) > - (when (= (send defs get-start-position) > - (send defs get-end-position)) > - (let loop ([pos (send defs get-start-position)]) > - (define next-up (send defs find-up-sexp pos)) > - (cond > - [next-up (loop next-up)] > - [else > - (send-range-to-repl pos > - (send defs get-forward-sexp pos) > - shift-focus?)])))) > - (define/public (send-selection-to-repl shift-focus?) > - (define defs (get-definitions-text)) > - (send-range-to-repl (send defs get-start-position) (send defs > get-end-position) shift-focus?)) > (define/public (move-to-interactions) > (ensure-rep-shown (get-interactions-text)) > (send (get-interactions-canvas) focus)) > - > - (define/private (send-range-to-repl start end shift-focus?) > - (unless (= start end) > - (define defs (get-definitions-text)) > - (define ints (get-interactions-text)) > - (send defs move/copy-to-edit ints start end (send ints > last-position) #:try-to-move? #f) > - > - > - ;; clear out the whitespace after the copied down thing > - (let loop () > - (define last-pos (- (send ints last-position) 1)) > - (when (last-pos . > . 0) > - (define last-char (send ints get-character last-pos)) > - (when (char-whitespace? last-char) > - (send ints delete last-pos (+ last-pos 1)) > - (loop)))) > - > - ;; insert a newline > - (send ints insert "\n" (send ints last-position) (send ints > last-position)) > - > - (ensure-rep-shown ints) > - (when shift-focus? (send (get-interactions-canvas) focus)) > - (send ints do-submission))) > > > ; > > collects/framework/test.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/framework/test.rkt > +++ NEW/collects/framework/test.rkt > @@ -950,16 +950,15 @@ > > If conflicting modifiers are provided, the ones later in the list are > used.}) > > - (proc-doc/names > + (proc-doc > test:menu-select > - (string? string? . -> . void?) > - (menu item) > - @{Selects the menu-item named @racket[item] in the menu named > @racket[menu]. > + (->i ([menu string?]) () #:rest [items (listof string?)] [res void?]) > + @{Selects the menu-item named by the @racket[item]s in the menu named > @racket[menu]. > > @italic{Note:} > The string for the menu item does not include its keyboard equivalent. > For example, to select ``New'' from the ``File'' menu, > - use ``New'', not ``New Ctrl+m n''.}) > + use ``New'', not ``New Ctrl+N''.}) > > (proc-doc/names > test:mouse-click > > collects/scribblings/drracket/common.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/scribblings/drracket/common.rkt > +++ NEW/collects/scribblings/drracket/common.rkt > @@ -1,12 +1,14 @@ > -#lang scheme/base > +#lang racket/base > > (require scribble/manual > - (for-label scheme)) > + (for-label racket > + racket/gui/base)) > > (provide HtDP > drlang > (all-from-out scribble/manual) > - (for-label (all-from-out scheme))) > + (for-label (all-from-out racket > + racket/gui/base))) > > (define HtDP > (italic "How to Design Programs")) > > collects/scribblings/drracket/incremental-keybindings.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- /dev/null > +++ NEW/collects/scribblings/drracket/incremental-keybindings.rkt > @@ -0,0 +1,61 @@ > +#lang s-exp framework/keybinding-lang > + > +(require drracket/tool-lib) > + > +(keybinding "c:c;c:e" (lambda (ed evt) (send-toplevel-form ed #f))) > +(keybinding "c:c;c:r" (lambda (ed evt) (send-selection ed #f))) > +(keybinding "c:c;m:e" (lambda (ed evt) (send-toplevel-form ed #t))) > +(keybinding "c:c;m:r" (lambda (ed evt) (send-selection ed #t))) > + > +(define/contract (send-toplevel-form defs shift-focus?) > + (-> any/c boolean? any) > + (when (is-a? defs drracket:unit:definitions-text<%>) > + (when (= (send defs get-start-position) > + (send defs get-end-position)) > + (let loop ([pos (send defs get-start-position)]) > + (define next-up (send defs find-up-sexp pos)) > + (cond > + [next-up (loop next-up)] > + [else > + (send-range-to-repl defs > + pos > + (send defs get-forward-sexp pos) > + shift-focus?)]))))) > + > +(define/contract (send-selection defs shift-focus?) > + (-> any/c boolean? any) > + (when (is-a? defs drracket:unit:definitions-text<%>) > + (send-range-to-repl defs > + (send defs get-start-position) > + (send defs get-end-position) > + shift-focus?))) > + > +(define/contract (send-range-to-repl defs start end shift-focus?) > + (-> (is-a?/c drracket:unit:definitions-text<%>) > + exact-positive-integer? > + exact-positive-integer? > + boolean? > + any) > + (unless (= start end) > + (define ints (send (send defs get-tab) get-ints)) > + (define frame (send (send defs get-tab) get-frame)) > + (send defs move/copy-to-edit > + ints start end > + (send ints last-position) > + #:try-to-move? #f) > + > + (let loop () > + (define last-pos (- (send ints last-position) 1)) > + (when (last-pos . > . 0) > + (define last-char (send ints get-character last-pos)) > + (when (char-whitespace? last-char) > + (send ints delete last-pos (+ last-pos 1)) > + (loop)))) > + (send ints insert > + "\n" > + (send ints last-position) > + (send ints last-position)) > + > + (send frame ensure-rep-shown ints) > + (when shift-focus? (send (send ints get-canvas) focus)) > + (send ints do-submission))) > > collects/scribblings/drracket/keybindings.scrbl > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- OLD/collects/scribblings/drracket/keybindings.scrbl > +++ NEW/collects/scribblings/drracket/keybindings.scrbl > @@ -1,7 +1,9 @@ > #lang scribble/doc > @(require "common.rkt" > - scribble/struct scribble/bnf racket/list mrlib/tex-table > - (for-label racket/gui/base)) > + scribble/struct scribble/bnf > + racket/list racket/runtime-path racket/port > + mrlib/tex-table > + (for-label drracket/tool-lib)) > > @(define (keybinding key . desc) > (let* ([keys (if (string? key) (list key) key)] > @@ -91,8 +93,6 @@ inspired by Emacs. > @keybinding["A-C-down"]{move down into an embedded editor} > > @keybinding["C-C C-Z"]{move the cursor to the interactions window} > -@keybinding["C-F6"]{move the cursor from the definitions > -window to the interactions window (or the search window, if it is open).} > ] > > @section{Editing Operations} > @@ -156,18 +156,6 @@ window to the interactions window (or the search window, > if it is open).} > > @itemize[ > @keybinding["F5"]{Run} > -@keybinding["M-C-x"]{Copy the top-level form surrounding the insertion point > to the interactions window > - and submit it for evaluation} > -@keybinding["C-c C-e"]{Copy the top-level form surrounding the insertion > point to the interactions window > - and submit it for evaluation} > -@keybinding["C-c M-e"]{Copy the top-level form surrounding the insertion > point to the interactions window, > - submit it for evaluation, and move the focus to the > interations window} > -@keybinding["C-c C-r"]{Copy the selection to the interactions window > - and submit it for evaluation} > -@keybinding["C-c C-r"]{Copy the selection to the interactions window > - and submit it for evaluation} > -@keybinding["C-c M-r"]{Copy the selection to the interactions window, > - submit it for evaluation, and move the focus to the > interactions window} > ] > > > @@ -244,3 +232,32 @@ s-exp framework/keybinding-lang > Note that DrRacket does not reload this file automatically when you > make a change, so you'll need to restart DrRacket to see changes to > the file. > + > +@section{Sending Program Fragments to the REPL} > + > +@index['("Emacs keybindings")]Users comfortable with Emacs and the > conventional Lisp/Scheme-style > +of interaction with an ``inferior process'' commonly request > +keybindings in DrRacket that send program fragments to be evaluated > +at the prompt. This style of interaction is fraught with difficulty, > +especially for beginners, and so DrRacket, by default, does not support > +it. Instead, clicking DrRacket's ``Run'' button starts with a clean slate > +and sends the entire contents of the definitions window, ensuring that > +the state in the REPL matches what you would expect by reading > +the source code of the program. > + > +That said, it is difficult for some people to switch to this new mode and, > +in some cases (for example when most of the interesting state is not > +in the program but in an external database or in the filesystem), using > +the contentional keystrokes may make sense. > + > +So, the remainder of this section is an example keybindings file that > +adds the ability to send expressions piecemeal to the interactions > +window. It also demonstrates how to pull together a bunch of pieces > +of DrRacket's implementation and its libraries to implement keystrokes. > + > +@(define-runtime-path incremental-keybindings.rkt > "incremental-keybindings.rkt") > +@(let ([sp (open-output-string)]) > + (call-with-input-file incremental-keybindings.rkt > + (λ (port) > + (copy-port port sp))) > + (codeblock (get-output-string sp))) > > collects/tests/drracket/incremental-keybindings-test.rkt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > --- /dev/null > +++ NEW/collects/tests/drracket/incremental-keybindings-test.rkt > @@ -0,0 +1,47 @@ > +#lang racket/base > +#| > + > +Adds the incremental-keybindings.rkt file (also shown in the docs) > +to DrRacket and then tries out the keystrokes. > + > +|# > + > +(require "private/drracket-test-util.rkt" > + framework/test > + racket/class) > + > +(fire-up-drscheme-and-run-tests > + (λ () > + (define drs-frame (wait-for-drscheme-frame)) > + (use-get/put-dialog > + (λ () > + (test:menu-select "Edit" "Keybindings" "Add User-defined > Keybindings...")) > + (collection-file-path "incremental-keybindings.rkt" > + "scribblings" > + "drracket")) > + (insert-in-definitions drs-frame "#lang racket/base\n") > + (do-execute drs-frame) > + > + (insert-in-definitions drs-frame "(+ 1 (+ 2 3))") > + (queue-callback/res > + (λ () > + (define defs (send drs-frame get-definitions-text)) > + (send defs set-position (+ (send defs paragraph-start-position 1) 5)))) > + (test:keystroke #\c '(control)) > + (test:keystroke #\e '(control)) > + (wait-for-computation drs-frame) > + (test:keystroke 'right '(alt shift)) > + (test:keystroke #\c '(control)) > + (test:keystroke #\r '(control)) > + (wait-for-computation drs-frame) > + (define got > + (queue-callback/res > + (λ () > + (define ints (send drs-frame get-interactions-text)) > + (send ints get-text > + (send ints paragraph-start-position 2) > + (send ints last-position))))) > + > + (unless (equal? got "> (+ 1 (+ 2 3))\n6\n> (+ 2 3)\n5\n> ") > + (error 'incrementalkeybindings-test.rkt "failed-test; got ~s" got)))) > + _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/dev