Open on GitHub - Visual StudioからGitHubのページを開くVS拡張

を、作りました。

機能は見たまんま?です。ソースコード上で右クリックすると「Open on GitHub」メニューが出るので、そこからmasterかbranchかrevisionを選ぶと、該当のGitHubのブロブページが開きます。便利。

インストールはVisual Studio Galleryからどうぞ。例によってソースコードはGitHubで公開しています。

How to make VSIX

VS拡張はドキュメントがあるんだかないんだか、一応あるんですけど、どうも取っ付きが悪いのが難点。今回はWalkthrough: Adding a Submenu to a Menuをベースに弄ってます。といってもやることは簡単なので、そんな大したことはないですが。

まず、メニュー系は全部vsctというクソ書きづらいXMLを弄って作っていきます。テンプレートは「Visual Studio Package」でウィザードで「Menu Command」を選んどくといいでしょふ、というかそれ以外だと詰む。で、vsctのうち

<Group guid="guidOpenOnGitHubCmdSet" id="ContextMenuGroup" priority="0x0600">
    <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN" />
</Group>

Parentを「guidSHLMainMenu, IDM_VS_CTXT_CODEWIN」にするとエディタのコンテキストメニューに出てきます。あとはまぁ、適当にどうぞ。OpenOnGitHub.vsctOpenOnGitHubPackage.csが全て。分かれば難しくない、分かるまでがダルい。

と、ここまでが普通の感じなんですがVSCT(Visual Studio Command Table)は闇が深くて、IDM_VS_CTXT_CODEWINだとcshtmlとかjsonとかcssでは出てきません!これは別のParentを設定する必要があります。しかも、そのGUIDとかはノーヒント……。既存の拡張を観て研究してもいいんですが、本質的にはUsing EnableVSIPLogging to identify menus and commands with VS 2005 + SP1の記事にある、レジストリ弄ってEnableVSIPLoggingをオンにして、直接対象ウィンドウのGUIDとCmdIdを取得するほうがいいかと思われます。取得したIDとかの使い方はOpenOnGitHub.vsctに載ってるので興味ある人は見てくださいな。

あと、Gitの解析にlibgit2を使っているんですが、VSIXでネイティブバイナリを同梱するためにcsprojに

<Content Include="NativeBinaries\amd64\git2-91fa31f.dll">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  <IncludeInVSIX>true</IncludeInVSIX>
</Content>

といったようにIncludeInVSIXをつけなきゃいけないとか、VSIX自体の署名を切らないといけない(テンプレートから作ると入ってるのでカットする)とか、細かいのをこなしていけば出来上がり!

最近のWindowsでGit

SourceTreeがゴミクズすぎて困る。ので、最近はVSのGit使ってたりします。割といいです。

コミットウィンドウが切り離せることに気付いてから、切り離して使ってます。そうするとまぁまぁコミットしやすい。Commit and Syncはなんのかんのいってベンリだし、SourceTreeよりもPushPullも気持ち早い。DiffとかがVS上で行えるのはサイキョーなので、あとはツリー表示さえあれば完璧だなぁ。ともあれ、VSのGit、いいです。見直しましょう。とにかくSourceTreeは使っててストレスで禿げるのでメインVS、サブSourceTreeぐらいの感じが今のとこ一番いい。

まとめ

ともあれOpen on GitHubはマジベンリ。うちの会社はGitHubでリポジトリ管理してるんですが、いっつも社内チャットに貼り付けるURLとか探してくるのひぢょーにダルくて、ずっと欲しかったのよね。やっと重い腰を上げて作りました。ほんとベンリ。もっと早くに作っておけば良かった。

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(.NET)
April 2011
|
July 2025

X:@neuecc GitHub:neuecc

Archive