在重构大型项目时,我喜欢让类型检查器通过引入所需的更改来为我完成工作,然后跟踪产生的类型错误。
但是,由于相关类型错误在输出之前Failed, modules loaded:
显示在 GHCi 中,因此具有足够模块的项目可能会导致相关错误滚动到即使是大尺寸终端的顶部。
是否有一个标志或选项可以使 GHCi 抑制此输出,或者至少重新排序以使错误最后出现?
您可以尝试使用 GHC 编译文件,而不是在 GHCi 中加载它们。这样,它不会尝试加载文件,而只会编译它们,因此只显示编译错误和警告。
所以,而不是这个:
$ ghci -Wall -Werror
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l foo.hs
...只需这样做:
$ ghc -Wall -Werror foo.hs
顺便说一句,如果您在 UNIX/Linux 中使用终端,您可以更轻松地更改字体大小、水平调整终端大小(在 Windows 上默认运行终端时无法做到这一点)、增加回滚,否则会增加您可以看到的行数:)
我非常绝望,以至于我在代码中四处寻找:
modulesLoadedMsg :: SuccessFlag -> [GHC.ModSummary] -> InputT GHCi ()
modulesLoadedMsg ok mods = do
dflags <- getDynFlags
unqual <- GHC.getPrintUnqual
let mod_name mod = do
is_interpreted <- GHC.isModuleInterpreted mod
return $ if is_interpreted
then ppr (GHC.ms_mod mod)
else ppr (GHC.ms_mod mod)
<> text " ("
<> text (normalise $ msObjFilePath mod)
<> text ")" -- fix #9887
mod_names <- mapM mod_name mods
let mod_commas
| null mods = text "none."
| otherwise = hsep (punctuate comma mod_names) <> text "."
status = case ok of
Failed -> text "Failed"
Succeeded -> text "Ok"
msg = status <> text ", modules loaded:" <+> mod_commas
when (verbosity dflags > 0) $
liftIO $ putStrLn $ showSDocForUser dflags unqual msg
看起来 0 的详细程度将其关闭。您可以设置:
$ ghci -v0
或与阴谋集团:
$ cabal repl --ghc-options="-v0"
或堆栈:
$ stack repl --ghci-options="-v0"
解决方法是一个好主意,sed
除了sed
它还接收 Ctrl+c 时,会破坏管道。这是解决该问题的变体:
cabal new-repl cabal-install | (trap '' SIGINT; sed -e '/Failed, modules loaded.*/d')
(替换cabal new-repl
为您最喜欢的 GHCi 命令。)