From 46d97f0926cfe118bc59f63485c6b615ca33e4d3 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 27 Dec 2014 15:23:46 -0500 Subject: [PATCH] Better explicit control over utf-8 input mode --- ansi/lcd-terminal.rkt | 6 +++--- ansi/test-raw.rkt | 8 +++++++- rmacs/display.rkt | 12 ++++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ansi/lcd-terminal.rkt b/ansi/lcd-terminal.rkt index ef573d9..443a5ef 100644 --- a/ansi/lcd-terminal.rkt +++ b/ansi/lcd-terminal.rkt @@ -145,7 +145,7 @@ [(<= #x20 b #x7e) (simple-key (integer->char b))] [(= b #x7f) (simple-key 'backspace)])) -(define (lex-lcd-input port) +(define (lex-lcd-input port #:utf-8? [utf-8? (lcd-terminal-utf-8?)]) (cond [(eof-object? (peek-byte port)) eof] [(or (regexp-try-match #px"^\e\\[([0-9]+(;[0-9]+)*)?(.)" port) @@ -168,8 +168,8 @@ ;; Characters between #\u80 and #\uff are ambiguous because in ;; some terminals, the high bit is set to indicate meta, and in ;; others, they are plain UTF-8 characters. We let the user - ;; distinguish via the lcd-terminal-utf-8? parameter. - [(not (lcd-terminal-utf-8?)) + ;; distinguish via the #:utf-8? keyword argument. + [(not utf-8?) (define b (read-byte port)) (if (< b 128) (interpret-ascii-code b) diff --git a/ansi/test-raw.rkt b/ansi/test-raw.rkt index b629dbb..e92c4e6 100644 --- a/ansi/test-raw.rkt +++ b/ansi/test-raw.rkt @@ -9,6 +9,12 @@ (define (main) (tty-raw!) + (define utf-8? + (match (current-command-line-arguments) + [(or '#() '#("--utf-8")) #t] + ['#("--no-utf-8") #f] + [_ (error 'main "Usage: test-raw [ --utf-8 / --no-utf-8 ]")])) + (plumber-add-flush! (current-plumber) (lambda (handle) (display (reset-mode x11-any-event-mouse-tracking-mode)))) @@ -19,7 +25,7 @@ (display "Type keys. Press control-D to exit.\r\n") (let loop () (flush-output) - (match (lex-lcd-input (current-input-port)) + (match (lex-lcd-input (current-input-port) #:utf-8? utf-8?) [(? eof-object?) (void)] [(== (key #\D (set 'control))) (void)] [key diff --git a/rmacs/display.rkt b/rmacs/display.rkt index e56aefa..8e04930 100644 --- a/rmacs/display.rkt +++ b/rmacs/display.rkt @@ -58,6 +58,7 @@ key-reader ;; InputPort -> Key [displayed-screen #:mutable] ;; Screen [pending-screen #:mutable] ;; Screen + [utf-8-input? #:mutable] ;; Boolean ) #:prefab) (define (make-screen rows columns pen) @@ -80,7 +81,14 @@ (current-output-port) ansi:lex-lcd-input (make-screen 24 80 tty-default-pen) - (make-screen 24 80 tty-default-pen))) + (make-screen 24 80 tty-default-pen) + (match (getenv "RMACS_UTF8_INPUT") + [(or #f "yes" "true" "1") #t] + [(or "no" "false" "0") #f] + [v (error 'RMACS_UTF8_INPUT + "Environment variable RMACS_UTF8_INPUT value ~v invalid: must be in ~v" + v + (list "yes" "true" "1" "no" "false" "0"))]))) (reset *stdin-tty*) (plumber-add-flush! (current-plumber) (lambda (h) @@ -360,7 +368,7 @@ ;; Input (define (tty-next-key tty) - (define k (ansi:lex-lcd-input (tty-input tty))) + (define k (ansi:lex-lcd-input (tty-input tty) #:utf-8? (tty-utf-8-input? tty))) (if (equal? k (ansi:key #\[ (set 'control))) ;; ESC (or (sync/timeout 0.5 (handle-evt (tty-next-key-evt tty)