在Visual Studio中以特定的行号打开文件

Har*_*ord 55 command-line visual-studio

我有一个实用程序(grep),它给我一个文件名和行号列表.在我确定devenv是打开文件的正确程序之后,我想确保它在指定的行号处打开.在emacs中,这将是:

emacs +140 filename.c
Run Code Online (Sandbox Code Playgroud)

我发现Visual Studio(devenv)没有这样的东西.我找到的最接近的是:

devenv /Command "Edit.Goto 140" filename.c
Run Code Online (Sandbox Code Playgroud)

但是,这会为每个此类文件创建一个单独的devenv实例.我宁愿有一些使用现有实例的东西.

这些变体重复使用现有的devenv,但不会转到指定的行:

devenv /Command "Edit.Goto 140" /Edit filename.c
devenv /Command  /Edit filename.c "Edit.Goto 140"
Run Code Online (Sandbox Code Playgroud)

我认为使用多个"/ 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<IUnknown> punk;
    result = ::GetActiveObject(clsid, NULL, &punk);
    if (FAILED(result))
        return false;

    CComPtr<EnvDTE::_DTE> DTE;
    DTE = punk;

    CComPtr<EnvDTE::ItemOperations> item_ops;
    result = DTE->get_ItemOperations(&item_ops);
    if (FAILED(result))
        return false;

    CComBSTR bstrFileName(filename);
    CComBSTR bstrKind(EnvDTE::vsViewKindTextView);
    CComPtr<EnvDTE::Window> window;
    result = item_ops->OpenFile(bstrFileName, bstrKind, &window);
    if (FAILED(result))
        return false;

    CComPtr<EnvDTE::Document> doc;
    result = DTE->get_ActiveDocument(&doc);
    if (FAILED(result))
        return false;

    CComPtr<IDispatch> selection_dispatch;
    result = doc->get_Selection(&selection_dispatch);
    if (FAILED(result))
        return false;

    CComPtr<EnvDTE::TextSelection> selection;
    result = selection_dispatch->QueryInterface(&selection);
    if (FAILED(result))
        return false;

    result = selection->GotoLine(line, TRUE);
    if (FAILED(result))
        return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

小智 29

使用VS2008 SP1,您可以使用以下命令行在现有实例中的特定行打开文件:

devenv /edit FILE_PATH /command "edit.goto FILE_LINE"
Run Code Online (Sandbox Code Playgroud)

资源

  • 这将在VS2010中为我打开文件,但除非打开Visual Studio的新实例,否则不会跳转到该行. (11认同)
  • 我没有运行实例尝试了这个并且它运行了 - VS2008启动,打开文件,然后转到指示的行.然后我尝试在另一个文件上(VS2008仍在运行)并打开文件但保留在第1行.您认为我们的设置有什么不同? (7认同)
  • 我在Vim中进行了设置,十分之一。&lt;咕umble咕umble&gt; VS2010 (2认同)
  • 仍然不是解决方案.正确的解决方案是下面的一个帖子. (2认同)
  • 这适用于VS2013.即使VS2013还没有打开.但是,我需要使用Visual Studio命令提示符或指定`devenv`的完整路径.我希望也可以添加路径到PATH环境变量. (2认同)

red*_*der 29

在阐述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);      
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只需要打电话openStudioFileLine path_to_file numberOfLine.

希望可能有所帮助!


dii*_*eep 14

基于reder回答我已经发布了包含源代码的存储库,这里是二进制文件(.net2.0)

我还添加了对多个VS版本的支持

usage: <version> <file path> <line number> 

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 
Run Code Online (Sandbox Code Playgroud)

使用GrepWin的示例:

VisualStudioFileOpenTool.exe 12 %path% %line%
Run Code Online (Sandbox Code Playgroud)


End*_*ssa 0

我无法找到使用直接命令行选项来执行此操作的方法。看来你必须为它编写一个宏。据说,你可以像这样调用它们。

devenv /command "Macros.MyMacros.Module1.OpenFavoriteFiles"
Run Code Online (Sandbox Code Playgroud)

因此,您可以创建一个宏,它采用文件名和行号,然后打开文件并跳转到正确的位置。但是,我不知道您是否可以在某处指定相同实例标志。

  • 这实际上并不能解决问题,因为 devenv /command 启动一个新实例 (5认同)