Skip to content

Commit 18386a9

Browse files
committed
fix an annoying interaction in the way drracket initializes the REPL
Specifically, when the file being opened starts with #lang (and "The Racket Language" is selected), use the language that's listed in the file to initialize the REPL instead of the language of the last-edited
1 parent 903af51 commit 18386a9

File tree

1 file changed

+70
-1
lines changed

1 file changed

+70
-1
lines changed

drracket/drracket/private/rep.rkt

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1843,7 +1843,9 @@ TODO
18431843
(define name (send definitions-text get-port-name))
18441844
(define settings
18451845
(drracket:language-configuration:language-settings-settings user-language-settings))
1846-
(define prog-port (open-input-string (send lang get-auto-text settings) name))
1846+
(define hash-lang-str (or (fetch-hash-lang-str definitions-text)
1847+
(send lang get-auto-text settings)))
1848+
(define prog-port (open-input-string hash-lang-str name))
18471849
(port-count-lines! prog-port)
18481850
(parameterize ([module-language-initial-run #t])
18491851
(evaluate-from-port
@@ -2416,3 +2418,70 @@ TODO
24162418
(make-object string-snip% "c"))])
24172419
(check-equal? (simplify-history-element in #t)
24182420
(old-conversion-code in))))
2421+
2422+
(define (fetch-hash-lang-str text)
2423+
(define special-tp (open-input-text-editor text))
2424+
(define (special-filter f bytes)
2425+
;; @ is not accepted anywhere in the regexp below
2426+
(bytes-set! bytes 0 (char->integer #\@))
2427+
1)
2428+
(define tp (special-filter-input-port special-tp special-filter))
2429+
(port-count-lines! tp)
2430+
(skip-past-comments tp)
2431+
(define-values (_1 _2 pos-before) (port-next-location tp))
2432+
(cond
2433+
[(regexp-match? #rx"^#lang [a-zA-Z0-9+_/-]+" tp)
2434+
(define c (peek-char tp))
2435+
(cond
2436+
[(eof-object? c)
2437+
(define-values (line col pos-after) (port-next-location tp))
2438+
(send text get-text (- pos-before 1) pos-after)]
2439+
[(char-whitespace? c)
2440+
(define-values (line col pos-after) (port-next-location tp))
2441+
(send text get-text (- pos-before 1) (- pos-after 1))]
2442+
[else #f])]
2443+
[else #f]))
2444+
2445+
(module+ test
2446+
(check-equal? (let ([t (new text%)])
2447+
(send t insert "blah")
2448+
(fetch-hash-lang-str t))
2449+
#f)
2450+
(check-equal? (let ([t (new text%)])
2451+
(send t insert "#lang racket")
2452+
(fetch-hash-lang-str t))
2453+
"#lang racket")
2454+
(check-equal? (let ([t (new text%)])
2455+
(send t insert " #lang racket")
2456+
(fetch-hash-lang-str t))
2457+
"#lang racket")
2458+
(check-equal? (let ([t (new text%)])
2459+
(send t insert "#lang racket ")
2460+
(fetch-hash-lang-str t))
2461+
"#lang racket")
2462+
(check-equal? (let ([t (new text%)])
2463+
(send t insert "#lang racket\n")
2464+
(fetch-hash-lang-str t))
2465+
"#lang racket")
2466+
(check-equal? (let ([t (new text%)])
2467+
(send t insert "#lang racket fjd ej ej")
2468+
(fetch-hash-lang-str t))
2469+
"#lang racket")
2470+
(check-equal? (let ([t (new text%)])
2471+
(send t insert ";; a\n#lang racket fjd ej ej")
2472+
(fetch-hash-lang-str t))
2473+
"#lang racket")
2474+
(check-equal? (let ([t (new text%)])
2475+
(send t insert ";; a")
2476+
(define es (new editor-snip%))
2477+
(send t insert es)
2478+
(send t insert "\n#lang racket")
2479+
(fetch-hash-lang-str t))
2480+
"#lang racket")
2481+
(check-equal? (let ([t (new text%)])
2482+
(send t insert "#lang rac")
2483+
(define es (new editor-snip%))
2484+
(send t insert es)
2485+
(send t insert "ket\n")
2486+
(fetch-hash-lang-str t))
2487+
#f))

0 commit comments

Comments
 (0)