首页 文章

使用ghci 7.6.3,:} \ n导致“未知命令”错误

提问于
浏览
3

我有时会遇到这个错误,虽然不是所有的时间,但这让我发疯了 . 我不知道这是一个错误,还是有一些我不知道的行为或修复 .

我正在使用:{和:}输入一个多行命令,当我想结束命令时,有时候我会收到错误,如下所示:

*MyModule| :}
unknown command ':}'
use :? for help.

我认为它在97%的情况下都能正常工作,但有3%的时间我会遇到这种情况 .

据我所知,应该总是输入:}来关闭多行条目,如下所述:

http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/interactive-evaluation.html

目前,我知道在发生这种情况时唯一可以解决这种情况的方法是ctrl D,它不幸地杀死了ghci .

答:这是一个错误还是有某种原因:}会突然变成“未知的命令”?

B.如果我遇到这种情况,有没有办法在不使用ctrl D的情况下恢复?无论我尝试多少次:},一旦我进入这个状态,它总会导致“未知命令”,尽管我期望这个命令能够关闭多行输入 .

就像它在问题中所说的那样,这是Arch Linux上的GHCi,版本7.6.3 .

2 回答

  • 4

    正如我在评论中已经提到的,这种行为的原因是当按下 Ctrl-C 时GHCi没有正确地重置提示 . 问题的根源可能在于以下代码(取自 ghci-ng ):

    multiLineCmd q = do
      st <- lift getGHCiState
      let p = prompt st
      lift $ setGHCiState st{ prompt = prompt2 st }
      mb_cmd <- collectCommand q ""
      lift $ getGHCiState >>= \st' -> setGHCiState st'{ prompt = p }
      return mb_cmd
    

    (见InteractiveUI.hs line 712

    如果 collectCommand 抛出 UserInterrupt ,则重置promt的行将永远不会被执行 . 我将此代码更改为:

    multiLineCmd q = do
      st <- lift getGHCiState
      let p = prompt st
      lift $ setGHCiState st{ prompt = prompt2 st }
      mb_cmd <- collectCommand q "" `GHC.gfinally` lift (getGHCiState >>= \st' -> setGHCiState st'{ prompt = p })
      return mb_cmd
    

    哪个解决了这个问题 .

  • 4

    This is a known bug.一切正常,但ghci有时会在打印正常提示时继续打印多行提示 .

相关问题