LoginSignup
6
3

More than 3 years have passed since last update.

EmacsとVisualStudioを相互連携する

Last updated at Posted at 2019-07-07

目的

VisualStudioで表示中のファイルをEmacsに表示したり
Emacsで表示中のファイルをVisualStudioに表示したりしたい

背景

C#での開発で、Emacsでコード編集し、VisualStudioでビルド、デバッグ作業しているため

VisualStudioで表示中のファイルをEmacsに表示

下記ブログのエントリーに、まんまやりたいことが丁寧に解説されてました
Visual StudioのファイルをEmacsで開く

ただ、現在の行に移動までしてもらいたいので、引数は
+$(CurLine):$(CurCol) $(ItemPath)
としておくとうまくいった

Emacsで表示中のファイルをVisualStudioに表示

下記melpa packageでまんまやりたいことができた
open-in-msvs.el

ただ、VS17ではうまく動かなかったので、packageで落とされるvbscriptの以下2点を修正した

open-in-msvs.vbs
filename = WScript.Arguments(0)
line = WScript.Arguments(1)
column = WScript.Arguments(2)

On Error Resume Next

MSVS_versions = Array _
( _
    "VisualStudio.DTE.7", _
    "VisualStudio.DTE.7.1", _
    "VisualStudio.DTE.8.0", _
    "VisualStudio.DTE.9.0", _
    "VisualStudio.DTE.10.0", _
    "VisualStudio.DTE.11.0", _
    "VisualStudio.DTE.12.0", _
-     "VisualStudio.DTE.14.0" _
+     "VisualStudio.DTE.14.0", _
+     "VisualStudio.DTE.15.0" _
)
+ ' VS17はDTE.15.0のようだ。14.0のほうにカンマつけて15.0の行追加

For each version in MSVS_versions
    Err.Clear
    Set dte = getObject(,version)
    If Err.Number = 0 Then
        Exit For
    End If
Next

If Err.Number <> 0 Then
    Set dte = WScript.CreateObject("VisualStudio.DTE")
    Err.Clear
End If


dte.MainWindow.Activate
dte.MainWindow.Visible = True
dte.UserControl = True

dte.ItemOperations.OpenFile filename
dte.ActiveDocument.Selection.MoveToLineAndOffset line, column + 1
+ ' VisualStudioが前面に来ないのでアクティブ化
+ Set objWshShell= Wscript.CreateObject("Wscript.Shell")
+ objWshShell.AppActivate dte.MainWindow.Caption

このコードを調べていて分かったが、VisualStudioの機能を外部から呼ぶのにDTEというものを使っているようだ
このコードを応用して、DTEClass.ExecuteCommand(String, String) Methodを利用すると
デバッグ開始、ソリューションのビルド、スタートアッププロジェクトのビルド等ができた

DteExecCmd.vbs
Set dte = getObject(,"VisualStudio.DTE.15.0")

'デバッグ開始
'dte.ExecuteCommand("Debug.Start")
'ソリューションのビルド、リビルド
'dte.ExecuteCommand("Build.BuildSolution")
'dte.ExecuteCommand("Build.RebuildSolution")
'スタートアッププロジェクトのビルド、リビルド
'dte.ExecuteCommand("Build.BuildSelection")
'dte.ExecuteCommand("Build.RebuildSelection")

利用可能なコマンドついてはこちらを参照

最後に

Emacs->VSはめんどくさいことになるかなと思ったのですが、探せば誰かが作ってくれているものが見つかるものですね
melpaにあってラッキーでした

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3