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](http://mathematica.stackexchange.com/a/915/38205) [of](http://mathematica.stackexchange.com/a/1607/38205) [answers](https://mathematica.stackexchange.com/questions/5417/running-a-package-automatically-when-its-saved/5418#5418) 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][1]][1]

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](http://mathematica.stackexchange.com/a/915/38205), 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][2]][2]

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.


  [1]: https://i.sstatic.net/XpO8B.png
  [2]: https://i.sstatic.net/cvyAK.png