2010-09-24 9 views
23

Si tengo 10 archivos abiertos y puedo modificar mi archivo csproj (por ejemplo: añadir un espacio ) Visual Studio se queja:¿Hay alguna configuración en VS 2010 que le permita recuperar archivos abiertos después de que un archivo de proyecto cambie?

 
The project "XYZ" has been modified outside the environment. 

Press Reload to load the updated project from disk. 
Press Ignore to ignore the external changes. The change will be used the next time you open the project. 

Ahora, realmente quiero recarga causa hay cambios importantes, pero lo hago no quiero que Visual Studio cierre todos mis archivos abiertos, en su lugar me gustaría actualizar los que aún existen y cerrar los que faltan.

¿Hay alguna manera de obtener ese tipo de funcionalidad?

Respuesta

28

Sí, me escribió una extensión para solucionar este problema en VS10 y VS11: http://visualstudiogallery.msdn.microsoft.com/6705affd-ca37-4445-9693-f3d680c92f38

disfrutar.

+0

¡Es una buena extensión! Sería aún más agradable si la pila de modificación se guardara, por lo que puede deshacer cosas incluso después de una recarga. – Jowen

+0

¡Sería bueno si pudiera integrarse con la función de pestaña de la extensión de herramientas eléctricas! – Mic

11

Como esta funcionalidad no está construido, me escribió la siguiente macro:

Public Sub ReloadProject() 
    Dim oldFiles As List(Of String) 
    oldFiles = New List(Of String) 

    Dim projName = DTE.ActiveDocument.ProjectItem.ContainingProject.Name 

    For iDoc = DTE.Documents.Count To 1 Step -1 
     Dim name = (DTE.Documents.Item(iDoc).FullName) 
     oldFiles.Add(name) 
     DTE.Documents.Item(iDoc).Close(vsSaveChanges.vsSaveChangesPrompt) 
    Next 

    Dim projPath As String = DTE.Solution.Properties.Item("Name").Value.ToString() & "\" & projName 

    Dim solutionExplorer As Window = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer) 
    solutionExplorer.Activate() 

    Dim solutionHierarchy As UIHierarchy = solutionExplorer.Object 
    Dim obj As Object = solutionHierarchy.GetItem(projPath) 
    obj.Select(vsUISelectionType.vsUISelectionTypeSelect) 

    DTE.ExecuteCommand("Project.UnloadProject") 
    DTE.ExecuteCommand("Project.ReloadProject") 

    oldFiles.Reverse() 
    For Each file In oldFiles 
     Dim item = DTE.Solution.FindProjectItem(file) 
     If Not item Is Nothing Then 
      item.Open() 
      item.Document.Activate() 
     End If 
    Next 

End Sub 

Cuando llego a la ventana molesta que me dice que vuelva a cargar, lo ignoro. Y luego ejecuta esta macro después de volver a cargar.

+5

¿Por qué no me dice sobre esto en nuestro chat de equipo? NO ME AMAS? –

+3

@Jarrod, estoy tratando de mantener todas mis ventajas competitivas, de lo contrario no puedo seguir el ritmo :) –

0

Dado que las macros no están disponibles en Visual Studio 2013, necesita un complemento para ejecutar macros. Visual Commander (disponible en la Galería) parece hacer el truco. Ajusté la macro de Sam Saffron para trabajar en VS 2013 a través de Visual Commander.

Edit Feb 2015: También lo he mejorado para recordar el número de línea y la columna del documento activo y para registrar cualquier error en la ventana de salida de macro de Visual Studio.

versión más reciente aquí: https://gist.github.com/nycdotnet/947025d922fa2af87d03

'=============================================================================== 
' This macro originally written by Sam Saffron, adapted for Visual Studio 2013 
' by Steve Ognibene. Run in Visual Studio with a macro launcher such as the 
' Visual Commander extension. 
' Latest version will be here: https://gist.github.com/nycdotnet/947025d922fa2af87d03 
' Original Stack Overflow thread: http://stackoverflow.com/questions/3783648/is-there-a-setting-in-vs-2010-that-will-allow-it-to-recover-open-files-after-a-p/28130299#28130299 
'=============================================================================== 
Imports EnvDTE 
Imports EnvDTE80 
Imports Microsoft.VisualStudio.Shell 
Imports VisualCommanderExt 
Imports System 
Imports System.Collections.Generic 

Public Class C 
    Implements ICommand 

    Private DTE as DTE2 

    Sub Run(InboundDTE As DTE2, package As Package) Implements ICommand.Run 
     Me.DTE = InboundDTE 
     ReloadProject(DTE) 
    End Sub 

    Public Sub ReloadProject(DTE As DTE2) 
     Try 

      Dim oldFiles As New List(Of String) 
      Dim iDoc As Object 

      If DTE.ActiveDocument Is Nothing Then 
       WriteOutput("You must have a document open to reload a project with this macro.") 
       Exit Sub 
      End If 

      Dim projName = DTE.ActiveDocument.ProjectItem.ContainingProject.Name 

      Dim activeDocFullName = DTE.ActiveDocument.FullName 
      Dim objSel As TextSelection = DTE.ActiveDocument.Selection 
      Dim objActive As VirtualPoint = objSel.ActivePoint 
      Dim intOriginallyActiveRowNumber As Integer = objActive.Line 
      Dim intOriginallyActiveColumnNumber As Integer = objActive.LineCharOffset 

      For iDoc = DTE.Documents.Count To 1 Step -1 
       Dim name = (DTE.Documents.Item(iDoc).FullName) 
       oldFiles.Add(name) 
       DTE.Documents.Item(iDoc).Close(vsSaveChanges.vsSaveChangesPrompt) 
      Next 

      Dim projPath As String = DTE.Solution.Properties.Item("Name").Value.ToString() & "\" & projName 

      Dim solutionExplorer As Window = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer) 
      solutionExplorer.Activate() 

      Dim solutionHierarchy As UIHierarchy = solutionExplorer.Object 
      Dim obj As Object = solutionHierarchy.GetItem(projPath) 
      obj.Select(vsUISelectionType.vsUISelectionTypeSelect) 

      DTE.ExecuteCommand("Project.UnloadProject") 
      DTE.ExecuteCommand("Project.ReloadProject") 

      oldFiles.Reverse() 

      're-open all previously open files 
      For Each file As Object In oldFiles 
       Dim item = DTE.Solution.FindProjectItem(file) 
       If Not item Is Nothing Then 
        item.Open() 
        item.Document.Activate() 
       End If 
      Next 

      'reactivate previously active file 
      For Each file As Object In oldFiles 
       If file = activeDocFullName Then 
        Dim item = DTE.Solution.FindProjectItem(file) 
        If Not item Is Nothing Then 
         item.Document.Activate() 
         Dim ts as TextSelection = item.Document.Selection 
         ts.MoveToLineAndOffset(intOriginallyActiveRowNumber,intOriginallyActiveColumnNumber,false) 
        End If 
       End If 
      Next 
     Catch Ex as Exception 
      WriteOutput("Exception: " & ex.Message & System.Environment.NewLine & ex.StackTrace) 
     End Try 

    End Sub 

    Private Function GetMacroOutputPane() As OutputWindowPane 
     Dim ow As OutputWindow = _ 
      DTE.Windows.Item(Constants.vsWindowKindOutput).Object() 

     Dim outputPane As OutputWindowPane 

     Try 
      outputPane = ow.OutputWindowPanes.Item("Macros") 
     Catch ex As Exception 
      outputPane = ow.OutputWindowPanes.Add("Macros") 
     End Try 

     Return outputPane 
    End Function 

    Private Sub WriteOutput(ByVal s As String) 
     Dim buffer = New System.Text.StringBuilder 

     buffer.Append(Date.Now.ToLongTimeString()) 
     buffer.Append(" ") 
     buffer.Append(s) 
     buffer.Append(System.Environment.NewLine) 

     Dim output As String = buffer.ToString() 
     Dim outputPane As OutputWindowPane = GetMacroOutputPane() 

     outputPane.OutputString(output) 
    End Sub 

End Class 
Cuestiones relacionadas