[racket] Custom Key Bindings - Post Your File

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Fri May 11 15:22:27 EDT 2012

[How] does Xcode allow you to enter arbitrary computations in response to key events? I don't understand how one can list "all possible actions" since there are infinitely many? -- Matthias



On May 11, 2012, at 2:58 PM, Nick Shelley wrote:

> On the topic of key bindings, is there a reason this can't be done in the preferences menu? Xcode has a key bindings section in the preferences menu that has all possible actions on the left and the current bindings on the right, and you can just click on the current binding and change it to whatever you want. I think something like that would be nice in DrRacket, but I have no idea how hard it would be to implement.
> 
> Maybe that's on the list of "It would be nice, but..."
> 
> On Fri, May 11, 2012 at 6:14 AM, Robby Findler <robby at eecs.northwestern.edu> wrote:
> Ah, good point. I've added some example code to the docs that shows
> how to bind menu items. Here's the code.
> 
> Robby
> 
> #lang s-exp framework/keybinding-lang
> 
> (define (menu-bind key menu-item)
>  (keybinding
>   key
>   (λ (ed evt)
>     (define canvas (send ed get-canvas))
>     (when canvas
>       (define menu-bar (find-menu-bar canvas))
>       (when menu-bar
>         (define item (find-item menu-bar menu-item))
>         (when item
>           (define evt
>             (new control-event%
>                  [event-type 'menu]
>                  [time-stamp
>                   (send evt get-time-stamp)]))
>           (send item command evt)))))))
> 
> (define/contract (find-menu-bar c)
>  (-> (is-a?/c area<%>) (or/c #f (is-a?/c menu-bar%)))
>  (let loop ([c c])
>    (cond
>      [(is-a? c frame%) (send c get-menu-bar)]
>      [(is-a? c area<%>) (loop (send c get-parent))]
>      [else #f])))
> 
> (define/contract (find-item menu-bar label)
>  (-> (is-a?/c menu-bar%)
>      string?
>      (or/c (is-a?/c selectable-menu-item<%>) #f))
>  (let loop ([o menu-bar])
>    (cond
>      [(is-a? o selectable-menu-item<%>)
>       (and (equal? (send o get-plain-label) label)
>            o)]
>      [(is-a? o menu-item-container<%>)
>       (for/or ([i (in-list (send o get-items))])
>         (loop i))]
>      [else #f])))
> 
> (menu-bind "c:a" "Run")
> 
> 
> On Thu, May 10, 2012 at 8:22 PM, Ray Racine <ray.racine at gmail.com> wrote:
> > I'm caught in a bit of Catch-22.   From the doc.
> >
> > If you are most familiar with Emacs-style key bindings (especially on
> > windows or some linux installations where the control key is, by default,
> > for the menu shortcuts), you should uncheck the Enable keybindings in
> > menus preference. Many of the keybindings below are inspired by Emacs.
> >
> > So I've disabled keybindings in menu and thereby lose crtl-r Run and crtl-i
> > Reindent.  I'd like to re-bind but I've as of yet been unable to locate what
> > functions Run and Reindent correspond to.
> >
> > I totally missed the online check syntax option, which sounds like a very
> > good thing.  In fact I'm still totally missing it. :)  I just rechecked the
> > menus/preferences.  Where is this mythic option found?
> >
> > Thanks
> >
> >
> > On Thu, May 10, 2012 at 8:49 PM, Robby Findler <robby at eecs.northwestern.edu>
> > wrote:
> >>
> >> FWIW, run and reindent are already menu-key based shortcuts (r and i
> >> respectively) so they should be available already (unless you're on
> >> windows and you've disabled menu keyboard shortcuts). For reindent you
> >> can hit tab, and DrRacket re-indents the line you're on or the
> >> selection (if it is more than one line). For check syntax, I recommend
> >> you enable online check syntax and then you don't have to hit any key
> >> at all to get that to work.
> >>
> >> hth,
> >> Robby
> >>
> >> On Thu, May 10, 2012 at 6:38 PM, Ray Racine <ray.racine at gmail.com> wrote:
> >> > I'm attempting this weekend to make the leap from my beloved Emacs and
> >> > Geiser to DrRacket.    Was wondering if anyone has a cool set of custom
> >> > keybindings they'd like to share.
> >> >
> >> > Some I'd like to get my hands on are:
> >> > 1. binding for reindent / reindent all.
> >> > 2. binding for Check Syntax button equivalent.
> >> > 3. binding for Run button equivalent.
> >> >
> >> > Three below I just pieced together.
> >> >
> >> > ;; insert λ
> >> > (keybinding "c:\\" (λ (editor evt) (send editor insert "λ")))
> >> >
> >> > ;; close
> >> > (keybinding "c:q" (λ (editor evt)
> >> >                     (send (send editor get-top-level-window)
> >> > close-current-tab)))
> >> >
> >> > ;; open a new tab
> >> > (keybinding "c:t" (λ (editor evt) (send (send editor
> >> > get-top-level-window)
> >> > create-new-tab))
> >> >
> >> > ____________________
> >> >  Racket Users list:
> >> >  http://lists.racket-lang.org/users
> >> >
> >
> >
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users



Posted on the users mailing list.