我有一个实用程序(grep),它给我一个文件名和行号列表.在我确定devenv是打开文件的正确程序之后,我想确保它在指定的行号处打开.在emacs中,这将是:
emacs +140 filename.c
我发现Visual Studio(devenv)没有这样的东西.我找到的最接近的是:
devenv /Command "Edit.Goto 140" filename.c
但是,这会为每个此类文件创建一个单独的devenv实例.我宁愿有一些使用现有实例的东西.
这些变体重复使用现有的devenv,但不会转到指定的行:
devenv /Command "Edit.Goto 140" /Edit filename.c devenv /Command /Edit filename.c "Edit.Goto 140"
我认为使用多个"/ Command"参数可能会这样做,但我可能没有正确的参数因为我得到错误或根本没有响应(除了打开一个空的devenv).
我可以为devenv编写一个特殊的宏,但我希望这个实用程序可以被没有该宏的其他人使用.而且我不清楚如何使用"/ Command"选项调用该宏.
有任何想法吗?
好吧,似乎没有办法按我的意愿去做.由于看起来我需要有专门的代码来启动Visual Studio,所以我决定使用EnvDTE,如下所示.希望这会有助于其他人.
#include "stdafx.h"
//-----------------------------------------------------------------------
// This code is blatently stolen from http://benbuck.com/archives/13
//
// This is from the blog of somebody called "BenBuck" for which there
// seems to be no information.
//-----------------------------------------------------------------------
// import EnvDTE
#pragma warning(disable : 4278)
#pragma warning(disable : 4146)
#import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
#pragma warning(default : 4146)
#pragma warning(default : 4278)
bool visual_studio_open_file(char const *filename, unsigned int line)
{
HRESULT result;
CLSID clsid;
result = ::CLSIDFromProgID(L"VisualStudio.DTE", &clsid);
if (FAILED(result))
return false;
CComPtr punk;
result = ::GetActiveObject(clsid, NULL, &punk);
if (FAILED(result))
return false;
CComPtr DTE;
DTE = punk;
CComPtr item_ops;
result = DTE->get_ItemOperations(&item_ops);
if (FAILED(result))
return false;
CComBSTR bstrFileName(filename);
CComBSTR bstrKind(EnvDTE::vsViewKindTextView);
CComPtr window;
result = item_ops->OpenFile(bstrFileName, bstrKind, &window);
if (FAILED(result))
return false;
CComPtr doc;
result = DTE->get_ActiveDocument(&doc);
if (FAILED(result))
return false;
CComPtr selection_dispatch;
result = doc->get_Selection(&selection_dispatch);
if (FAILED(result))
return false;
CComPtr selection;
result = selection_dispatch->QueryInterface(&selection);
if (FAILED(result))
return false;
result = selection->GotoLine(line, TRUE);
if (FAILED(result))
return false;
return true;
}
小智.. 29
使用VS2008 SP1,您可以使用以下命令行在现有实例中的特定行打开文件:
devenv /edit FILE_PATH /command "edit.goto FILE_LINE"
资源
使用VS2008 SP1,您可以使用以下命令行在现有实例中的特定行打开文件:
devenv /edit FILE_PATH /command "edit.goto FILE_LINE"
资源
在阐述Harold的问题和答案时,我将C++解决方案(我最初采用的)改编为C#.它更简单(这是我的第一个C#程序!).只需要创建一个项目,添加对"envDTE"和"envDTE80"的引用并删除以下代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace openStudioFileLine
{
class Program
{
[STAThread]
static void Main(string[] args)
{
try
{
String filename = args[0];
int fileline;
int.TryParse(args[1], out fileline);
EnvDTE80.DTE2 dte2;
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
dte2.MainWindow.Activate();
EnvDTE.Window w = dte2.ItemOperations.OpenFile(filename, EnvDTE.Constants.vsViewKindTextView);
((EnvDTE.TextSelection)dte2.ActiveDocument.Selection).GotoLine(fileline, true);
}
catch (Exception e)
{
Console.Write(e.Message);
}
}
}
}
然后只需要打电话openStudioFileLine path_to_file numberOfLine
.
希望可能有所帮助!
基于reder回答我已经发布了包含源代码的存储库,这里是二进制文件(.net2.0)
我还添加了对多个VS版本的支持
usage:Visual Studio version value VisualStudio 2002 2 VisualStudio 2003 3 VisualStudio 2005 5 VisualStudio 2008 8 VisualStudio 2010 10 VisualStudio 2012 12 VisualStudio 2013 13
使用GrepWin的示例:
VisualStudioFileOpenTool.exe 12 %path% %line%