2013-01-15 2 views
2

OCaml의 포맷터 (형식 형식)가 줄 바꿈 (특히 print_break (@)에서 오는 태그)을 삽입하는 것을 피하는 교묘 한 해킹이 있습니까?Ocaml의 Format pretty-printer에서 선택적 줄 바꿈을 피하는 방법은 무엇입니까?

메시지가 많이 나오는 소프트웨어가 다소 있습니다. grepsed과 같은 유닉스 도구를 사용하고 싶습니다. 그러나 삽입 된 줄 바꿈은 메시지가 포맷터에 의해 분리 될 때 작동하지 못하도록합니다. 그리고 코드에 너무 많은 서식자가있어 모두를 개별적으로 추적하고 set_margin을 통해 "여백"속성을 변경합니다.

그런 영리한 해킹은 기본 마진이 9999와 같은 것으로 설정 될 수있는 단일 중심점이있는 경우 다른 모듈 내에 Format을 래핑하거나 결국 OCaml 자체를 다시 컴파일하는 것을 포함 할 수 있습니다. Format.set_margin 메인이 호출 된 후에도, 프로그램에 의해 생성 된 포매터에는 적용되지 않는 것처럼 보입니다. 대신 뉴 라인의 공백을 인쇄합니다 성공하면

답변

1

당신은

let out,flush,_,spaces = get_all_formatter_output_functions() 
in set_all_formatter_output_functions out flush (fun() -> out " " 0 1) spaces 

을 시도 할 수 있습니다. 당신은 잔인한 솔루션을 두려워하지 않는 경우

+0

이 솔루션은'Format.set_margin'을 사용하는 것과 동일한 이슈가 있습니다 : 그것은 단지'Format.std_formatter'에만 적용되며, ** 모든 포맷에 대해'Format.pp_set_all_formatter_output_functions'을 사용해야합니다 ** 프로그램이 사용하는 포맷터. – Virgile

0

:

find . -type f -regex ".+\\.ml" -exec sed -i 's/Format/MyFormat/g' {} \; 

및 myFormat 파일

include Format 
let formatter_of_out_channel c = 
    let f = formatter_of_out_channel c in 
    pp_set_margin f 9999; 
    f 

될 수 있으며 formatter_of_buffermake_formatter을 위해 같은 일을 추가 할 수 있습니다.

관련 문제