编辑 4:事实证明,这实际上只是一般 TTY 输入的限制;导致问题的 OCaml、Coq 或 Emacs 没有任何具体内容。
我正在使用 Emacs 中的 Proof General 开发 Coq 程序,但我发现了一个输入太长的错误。如果要通过 Proof General 提交的区域coqtop
包含超过 1023 个字符,Proof General(虽然不是 Emacs)在等待响应时会挂起,并且*coq*
缓冲区包含一个额外^G
字符,用于超过 1023 个字符。例如,如果一个 1025 个字符区域被发送到coqtop
,那么*coq*
缓冲区将以两个额外的字符结束^G^G
。我无法继续文件中的这一点,我必须终止coqtop
进程(使用终端C-c C-x或kill
/killall
从终端)。
关于这种限制的某些东西来自coqtop
其本身。如果生成一个 1024 字符或更长的字符串并将其通过管道输入,例如通过运行
perl -e 'print ("Eval simpl in " . (" " x 1024) . "1.\n")' | coqtop
然后一切正常。(同样,coqc
也可以正常工作。) 但是,如果我coqtop
在终端中运行,我不能在一行上输入超过 1024 个字符,包括结束返回字符。因此,输入 1023 个字符的行然后按回车即可;但是在输入 1024 个字符后,按任何键,包括返回(但不包括删除等),只会发出哔哔声。事实证明ocaml
(OCaml 顶层)具有相同的行为:
perl -e 'print ((" " x 1024) . "1;;")' | ocaml
ocaml
工作正常,但如果从终端运行,我不能在一行上输入超过 1024 个字符。由于我的理解是coqtop
依赖于 OCaml 顶层(在运行时更明显coqtop -byte
),我想这是一个相关的限制。
相关软件版本为:
- 来自Homebrew的OCaml 3.12.1 ;
- 来自Homebrew的Coq 8.3pl3(和 8.3pl2);
- 证明总则4.1;
- 从Emacs 为 Mac OS X构建GNU Emacs 24.1.1 ;和
- Mac OS X 10.6.7。
我的问题是:
- 怎么样
ocaml
并且coqtop
正在执行这个字符限制?为什么只用于来自终端或 Emacs 的输入,而不是来自管道或文件的输入? - 为什么Proof General(明显)不知道这个限制会导致挂起错误和神秘
^G
的s? - 我该如何解决这个限制?我的最终目标是在 Proof General/Emacs 中使用 Coq,因此可以避开潜在问题的解决方法。
编辑 3:在发现 Ocaml 顶层也存在 1024 个字符的输入限制(我想这是相关的)后,我添加了该信息并删除了原始问题描述,因为它已被完全掩盖和取代。(如有必要,请参阅编辑历史)。