Skip to main content
4 of 6
added 1179 characters in body
b3m2a1
  • 47.1k
  • 3
  • 95
  • 245

What are all the possible menu edits?

So I've been playing with FrontEnd`AddMenuCommands recently and I wanted to figure out what all I could do with it.

There are a number of answers on this site to specific menu editing commands, but there is no general reference.

I've been able to figure out a bit from the source files, including making a useful reference graph of all the menus and submenus:

Menu graph

using the following code:

$MenuSetupTR = 
  FileNameJoin@{$InstallationDirectory, "SystemFiles", "FrontEnd", 
    "TextResources", "Macintosh", "MenuSetup.tr"};
$MenuStringsTR = 
  FileNameJoin@{$InstallationDirectory, "SystemFiles", "FrontEnd", 
    "TextResources", "MenuStrings.tr"};
$menuStructure = Import@$MenuSetupTR;
$menuStrings = Import@$MenuStringsTR;
$menuNames = 
  Cases[$menuStructure, (MenuItem[__, 
       name_String?(StringContainsQ["Dialog"])] | Menu[name_, ___]) :>
     name, ∞];
menuRules[Menu[name_, e_]] := Menu[name] -> menuRules@e;
menuRules[
   ignore : (_String | _MenuItem | Delimiter | _AlternateItems)] := 
  ignore;
SetAttributes[menuRules, Listable];
menuPart[menu_, name_] :=
  
  FirstCase[menu, Menu[name, _], None, ∞];
menuPart[menu_, name1_, names__] :=
  
  Fold[menuPart, menu, {name1, names}];
menuEdges[menu_] :=
  ReplaceAll[
   Cases[
     DeleteCases[menuRules@menu,
       Except[_Menu | _MenuItem | 
         Rule[_Menu, _] | _List | _String | _AlternateItems],
       ∞] //. {
       Rule[m_, expr : Except[_Rule]] :> Thread[m -> expr],
       Rule[m_Menu, Rule[subm_Menu, e_]] :> {m -> subm, subm -> e}
       },
     _Rule,
     ∞] // Flatten,
   Rule -> DirectedEdge];
menuGraph[menu_] :=
  With[{edges = menuEdges@menu},
   Graph[
    edges,
    VertexShape -> {
      Menu[n_] :> Graphics[Tooltip[{Hue[.1, .8, 1], Disk[]}, n]],
      m_MenuItem :> Graphics[Tooltip[{Hue[.6, .8, 1], Disk[]}, m]],
      e_AlternateItems :> 
       Graphics[Tooltip[{Hue[.4, .8, 1], Disk[]}, e]]
      }
    ]
   ];
menuGraph@$menuStructure

But I was hoping someone might know which of these menus are actually editable and what I can add to them. There are also the dialogs, which I tried to scrape and found a few of and if someone could advise me on the use of these that would be a huge help too.

If this is too open ended, I'll refine the question, but in the meantime hopefully someone familiar with menu editing can help me out.

------ Update ------

Playing around with this I was able to find a way to more or less edit all the menus, but we have to do it manually. It takes a bit of work to do so.

My idea was to use FrontEndExecute@ResetMenuPackets[{menu}] and build the menu manually.

I created a special $FrontEndMenu symbol which basically routes Set to that (plus some utility code and whatnot).

Then create Add, Insert, Drop, Take, etc. commands to manipulate a Menu expression.

The toplevel menu expression needs to look like Menu["Mathematica", {submenus}] as best I can tell (anything else I tried crashed the system).

Then just save the basic menu expression from the MenuSetup.tr file (import it in the System` context) and work with that.

Doing this I've been able to completely my menus however I like:

Menu rewrite

Two issues: I don't know if this will work outside of Mac and it prevents the use of the AddMenuComands token.

Hopefully there's also a simpler way to do this... if anyone has better ways though that'd be great, otherwise this'll do for customization I guess.

b3m2a1
  • 47.1k
  • 3
  • 95
  • 245