diff --git a/collects/drscheme/private/frame.ss b/collects/drscheme/private/frame.ss index 8c13338063..a3e4f3615b 100644 --- a/collects/drscheme/private/frame.ss +++ b/collects/drscheme/private/frame.ss @@ -49,12 +49,36 @@ [(#\;) "semicolon"] [(#\:) "colon"] [(#\space) "space"] - [else - (string short-cut)]))))]) + [else (string short-cut)]))))]) (hash-table-put! name-ht keyname (send item get-plain-label)))))) (when (is-a? item menu-item-container<%>) (loop item))) (send menu-container get-items))) + (when (eq? (system-type) 'windows) + (for-each (λ (top-level-menu) + (when (is-a? top-level-menu menu%) + (let ([amp-key + (let loop ([str (send top-level-menu get-label)]) + (cond + [(regexp-match #rx"[^&]*[&](.)(.*)" str) + => + (λ (m) + (let ([this-amp (list-ref m 1)] + [rest (list-ref m 2)]) + (cond + [(equal? this-amp "&") + (loop rest)] + [else + (string-downcase this-amp)])))] + [else #f]))]) + (when amp-key + (hash-table-put! name-ht + (format "m:~a" amp-key) + (format "~a menu" (send top-level-menu get-plain-label))) + (hash-table-put! name-ht + (format "m:s:~a" amp-key) + (format "~a menu" (send top-level-menu get-plain-label))))))) + (send (get-menu-bar) get-items))) name-ht)) (define/private (menu-item->prefix-string item) @@ -87,24 +111,23 @@ (let ([keymap (send edit-object get-keymap)]) (is-a? keymap keymap:aug-keymap<%>)))))] - [define/private show-keybindings - (λ () - (if (can-show-keybindings?) - (let ([edit-object (get-edit-target-object)]) - (let ([keymap (send edit-object get-keymap)]) - (let* ([menu-names (get-menu-bindings)] - [table (send keymap get-map-function-table)] - [bindings (hash-table-map table list)] - [w/menus - (append (hash-table-map menu-names list) - (filter (λ (binding) (not (bound-by-menu? binding menu-names))) - bindings))] - [structured-list - (mzlib:list:sort - w/menus - (λ (x y) (string-ci<=? (cadr x) (cadr y))))]) - (show-keybindings-to-user structured-list this)))) - (bell)))] + [define/private (show-keybindings) + (if (can-show-keybindings?) + (let* ([edit-object (get-edit-target-object)] + [keymap (send edit-object get-keymap)] + [menu-names (get-menu-bindings)] + [table (send keymap get-map-function-table)] + [bindings (hash-table-map table list)] + [w/menus + (append (hash-table-map menu-names list) + (filter (λ (binding) (not (bound-by-menu? binding menu-names))) + bindings))] + [structured-list + (mzlib:list:sort + w/menus + (λ (x y) (string-ci<=? (cadr x) (cadr y))))]) + (show-keybindings-to-user structured-list this)) + (bell))] (define/private (bound-by-menu? binding menu-table) (ormap (λ (constituent) diff --git a/collects/framework/private/keymap.ss b/collects/framework/private/keymap.ss index 3e8ec6b908..a2763aff26 100644 --- a/collects/framework/private/keymap.ss +++ b/collects/framework/private/keymap.ss @@ -128,15 +128,9 @@ function-table (λ (keyname fname) (unless (hash-table-get table keyname (λ () #f)) - (cond - [(and (eq? (system-type) 'windows) - (let ([cs (canonicalize-keybinding-string (format "~a" keyname))]) - (or (regexp-match #rx"a:c" cs) - (regexp-match #rx"c:m" cs)))) - (void) ;; don't show these keybindigns -- they don't work - ] - [else - (hash-table-put! table keyname fname)])))) + (let ([cs (canonicalize-keybinding-string (format "~a" keyname))]) + (when (on-this-platform? cs) + (hash-table-put! table keyname fname)))))) (for-each (λ (chained-keymap) (when (is-a? chained-keymap aug-keymap<%>) @@ -144,6 +138,38 @@ chained-keymaps) table) + (define/private (on-this-platform? cs) + (let* ([splits (map (λ (x) (all-but-last (split-out #\: x))) (split-out #\; (string->list cs)))] + [has-key? (λ (k) (ormap (λ (x) (member (list k) x)) splits))]) + (cond + [(eq? (system-type) 'windows) + (cond + [(or (regexp-match #rx"a:c" cs) + (regexp-match #rx"c:m" cs)) + #f] + [(or (has-key? #\a) (has-key? #\d)) + #f] + [else #t])] + [(eq? (system-type) 'macosx) + (cond + [(has-key? #\m) + #f] + [else #t])] + [(eq? (system-type) 'unix) + (cond + [(or (has-key? #\a) (has-key? #\d)) + #f] + [else #t])] + [else + ;; just in case new platforms come along .... + #t]))) + + (define/private (all-but-last l) + (cond + [(null? l) l] + [(null? (cdr l)) l] + [else (cons (car l) (all-but-last (cdr l)))])) + (super-new))) (define aug-keymap% (aug-keymap-mixin keymap%)) @@ -1023,6 +1049,10 @@ (if shift? "s:" "") roman-char) (format "insert ~a" greek-char)) + (map (format "m:x;c:g;~a~a" + (if shift? "s:" "") + roman-char) + (format "insert ~a" greek-char)) (map (format "c:x;c:g;~a~a" (if shift? "s:" "") roman-char)