代码之家  ›  专栏  ›  技术社区  ›  Paul Suart Wes

C正确格式化(缩进、对齐)C

  •  4
  • Paul Suart Wes  · 技术社区  · 15 年前

    我们有一个代码生成器 munges 给定数据库的模式,用于自动化内部n层体系结构。输出是各种C分部类,每个文件一个。

    在咀嚼所有字符串的代码中,我们尽量保持缩进和格式的顶部,但总是在Visual Studio中打开文件时格式错误。一个快速的ctrl-k,ctrl-d修复了它,但是很明显,这种重新格式化在下次生成类时会丢失。

    我想知道的是,如果有一种方法,我可以像Visual Studio那样自动格式化文本文件的内容?

    伪码

    Create "code" object, passing text file to constructor
    Invoke "format" method
    Re-save text file
    

    非常感谢您的帮助。

    编辑: 我应该澄清——我希望能够从创建包含我生成的C_的文本文件的C代码中调用格式。代码的格式可以标准化(不必由每个开发人员负责),我不想安装任何第三方应用程序。

    我似乎记得有一个命名空间,其中包含用于在C中创建C的类的负载: http://msdn.microsoft.com/en-us/library/system.codedom(VS.80).aspx 但我不确定它是否包含任何可以帮助您的类。

    进一步编辑: 我的代码生成器是通过单击一次安装部署的WinForms应用程序。它被许多内部开发人员使用。我需要一个不需要每个开发人员在他们的机器上安装工具的解决方案。

    6 回复  |  直到 15 年前
        1
  •  5
  •   Dan McClain    15 年前

    扩展Cherian的答案:

    NArrange 将允许您进行大量的代码格式化。它是开放源码的,源代码在他们的站点上是可用的,因此您可以潜在地将其与您的工具集成并重新发布。

    您应该只需要DLL,并查看关于如何调用格式的exe。它还将创建正在格式化的代码的备份。如果它适合你的需要,它真的是一个很好的工具。

        2
  •  6
  •   Cherian    15 年前

    看一看 Narrange 。您可能需要将这些事情自动化,作为构建的一部分。
    但不确定它是否满足您的所有要求。
    引述:

    Narrange是一个.NET代码美化工具 自动组织代码的 .NET中的成员和元素 类。

        3
  •  3
  •   Anton Krouglov    7 年前

    要以编程方式正确缩进代码,您需要Microsoft.CodeAnalysis.CSharp Nuget包和.NET Framework 4.6+。样本代码:

    public string ArrangeUsingRoslyn(string csCode) {
        var tree = CSharpSyntaxTree.ParseText(csCode);
        var root = tree.GetRoot().NormalizeWhitespace();
        var ret = root.ToFullString();
        return ret;
    }
    

    一班轮:

    csCode = CSharpSyntaxTree.ParseText(csCode).GetRoot().NormalizeWhitespace().ToFullString();
    

    您也可以使用 NArrange 要对cs文件中的方法进行排序,请组织using、创建区域等。请注意,narrange不缩进任何内容。

        4
  •  1
  •   Hallgrim    15 年前

    您可以使用codedom和csharpcodeprovider。它都在名称空间microsoft.csharp和system.codedom中。

    她是一个财产的例子:

    StringWriter writer = new StringWriter();
    CSharpCodeProvider provider = new CSharpCodeProvider();
    CodeMemberProperty property = new CodeMemberProperty();
    property.Type = new CodeTypeReference(typeof(int));
    property.Name = "MeaningOfLifeUniverseAndEverything";
    property.GetStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(42)));
    provider.GenerateCodeFromMember(property, writer, null);
    Console.WriteLine(writer.GetStringBuilder().ToString());
    

    此代码将生成:

    private int MeaningOfLifeUniverseAndEverything {
        get {
            return 42;
        }
    }
    

    codedom是生成代码的一种非常健谈的方式。好的是,您可以生成多种语言。也许您可以找到erlang.net代码提供者?

    通过使用代码段表达式,您可能可以执行一些快捷方式。

        5
  •  0
  •   Greg Hurlman    15 年前

    只有当您将代码生成器作为vs附加组件运行时,每个开发人员才会有不同的设置。

        6
  •  0
  •   Randolpho    15 年前

    下面是如何从宏或外接程序的上下文执行此操作:

    var dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.8.0");
    dte.ExecuteCommand("File.OpenFile", filename);
    dte.ExecuteCommand("Edit.FormatDocument", filename);
    dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes);
    

    警告:正如@greg hurlman所说,输出将根据用户当前的选项而变化。

    编辑:

    不幸的是,您的方法要求我在WinForms应用程序旁边运行一个vs实例。你能想出一种方法从我的应用程序中创建一个vs实例吗(如果可能的话)?

    我认为从你的win.form应用程序中可以做到。但是,您必须在运行代码的计算机上安装Visual Studio。

    试试这个:

    var dte = (EnvDTE80.DTE2)Microsoft.VisualBasic.Interaction.CreateObject("VisualStudio.DTE.8.0", "");
    dte.ExecuteCommand("File.OpenFile", filename);
    dte.ExecuteCommand("Edit.FormatDocument", filename);
    dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes);
    

    请记住,您需要引用envdte80.dll程序集。