24
$\begingroup$

Many users have asked how to add KeyEvents to speed/improve keyboard input. This is just a random example. The technique is always the same. It requires that you manually modify KeyEventTranslations.tr (an important system file).

It always struck me as a bit odd that even power users propose to manually do this. Surely this system file is loaded into Mathematica at the start of a session (or not?), so it is perhaps possible to programmatically add the necessary KeyEvents to an already running Mathematica session. Of course in this case the new key bindings will only be temporary, but this might even be preferable in some cases.

So the question is: is it possible to programmatically add the necessary KeyEvents to an already running Mathematica session, without changing the KeyEventTranslations.tr? Alternatively: can we program Mathematica to backup KeyEventTranslations.tr and programmatically modify it? I know this is possible, I just wonder if someone has done it.

And perhaps automatically reload the new version so that it takes effect right away?


The art of Quitting.

I take the occasion to post another item related to "saving keystrokes for your retirement": It recently came to my attention that many/most users when they want to quit the kernel, type Quit[].

Well...the good news are that you just need to type Quit (saving two keystrokes).

$\endgroup$
16
$\begingroup$

This will add Quit to Control+Q (and Alt+V Q Q):

FrontEndExecute[
 FrontEnd`AddMenuCommands["MenuListQuitEvaluators",
  {MenuItem["AddMenu &Quit",
    FrontEnd`KernelExecute[ToExpression["Quit[]"]],
    MenuKey["q", Modifiers -> {"Control"}],
    System`MenuEvaluator -> Automatic]}]]

It only persists for the front end session.

Usually I keep the following in my KeyEventTranslations.tr file:

Item[KeyEvent["q", Modifiers -> {Control}],
    FrontEndExecute[
        FrontEnd`FrontEndToken[SelectedNotebook[], "EvaluatorQuit", Automatic]
    ]],
$\endgroup$
  • $\begingroup$ @IstvánZachar it works the same even if you do not put the AddMenu string. I took it off $\endgroup$ – magma May 30 '12 at 15:04
  • $\begingroup$ I like the FrontEndExecute argument. TOTALLY undocumented, lol. Can the same thing be done with the KeyEventTranslations ? Perhaps with some equally undocumented AddKeyEvent command? $\endgroup$ – magma May 30 '12 at 15:10
  • $\begingroup$ @ magma - setting key events is documented. See the help on NotebookEventActions. $\endgroup$ – Chris Degnen May 30 '12 at 16:45
  • 5
    $\begingroup$ There is no way to add/overload KeyEventTranslations programmatically, but as we're seeing here, there are other ways to achieve similar effects. $\endgroup$ – John Fultz Jun 1 '12 at 8:42
  • $\begingroup$ @magma are you referring to either the "AddMenu &Quit" or "MenuListQuitEvaluators" string because I am not experiencing what described currently? $\endgroup$ – William Jul 7 '13 at 4:34
4
$\begingroup$

Here is a way that avoids the sometimes buggy FrontEnd`AddMenuCommands and gives us better flexibility. It's based on what I did here and here to do effectively arbitrary menu edits and placed on GitHub here.

The basic idea is to make an entirely new menu for our menu bindings. I'll do this like so:

Get["https://raw.githubusercontent.com/b3m2a1/mathematica-tools/master/CustomKeyEvents.wl"];
AddKeyEvent["r", FontColor -> Red, "Modifiers" -> {"Option"}];
AddKeyEvent["r", FontColor -> Inherited, "Modifiers" -> {"Command", "Option"}];

And then if we look at our new menus:

enter image description here

Our events are bound and ready for use:

enter image description here

enter image description here

The code itself is actually pretty small, but the basic idea is just to edit the Menu expression that Mathematica is using and set a new one using FrontEnd`ResetMenusPacket

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.