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

lef*_*out 8 haskell ghci read-eval-print-loop

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

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

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

bhe*_*ilr 3

可能有更好的方法来做到这一点,即更跨平台的方法,可以开发成一个漂亮的小包来加载到 .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
Run Code Online (Sandbox Code Playgroud)

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

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