changed keybinding setup so that the user keybindings override all of the other keybindings (and improved the names a little)

svn: r12180
This commit is contained in:
Robby Findler 2008-10-30 19:10:49 +00:00
parent eada4a5b7e
commit ebb3efa6ba
7 changed files with 77 additions and 68 deletions

View File

@ -312,7 +312,7 @@ TODO
(define drs-bindings-keymap-mixin
(mixin (editor:keymap<%>) (editor:keymap<%>)
(define/override (get-keymaps)
(cons drs-bindings-keymap (super get-keymaps)))
(append (super get-keymaps) (list drs-bindings-keymap)))
(super-instantiate ())))
;; Max length of output queue (user's thread blocks if the
@ -849,7 +849,7 @@ TODO
(define/override get-keymaps
(λ ()
(cons scheme-interaction-mode-keymap (super get-keymaps))))
(append (super get-keymaps) (list scheme-interaction-mode-keymap))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;;

View File

@ -1,51 +1,60 @@
(module keybinding-lang mzscheme
(require mred
string-constants
framework
mzlib/class)
(provide (rename kl-module-begin #%module-begin)
(all-from-except mzscheme #%module-begin)
(all-from framework)
(all-from mred)
(all-from mzlib/class))
(define-syntax (kl-module-begin stx)
(syntax-case stx ()
[(mb a ...)
(with-syntax ([#%keymap (datum->syntax-object (syntax mb) '#%keymap)]
[#%keybinding (datum->syntax-object (syntax mb) '#%keybinding)]
[keybinding (datum->syntax-object (syntax mb) 'keybinding)])
(syntax (#%plain-module-begin
(define #%keymap (make-object keymap:aug-keymap%))
(provide #%keymap)
(define counter 0)
(define (#%keybinding key proc src line col pos)
(unless (string? key)
(error 'keybinding "expected string as first argument, got ~e (other arg ~e)" key proc))
(unless (and (procedure? proc)
(procedure-arity-includes? proc 2))
(error 'keybinding "expected procedure of two arguments as second argument, got ~e (other arg ~e)"
proc
key))
(set! counter (+ counter 1))
(let ([name
(cond
[(symbol? (object-name proc))
(format "~a:~a" (object-name proc) counter)]
[(and line col)
(format "~a:~a.~a:~a" src line col counter)]
[else
(format "~a:~a:~a" src pos counter)])])
(send #%keymap add-function name
(λ (x y)
(let ([end-edit-sequence
(λ ()
(when (is-a? x editor<%>)
(let loop ()
(when (send x in-edit-sequence?)
(send x end-edit-sequence)
(loop)))))])
#lang scheme
(require mred
string-constants
framework
scheme/class)
(provide (rename-out (kl-module-begin #%module-begin))
(except-out (all-from-out scheme) #%module-begin)
(all-from-out framework
mred
scheme/class))
(define-syntax (kl-module-begin stx)
(syntax-case stx ()
[(mb a ...)
(with-syntax ([#%keymap (datum->syntax (syntax mb) '#%keymap)]
[#%keybinding (datum->syntax (syntax mb) '#%keybinding)]
[keybinding (datum->syntax (syntax mb) 'keybinding)])
(syntax (#%plain-module-begin
(define #%keymap (make-object keymap:aug-keymap%))
(provide #%keymap)
(define name-counter (make-hash))
(define (unique-name raw-name)
(let ([last-number (hash-ref name-counter raw-name #f)])
(cond
[last-number
(hash-set! name-counter raw-name (+ last-number 1))
(format "~a:~a" raw-name last-number)]
[else
(hash-set! name-counter raw-name 2)
raw-name])))
(define (#%keybinding key proc src line col pos)
(unless (string? key)
(error 'keybinding "expected string as first argument, got ~e (other arg ~e)" key proc))
(unless (and (procedure? proc)
(procedure-arity-includes? proc 2))
(error 'keybinding "expected procedure of two arguments as second argument, got ~e (other arg ~e)"
proc
key))
(let ([name
(unique-name
(cond
[(symbol? (object-name proc))
(format "~a" (object-name proc))]
[(and line col)
(format "~a:~a.~a" src line col)]
[else
(format "~a:~a" src pos)]))])
(send #%keymap add-function name
(λ (x y)
(let ([end-edit-sequence
(λ ()
(when (is-a? x editor<%>)
(let loop ()
(when (send x in-edit-sequence?)
(send x end-edit-sequence)
(loop)))))])
(with-handlers ([exn:fail?
(λ (x)
(end-edit-sequence)
@ -59,15 +68,15 @@
(end-edit-sequence)
(message-box (string-constant drscheme)
(format (string-constant user-defined-keybinding-error)
name
"Editor left in edit-sequence"))))))))
(send #%keymap map-function key name)))
(define-syntax (keybinding stx)
(syntax-case stx ()
[(_ key val)
(with-syntax ([src (syntax-source stx)]
[line (syntax-line stx)]
[col (syntax-column stx)]
[pos (syntax-position stx)])
(syntax (#%keybinding key val 'src 'line 'col 'pos)))]))
a ...)))])))
name
"Editor left in edit-sequence"))))))))
(send #%keymap map-function key name)))
(define-syntax (keybinding stx)
(syntax-case stx ()
[(_ key val)
(with-syntax ([src (syntax-source stx)]
[line (syntax-line stx)]
[col (syntax-column stx)]
[pos (syntax-position stx)])
(syntax (#%keybinding key val 'src 'line 'col 'pos)))]))
a ...)))]))

View File

@ -505,7 +505,7 @@
(define/public (get-can-close-parent) #f)
(define/override (get-keymaps)
(cons (keymap:get-file) (super get-keymaps)))
(append (super get-keymaps) (list (keymap:get-file))))
(super-new)))
(define backup-autosave<%>

View File

@ -1691,7 +1691,7 @@
(loop (send snip next)))]
[else (cons snip (loop (send snip next)))]))))
(define/override (get-keymaps)
(cons search/replace-keymap (super get-keymaps)))
(append (super get-keymaps) (list search/replace-keymap)))
(super-new)
(inherit set-styles-fixed)
(set-styles-fixed #t)
@ -1889,7 +1889,7 @@
(inherit set-styles-fixed)
(super-new [pref-sym 'framework:replace-string])
(define/override (get-keymaps)
(cons search/replace-keymap (super get-keymaps)))
(append (super get-keymaps) (list search/replace-keymap)))
(set-styles-fixed #t)))
(define search/replace-keymap (new keymap%))

View File

@ -1430,7 +1430,7 @@
(define global (make-object aug-keymap%))
(define global-main (make-object aug-keymap%))
(send global chain-to-keymap global-main #t)
(send global chain-to-keymap global-main #f)
(setup-global global-main)
(generic-setup global-main)
(define (get-global) global)

View File

@ -1151,7 +1151,7 @@
(define/override (on-enable-surrogate text)
(send text begin-edit-sequence)
(super on-enable-surrogate text)
(send (send text get-keymap) chain-to-keymap keymap #t)
(send (send text get-keymap) chain-to-keymap keymap #f)
;; I don't know about these editor flag settings.
;; maybe they belong in drscheme?

View File

@ -852,7 +852,7 @@ WARNING: printf is rebound in the body of the unit to always
find-string)
(define/override (get-keymaps)
(cons (keymap:get-search) (super get-keymaps)))
(append (super get-keymaps) (list (keymap:get-search))))
(define searching-str #f)
(define case-sensitive? #f)