在格式模块上配置更大的列数

时间:2018-12-03 11:57:12

标签: format ocaml

格式模块

Format模块用于对漂亮的打印机进行建模并将其与语法扩展相结合,该语法扩展允许键入格式,并且在编写代码生成器或数据结构打印机之类的东西时会很有帮助。

问题

但是,78 columns的限制是在格式化程序的空白处初始化的,它将超出此限制的任何内容向左拉。

我正在使用Yojson.Basic.json模块来打印Format程序的较轻版本,但是当输入太大时,输出将折叠,而实际上并不是“漂亮”。 / p>

预览

  • 以下是简短格式: Correct

  • 这里是缩进太大时如何格式化 Wrong

我一直试图超过此限制并将其配置为120列,但没有成功。

我尝试了什么?

  • 使用Format.pp_set_margin ppf 120重新配置
  • Format.pp_set_max_indent使用更大的值

但是它们似乎没有任何作用,并且没有关于此限制的文档。我只是通过阅读源代码才发现它的。

我在做什么?

let string_of_cst program =
  let ppf = Format.str_formatter in
  (* I've enabled colors. *)
  Format.pp_set_tags ppf colors;
  Format.pp_set_formatter_tag_functions ppf with_colors;
  (* [print_json] is my printer. *)
  print_json ppf program;
  (* Get string out of printer. *)
  Format.flush_str_formatter ()

如何配置更大的限制?

1 个答案:

答案 0 :(得分:2)

问题是marginmax_indent的值被隐式约束到圆锥体1 < max_indent < margin,函数set_max_indent默默地失败,并且如果没有此约束,则不执行任何操作受到尊重。

为避免此问题,在OCaml≥4.08中,可以使用新的set_geometry函数,该函数要求同时设置两个值,并且如果所需的max_indent大于边距。

否则,您应始终同时设置两个值,并始终按顺序设置 首先是margin,然后是max_indent。如果您不知道为max_indent选择哪个值,通常选择margin - 10