58 votes

Ouvrir un fichier dans Visual Studio à un numéro de ligne spécifique

J'ai un utilitaire grep () qui me donne une liste de noms de fichiers et les numéros de ligne. Après j'ai déterminé que devenv est le bon programme pour ouvrir un fichier, je voudrais vous assurer qu'il est ouvert à l'indication du numéro de la ligne. Dans emacs, ce serait:

emacs +140 filename.c

Je n'ai rien trouvé de ce genre pour Visual Studio (devenv). Le plus proche que j'ai trouvé est:

devenv /Command "Edit.Goto 140" filename.c

Cependant, ce qui rend une instance distincte de devenv pour chaque fichier. Je préfère avoir quelque chose qui utilise une instance existante.

Ces variations de ré-utiliser un existant devenv, mais ne pas aller à la ligne indiquée:

devenv /Command "Edit.Goto 140" /Edit filename.c
devenv /Command  /Edit filename.c "Edit.Goto 140"

Je pensais que l'utilisation de plusieurs "/Commande" arguments pourraient le faire, mais je n'ai probablement pas la bonne parce que je l'ai, des erreurs ou absence de réponse à tous les (autres que l'ouverture d'un vide devenv).

Je pourrais écrire une macro spécial pour devenv, mais je voudrais à cet outil d'être utilisés par ceux qui n'ont pas de macro. Et je ne suis pas clair sur la façon d'appeler cette macro avec le "/Commande" option.

Des idées?


Eh bien, il ne semble pas qu'il y est un moyen de faire ce que je voulais. Depuis qu'il regarde comme je vais avoir besoin d'avoir consacré du code de démarrage de Visual Studio, j'ai décidé d'utiliser EnvDTE comme indiqué ci-dessous. J'espère que cela va aider quelqu'un d'autre.

#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;
}

31voto

Fouré Olivier Points 201

Avec VS2008 SP1 , vous pouvez utiliser la ligne de commande suivante pour ouvrir un fichier sur une ligne spécifique d'une instance existante:

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

La source

29voto

reder Points 664

En développant la question et la réponse de Harold, j'ai adapté la solution C ++ (que j'ai d'abord adoptée) au C #. C'est beaucoup plus simple (c'est mon premier programme C #!). Il suffit de créer un projet, d'ajouter des références à "envDTE" et "envDTE80" et de supprimer le code suivant:

 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);      
            }
        }
    }
}
 

On appelle alors simplement openStudioFileLine path_to_file numberOfLine .

J'espère que cela peut aider!

14voto

diimdeep Points 165

Basé sur reder réponse que j'ai publié un référentiel avec la source, ici, est binaire(.net2.0)

J'ai aussi ajouter le support pour de multiples VS les versions

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 

Exemple d'utilisation de GrepWin:

VisualStudioFileOpenTool.exe 12 %path% %line%

1voto

Dinis Cruz Points 1042

Pour référence, voici ENVDE écrit en C # (utilisant O2 Platform dans VisualStudio pour obtenir une référence à l’objet DTE en direct)

 var visualStudio = new API_VisualStudio_2010();

var vsDTE = visualStudio.VsAddIn.VS_Dte;
//var document = (Document)vsDTE.ActiveDocument;
//var window =  (Window)document.Windows.first();           
var textSelection  = (TextSelection)vsDTE.ActiveDocument.Selection;
var selectedLine = 1;
20.loop(100,()=>{
                    textSelection.GotoLine(selectedLine++);
                    textSelection.SelectLine();
                });
return textSelection;
 

Ce code fait une petite animation où 20 lignes sont sélectionnées (avec un intervalle de 100ms)

0voto

EndangeredMassa Points 9532

Je ne peux pas trouver un moyen de faire cela avec des options en ligne de commande. Il semble que vous deviez écrire une macro pour cela. Soi-disant, vous pouvez les invoquer comme ça.

 devenv /command "Macros.MyMacros.Module1.OpenFavoriteFiles"
 

Donc, vous pouvez probablement créer une macro qui prend un nom de fichier et un numéro de ligne, puis ouvre le fichier et saute au bon endroit. Mais, je ne sais pas si vous pouvez spécifier un indicateur de même instance quelque part ou non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X