I'm Jeff-Relf.Me, in Seattle, early 2017, born in Seattle, 1960. 

For me, <Sergey Vlasov's Visual Commander, Professional Edition>
solves the "missing macros" problem.

It lets me assign up to 99 macros to keys/buttons[*];
without that, I simply could -not- use Visual Studio 2017.

[ *: Screenshot of my toolbars, Visual Studio Community 2017Snippets.TXT, My C# macros, to automate VS_2017>

  After making changes to my hand_crafted macros ( Snippets.TXT ),
  I copy it to the file that Visual Commander uses:
  %LOCALAPPDATA%\Sergey Vlasov\Visual Commander\1.0\Snippets.vCmd
  
  My "Open File" macros are in a "New Menu", on my toolbar.
  "File > Recent Files List" fills a similar "New Menu". ]

Also, Visual Commander comes with -essential- ( to me ) extensions
that hide "MainWindowTitleBar" and "PART_MenuBarFrameControlContainer"
( i.e. the "Sign in" button ).
 
To see my version, search for "Hide Menu bar and MainTitle bar"
in: <Snippets.TXT, My C# macros, to automate VS_2017>.

By the way, "Snippets" also has my "TaskBar Text" extension;
it changes what's displayed in the TaskBar: initially "-Ed-";
when debugging, it's either "-Ready-" or "-Stopped-".
//  //  //  //  //  //  //
  
By the way, Microsoft’s latest macro incarnation,
"https://visualstudiogallery.msdn.microsoft.com/d3fbf133-e51b-41a2-b86f-9560a96ff62b",
has several flaws:

#1, I need to assign more than 9 macros.

#2, It’s a poor rip-off of Visual Commander.

#3, I love having all my macros and extensions in <a single text file>.

#4, When assigning macros to toolbar buttons and key strokes,
    you should see the -name- of the macro, not its number.
//  //  //  //  //  //  //  

Visual Commander's macro editor uses the standard text/code editor,
with <the fonts/sizes you normally use>[*].

[ *: For me, C# macros ( .CS files ) open as "PlainText";
  see: "Open these file types in the PlainText editor" in Win10.REG(.TXT).

  <ScreenShot of my source code.>. 
  <My "console" (X.HTM)> colorizes the '0' glyph, <Screenshot>.  ]

Unlike VS_2010, the Macro editor is just another tab,
not a separate app; so editing macros is a joy.

For me, F7 starts/stops recording, F8 plays it.
The macro recorder has -many- faults; but macro 
editing/assignment matters more than keystroke recording.

For example, This toggles "Line Wrapping" On/Off:

  EnvDTE.Properties  jEd = DTE.get_Properties( "TextEditor", "C/C++" );
  EnvDTE.Property  WordWrap = jEd.Item("WordWrap");
  WordWrap.Value = !(bool)WordWrap.Value ;
  jEd.Item("VirtualSpace").Value = true ;

  For "PlainText", instead of "C/C++", use:

    EnvDTE.Properties  jEd 
      = DTE.get_Properties( "TextEditor", "PlainText" );

    EnvDTE.Property  WordWrap = jEd.Item("WordWrap");
    WordWrap.Value = !(bool)WordWrap.Value ;   
    jEd.Item("VirtualSpace").Value = true ;
    try { DTE.ExecuteCommand("Edit.StopOutlining"); } catch { }

FYI, This toggles "ShowHorizontalScrollBar" On/Off:

  EnvDTE.Property hScroll 
    = DTE.get_Properties( "TextEditor", "PlainText" )
      .Item("ShowHorizontalScrollBar");
     
  hScroll.Value = !(bool)hScroll.Value ;

EnvDTE80 bugs:

"DTE.Find.Execute()" changes your find_history/find_settings.
      
Solultion: use "DTE.Find.FindReplace()" instead.

  Put "Not Found" messages in the <StatusBar>:

     DTE.StatusBar.Text = @" Not a ■⏎⏎■⏎ file." ;

< DTE.ItemOperations.OpenFile("C:/__/X.TXT"); >
no longer works properly because the edit_tab
never gets updated when it's changed
by something outside the editor.

Solultion, use this instead:

< DTE.ExecuteCommand("File.OpenFile", "C:/__/X.TXT"); >

This (below) no longer works because, after a "File.SaveAll",
your edit window doesn't show ExternalCommand1's changes:

  DTE.ExecuteCommand("File.SaveAll");
  DTE.ExecuteCommand("Tools.ExternalCommand1");

Use this instead:

  DTE.ExecuteCommand("File.SaveAll");
  System.Threading.Thread.Sleep(2000);

  DTE.ExecuteCommand("Tools.ExternalCommand1");

Or just:

  DTE.ExecuteCommand("Tools.ExternalCommand1");
■