当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在VisualStudio中以特定的行号打开文件》经验,为你挑选了3个好方法。

我有一个实用程序(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"

资源



1> 小智..:

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

devenv /edit FILE_PATH /command "edit.goto FILE_LINE"

资源


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

2> reder..:

在阐述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.

希望可能有所帮助!



3> diimdeep..:

基于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%

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有