OCaml格式:如何缩进自动换行符

时间:2018-01-29 18:24:35

标签: formatting ocaml

我正在尝试使用OCaml的Format模块来打印一些结构。根据{{​​3}},我只需要使用框并指定适合拥有新行的断点。但是,我无法正确缩进。

例如:

# open Format;;
# fprintf std_formatter "bar =  foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk@])";;
bar =  foo(
lkjlkjlkj: lkjlkjlkj,
 lkjlkjlkjlj: lkjlkjlkjlkj,
 lkjj: lkjlk)
- : unit = ()

然而,我期待得到:

bar =  foo(lkjlkjlkj: lkjlkjlkj,
            lkjlkjlkjlj: lkjlkjlkjlkj,
            lkjj: lkjlk)

如何让它正确地缩进参数?

2 个答案:

答案 0 :(得分:2)

我无法复制。我明白了:

# Format.fprintf Format.std_formatter "bar =  foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])";;
bar =  foo(lkjlkjlkj: lkjlkjlkj,
            lkjlkjlkjlj: lkjlkjlkjlkj,
            lkjj: lkjlk,
            aze: azeioajze)- : unit = ()

预期。打开一个框不会导致剪切,所以如果你想在foo(之后换行,你应该写@[<hv>@,

答案 1 :(得分:1)

如果我没有弄错,问题的根源是最大缩进限制;如果您的代码以Format.set_margin 20开头,那么它的副作用也是将最大缩进限制设置为10.

这意味着应该使用大于10的缩进打开的框被推到一个新行,并以0缩进打开。

换句话说,

 Format.set_margin 20;;
 Format.printf "bar =  foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])@.";;

的产率:

bar =  foo(
lkjlkjlkj: lkjlkjlkj,
lkjlkjlkjlj: lkjlkjlkjlkj,
lkjj: lkjlk)

设置边距后将最大缩进限制设置为11可以部分解决问题:

 Format.set_margin 20; Format.set_max_indent 11; 
 Format.printf "bar =  foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])@.";;

产量

bar =  foo(lkjlkjlkj: lkjlkjlkj,
           lkjlkjlkjlj: lkjlkjlkjlkj,
           lkjj: lkjlk)

换句话说,hv框被打开而不需要换行;但压痕没有增加。

将max_indent设置为12到18之间的值

 Format.set_margin 20; Format.set_max_indent 12; 
 Format.printf "bar =  foo(@[<hv 1>lkjlkjlkj: lkjlkjlkj,@ lkjlkjlkjlj: lkjlkjlkjlkj,@ lkjj: lkjlk,@ aze: azeioajze@])@.";;

完全解决了这个问题:

bar = foo(lkjlkjlkj: lkjlkjlkj,
           lkjlkjlkjlj: lkjlkjlkjlkj,
           lkjj: lkjlk)

此处的外卖消息可能是您应该同时设置保证金和最大缩进限制(以及顺序)。