Last active
November 13, 2021 01:42
-
-
Save pervognsen/b6c1bbe16709e55139f01d71eeb0fc5d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is "restart to cursor", a complement to VS's "run to cursor" which will first restart (and recompile if you have | |
// it set up like that) the currently running program (if any) and then execute the "run to cursor" command. | |
// To make an extension on your own, create a C# VSIX template, then Add Item -> Extensibility -> Command and replace the | |
// file with the contents of this Gist. I bind it to Ctrl-Shift-F10 since Ctrl-F10 is "run to cursor". | |
using EnvDTE80; | |
using EnvDTE; | |
using Microsoft.VisualStudio.Shell; | |
using Microsoft.VisualStudio.Shell.Interop; | |
using System; | |
using System.ComponentModel.Design; | |
using System.Globalization; | |
using System.Threading; | |
using System.Threading.Tasks; | |
using Task = System.Threading.Tasks.Task; | |
namespace RestartToCursor | |
{ | |
/// <summary> | |
/// Command handler | |
/// </summary> | |
internal sealed class RestartToCursorCommand | |
{ | |
/// <summary> | |
/// Command ID. | |
/// </summary> | |
public const int CommandId = 0x0100; | |
/// <summary> | |
/// Command menu group (command set GUID). | |
/// </summary> | |
public static readonly Guid CommandSet = new Guid("a113ac75-d635-475d-bc7c-e84760a644d3"); | |
/// <summary> | |
/// VS Package that provides this command, not null. | |
/// </summary> | |
private readonly AsyncPackage package; | |
/// <summary> | |
/// Initializes a new instance of the <see cref="RestartToCursorCommand"/> class. | |
/// Adds our command handlers for menu (commands must exist in the command table file) | |
/// </summary> | |
/// <param name="package">Owner package, not null.</param> | |
/// <param name="commandService">Command service to add command to, not null.</param> | |
private RestartToCursorCommand(AsyncPackage package, OleMenuCommandService commandService) | |
{ | |
this.package = package ?? throw new ArgumentNullException(nameof(package)); | |
commandService = commandService ?? throw new ArgumentNullException(nameof(commandService)); | |
var menuCommandID = new CommandID(CommandSet, CommandId); | |
var menuItem = new MenuCommand(this.Execute, menuCommandID); | |
commandService.AddCommand(menuItem); | |
} | |
/// <summary> | |
/// Gets the instance of the command. | |
/// </summary> | |
public static RestartToCursorCommand Instance | |
{ | |
get; | |
private set; | |
} | |
/// <summary> | |
/// Gets the service provider from the owner package. | |
/// </summary> | |
private Microsoft.VisualStudio.Shell.IAsyncServiceProvider ServiceProvider | |
{ | |
get | |
{ | |
return this.package; | |
} | |
} | |
/// <summary> | |
/// Initializes the singleton instance of the command. | |
/// </summary> | |
/// <param name="package">Owner package, not null.</param> | |
public static async Task InitializeAsync(AsyncPackage package) | |
{ | |
// Switch to the main thread - the call to AddCommand in RestartToCursorCommand's constructor requires | |
// the UI thread. | |
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(package.DisposalToken); | |
OleMenuCommandService commandService = await package.GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService; | |
Instance = new RestartToCursorCommand(package, commandService); | |
} | |
/// <summary> | |
/// This function is the callback used to execute the command when the menu item is clicked. | |
/// See the constructor to see how the menu item is associated with this function using | |
/// OleMenuCommandService service and MenuCommand class. | |
/// </summary> | |
/// <param name="sender">Event sender.</param> | |
/// <param name="e">Event args.</param> | |
private void Execute(object sender, EventArgs e) | |
{ | |
ThreadHelper.ThrowIfNotOnUIThread(); | |
var dte = Package.GetGlobalService(typeof(DTE)) as DTE2; | |
var dbg = dte.Debugger; | |
if (dbg.CurrentProgram != null) | |
dbg.Stop(); | |
dbg.RunToCursor(true); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment