有没有一种简单的方法可以从GHCi中访问REPL历史记录(例如作为列表)?

时间:2015-01-20 10:56:30

标签: haskell read-eval-print-loop ghci

其他REPL e.g. Octave具有用于浏览命令历史记录的专用命令。我发现这很方便(尽管每当我使用这样的功能时我会问自己,为什么我没有在文件中首先正确定义该命令?)。

GHCi似乎没有这样的功能,我认为它可能不应该 - 这样的交互性会让像Emacs这样的控制之类的事情比现在更加麻烦。

然而,简单地获取整个历史,然后使用普通的Haskell来浏览它听起来是一项相当简单的任务。有没有在任何地方实现过的?

1 个答案:

答案 0 :(得分:2)

这可能是一种更好的方法来实现这个更加跨平台的方式,可以开发成一个很好的小包来加载.ghci文件或其他东西,但是快速而肮脏的方式使用haskeline非常简单。您只需阅读系统的ghci_history文件,我的文件位于C:/Users/bheklilr/AppData/Roaming/ghc/ghci_history,但我相信* nix系统应位于~/.ghci_history。选择适合您系统的那个。

> import System.Console.Haskeline.History
> hist <- fmap $ readHistory "path/to/ghci_history"
> putStrLn $ unlines hist

不幸的是,至少对我而言,似乎历史文件在GHCi退出之前不会更新,因此对于特定会话hist应该是相同的(假设您只有一个GHCi实例)。在我看来,这是一个非常有限的API,我认为在每个命令或至少每一对命令上转储历史记录都不会太难,但是这还没有完成。

或者,您可以使用CTRL-R和其他一些命令来搜索您的历史记录,它会更有用。它特别有用,因为它会搜索匹配的子文本。