是否可以在 yaml-cpp 中设置发射器缩进的基本级别?

Posted

技术标签:

【中文标题】是否可以在 yaml-cpp 中设置发射器缩进的基本级别?【英文标题】:Is it possible set the base level of Emitter indentation in yaml-cpp? 【发布时间】:2020-09-02 22:41:34 【问题描述】:

是否有一种一次性的方法可以为 Emitter 在 yaml-cpp 中发出的所有值设置基本缩进级别?

我尝试使用 Emitter::SetIndentEmitter::SetLocalIndent 但它们似乎只影响发射器根级别以下的项目,而不是根级别项目本身

为了说明,请考虑以下所需 YAML 输出。值开始时已经缩进了 4 个空格(我右边的 cmets 不是输出的一部分)

    type: Circle            // Correctly indented by 1 level (4 spaces)
    r: 492.763875219
    x: 1286.75555556
    y: 1195.04
    regions:
      - id: 1750272850      // Correctly indented by 2 levels (8 spaces)
        width: 200
      - id: 524770566
        width: 42

我试着用这段代码写出来:

void Shape::writeToYaml(std::ostream& os)

    YAML::Emitter out;      
    out.SetIndent(4);         // THIS DOES NOT HELP
    out << YAML::BeginMap;

    for (auto&& prop : properties())   // 'properties()' returns std::map<string, string>
        out << YAML::Key << prop.first << YAML::Value << prop.second;
    out << YAML::Key << PK_REGIONS << YAML::Value;
    out << YAML::BeginSeq; 
    for (auto&& region : m_regions)
        out << region.properties();  // 'properties()' returns std::map<string, string>

    out << YAML::EndSeq;
    out << YAML::EndMap;

    os << out.c_str();

相反,我得到了这个输出,其中根值根本没有缩进,而低于这些值的值缩进太多

type:   Circle                         // WRONG: NOT INDENTED AT ALL
r:      492.763875219
x:      1286.75555556
y:      1195.04
regions:
        -       id:     2077164443     // WRONG: INDENTED BY TOO MUCH
                width:  200
        -       id:     2031385931
                width:  42

(我正在尝试调整现有的 yaml 编写代码而不在我的 API 中公开 yaml-cpp 类型,因此我需要能够动态创建发射器,然后设置它们的基本缩进。我正在使用最新,0.6 版本,昨天下载)

【问题讨论】:

【参考方案1】:

afaik yaml-cpp 无法为您执行此操作,但解决方法非常简单:

std::stringstream ss(out.c_str());
std::string line;
while (std::getline(line, ss)) 
  os << "    " << line << std::endl;

为避免复制发射器的输出字符串,see here。

【讨论】:

以上是关于是否可以在 yaml-cpp 中设置发射器缩进的基本级别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Word中设置首行缩进2字符

在 Visual Studio Code 中设置 Cobol 制表符/缩进

在vim中设置tab缩进为4个字符

在vim中设置tab缩进为4个字符

使用自动成对关闭时如何在 Vim 中设置自动插入新行和缩进

如何为特定的 yaml-cpp 节点设置发射样式