2009-01-06 8 views
10

¿Alguien puede publicar una macro de Visual Studio que recorre todos los archivos fuente de C# en un proyecto y agrega un banner de archivo? Crédito adicional si funciona para cualquier tipo de archivo fuente (.cs, .xaml, etc.).Necesita macro de Visual Studio para agregar un banner a todos los archivos de C#

+0

VS 2013 tiene un buen complemento desde [rubicon IT] (http://licensemanager.codeplex.com/) que le permite añadir, eliminar y actualizar un encabezado de cada archivo con el tipo de extensión declarada en su archivo de licencia. Instalar directamente yendo a Herramientas -> 'Extensiones y actualizaciones' -> 'En línea' -> buscar 'encabezados' y encontrar el resultado 'Administrador de encabezado de licencia'. Ahora simplemente haga clic con el botón derecho en su carpeta de proyecto y use el nuevo menú 'encabezados de licencia'. –

Respuesta

14

Aquí tiene, proporciono un ejemplo para .cs y .vb pero no debería ser difícil para que usted pueda ajustar a su otro tipo de archivo necesidades: Editado para agregar de forma recursiva cabecera de sub -folders

Sub IterateFiles() 
    Dim solution As Solution = DTE.Solution 
    For Each prj As Project In solution.Projects 
     IterateProjectFiles(prj.ProjectItems) 
    Next 
End Sub 

Private Sub IterateProjectFiles(ByVal prjItms As ProjectItems) 
    For Each file As ProjectItem In prjItms 
     If file.SubProject IsNot Nothing Then 
      AddHeaderToItem(file) 
      IterateProjectFiles(file.ProjectItems) 
     ElseIf file.ProjectItems IsNot Nothing AndAlso file.ProjectItems.Count > 0 Then 
      AddHeaderToItem(file) 
      IterateProjectFiles(file.ProjectItems) 
     Else 
      AddHeaderToItem(file) 
     End If 
    Next 
End Sub 

Private Sub AddHeaderToItem(ByVal file As ProjectItem) 
    DTE.ExecuteCommand("View.SolutionExplorer") 
    If file.Name.EndsWith(".cs") OrElse file.Name.EndsWith(".vb") Then 
     file.Open() 
     file.Document.Activate() 

     AddHeader() 

     file.Document.Save() 
     file.Document.Close() 
    End If 
End Sub 

Private Sub AddHeader() 
    Dim cmtHeader As String = "{0} First Line" 
    Dim cmtCopyright As String = "{0} Copyright 2008" 
    Dim cmtFooter As String = "{0} Footer Line" 

    Dim cmt As String 

    Select Case DTE.ActiveDocument.Language 
     Case "CSharp" 
      cmt = "//" 
     Case "Basic" 
      cmt = "'" 
    End Select 
    DTE.UndoContext.Open("Header Comment") 
    Dim ts As TextSelection = CType(DTE.ActiveDocument.Selection, TextSelection) 
    ts.StartOfDocument() 
    ts.Text = String.Format(cmtHeader, cmt) 
    ts.NewLine() 
    ts.Text = String.Format(cmtCopyright, cmt) 
    ts.NewLine() 
    ts.Text = String.Format(cmtFooter, cmt) 
    ts.NewLine() 
    DTE.UndoContext.Close() 
End Sub 
+0

Gracias, votaré por esta en lugar de la que tiene el enlace al blog, porque muestra cómo enumerar los proyectos. – DSO

+0

¿Qué tan bien funciona esto para los archivos que tienen diseñadores, como WinForms? –

+0

Debería agregarlo a cualquier archivo CS o VB en la solución. Lo que incluiría el archivo de diseñador; sin embargo, como con cualquier archivo 'generado', el archivo podría cambiar y su comentario podría no estar allí. –

5
+0

Guau - gran respuesta. Lástima que OP no parezca asimilar a Google. –

+5

Gracias por el enlace. Onorio, probé google pero usé la palabra "banner" en lugar de "encabezado" ... que arroja resultados completamente diferentes. No sé por qué, siempre los llamé pancartas. Por supuesto ahora, debido a esta publicación, el uso de la palabra "banner" devuelve esta misma publicación. – DSO

1

Aquí es el jist de ella. No, no lo he depurado, es un ejercicio para el lector. Y, esto está hecho fuera de mi cabeza. (Excepto el comentario del archivo ... Esa es una macro real que uso).

function CommentAllFiles 
    option explicit 

    Dim ActiveProjectFullName 
    Dim dte80 As EnvDTE80.Solution2 

    ActiveProjectFullName = dte80.Projects.Item(0).FullName 
    If ActiveProjectFullName = "" Then 
     MsgBox("No project loaded!") 
     Exit Sub 
    End If 

    Err.Number = 0 
    doc.Open(ActiveProjectFullName, "Text", True) 
    If Err.Number <> 0 Then 
     MsgBox("Open " + ActiveProjectFullName + " failed: " & Hex(Err.Number)) 
     Exit Sub 
    End If 

    ActiveDocument.Goto(1, 1, vsMovementOptions.vsMovementOptionsMove) 

    ' Build search string 
    Dim SearchString 
    Dim vsFindOptionsValue As Integer 
    SearchString = "^SOURCE=.*" + dn + "$" 

    while ActiveDocument.Selection.FindText(SearchString, vsFindOptions.vsFindOptionsFromStart + vsFindOptions.vsFindOptionsRegularExpression) 
     Dim TheFile 
     TheFile = ActiveDocument.Selection.Text 
     TheFile = Mid(TheFile, 8) 
     doc.Open(TheFile) 
    wend 
    ActiveDocument.Close() 
end function 

probado y verdadero sumador de "caja de la flor":

Function IsClassDef() 
    Dim ColNum 
    Dim LineNum 
    Dim sText 

    sText = ActiveDocument.Selection.ToString() 
    If sText = "" Then 
     'ActiveDocument.Selection.WordRight(dsExtend) 
     'sText = ActiveDocument.Selection 
     'sText = ucase(trim(sText)) 
    End If 

    If (sText = "CLASS") Then 
     IsClassDef = True 
    Else 
     IsClassDef = False 
    End If 
End Function 

Sub AddCommentBlock() 
    'DESCRIPTION: Add Commecnt block to header, CPP files and Class Defs 
    AddCPPFileDesc() 
End Sub 

Sub AddCPPFileDesc() 
    'DESCRIPTION: Add File desc block to the top of a CPP file 
    Dim selection As EnvDTE.TextSelection 
    ActiveDocument.Selection.StartOfLine() 

    Dim editPoint As EnvDTE.EditPoint 
    selection = DTE.ActiveDocument.Selection() 
    editPoint = selection.TopPoint.CreateEditPoint() 

    Dim bOk, sExt, IsCpp, IsHdr, sHeader, IsCSharp 
    bOk = True 
    IsCpp = False 
    IsCSharp = False 

    If ActiveDocument.Selection.CurrentLine > 10 Then 
     If MsgBox("You are not at the top of the file. Are you sure you want to continue?", vbYesNo + vbDefaultButton2) = vbNo Then 
      bOk = False 
     End If 
    End If 

    If (bOk) Then 
     sExt = ucase(right(ActiveDocument.Name, 4)) 
     IsCpp = sExt = ".CPP" 
     IsHdr = Right(sExt, 2) = ".H" 
     IsCSharp = sExt = ".CS" 

     If (IsCpp) Then 
      sHeader = left(ActiveDocument.Name, len(ActiveDocument.Name) - 3) + "h" 
      FileDescTopBlock(1) 
      editPoint.Insert("#include " + Chr(34) + "StdAfx.h" + Chr(34) + vbLf) 
      editPoint.Insert("#include " + Chr(34) + sHeader + Chr(34) + vbLf) 
     ElseIf (IsCSharp) Then 
      FileDescTopBlock(1) 
     Else 
      If IsHdr Then 
       'If IsCLassDef() Then 
       'AddClassDef() 
       'Else 
       AddHeaderFileDesc() 
       'End If 
      Else 
       FileDescTopBlock(1) 
      End If 
     End If 
    End If 
End Sub 

Sub AddHeaderFileDesc() 
    FileDescTopBlock(0) 
    Dim selection As EnvDTE.TextSelection 
    ActiveDocument.Selection.StartOfLine() 

    Dim editPoint As EnvDTE.EditPoint 
    selection = DTE.ActiveDocument.Selection() 
    editPoint = selection.TopPoint.CreateEditPoint() 
    editPoint.Insert("#pragma once" + vbLf) 
End Sub 


Sub FileDescTopBlock(ByVal HasRevHistory) 
    'DESCRIPTION: Add File desc block to the top of a CPP file 
    Dim selection As EnvDTE.TextSelection 

    ActiveDocument.Selection.StartOfLine() 
    ActiveDocument.Selection.EndOfLine() 
    Dim sComment 
    sComment = ActiveDocument.Selection.ToString() 
    If Left(sComment, 2) = "//" Then 
     ActiveDocument.Selection.Delete() 
     sComment = LTrim(Mid(sComment, 3)) 
    Else 
     sComment = "" 
    End If 

    Dim sLineBreak 
    Dim sFileName 
    Dim sBlock 
    sLineBreak = "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////" 
    sFileName = ActiveDocument.Name 

    ActiveDocument.Selection.StartOfDocument() 
    sBlock = sLineBreak & vbLf & _ 
      "// File : " & sFileName & vbLf & _ 
      "// Author : Larry Frieson" & vbLf & _ 
      "// Desc : " & sComment & vbLf & _ 
     "// Date : " & CStr(Now.Date()) & vbLf & _ 
     "//" & vbLf & _ 
     "// Copyright © 20" + Right(CStr(Now.Year.ToString()), 2) + " MLinks Technologies. All rights reserved" + vbLf 
    If (HasRevHistory > 0) Then 
     sBlock = sBlock & _ 
       "//" & vbLf & _ 
       "// Revision History: " & vbLf & _ 
       "// " & CStr(Now) & " created." & vbLf & _ 
      "// " & vbLf 
    End If 
    sBlock = sBlock + sLineBreak + vbLf 

    Dim editPoint As EnvDTE.EditPoint 
    selection = DTE.ActiveDocument.Selection() 
    editPoint = selection.TopPoint.CreateEditPoint() 
    editPoint.Insert(sBlock) 

End Sub 

Espero que esto ayude, o al menos le da algunas ideas. Una vez más, no probé/depuré el "looper del archivo fuente", me imagino que usted puede manejar eso.

Larry

Cuestiones relacionadas