format - 在格式模块上配置更大的列数限制

标签 format ocaml

格式模块

Format模块用于对 pretty-print 进行建模并将其与允许类型化格式的语法扩展相结合,当您编写代码生成器或数据结构打印机之类的东西时,它会很有帮助。

问题

但是,限制为 78 columns它在格式化程序的边缘初始化,并将向左拉动任何超出此限制的内容。

我正在使用 Format 模块打印 Yojson.Basic.json 程序的轻量版本,但是当输入太大时,输出会折叠,这并不是真正的“漂亮”。

预览

  • 以下是短时的格式: 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 ()

如何配置更大的限制?

最佳答案

问题是 margin 的值和max_indent隐含地约束在圆锥 1 < max_indent < margin和函数 set_max_indent如果不遵守此约束,则默默地失败并且不执行任何操作。

为了避免这个问题,在 OCaml ≥4.08 中,可以使用新的 set_geometry需要同时设置两个值的函数,如果需要max_indent则失败并出现异常大于边距。

否则,您应该始终同时设置这两个值,并且始终按顺序设置 margin首先,和max_indent第二。如果您不知道选择哪个值 max_indent , margin - 10通常是一个不错的选择。

关于format - 在格式模块上配置更大的列数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53593378/

相关文章:

php - 如何将秒转换为时间格式?

html - CSS 布局不带 id 但带 <li> 标签

c - 为什么这个 OCaml 程序比我的 C 程序快?

functional-programming - ocaml中的单位类型和'a之间的区别

f# - 有没有更好的方法在 F#/OCaml 中编写交换函数?

python - 如何修改数据框以便每行存储其重复行的所有数据?

c - 将输出格式化为字符串

bash - 时间命令的自定义格式

haskell - 有限双射的高效函数数据结构

list - 检查一个元素是否等于 OCaml 列表中的任何元素?