【问题标题】:Is there a simple way to access the REPL history (e.g. as a list) from within GHCi?有没有一种简单的方法可以从 GHCi 中访问 REPL 历史记录(例如作为列表)?
【发布时间】:2015-03-18 13:50:05
【问题描述】:

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

GHCi 似乎没有这样的功能,我认为它可能不应该 - 这样的交互性会使 Emacs 控制之类的尝试变得比现在更麻烦。

然而,简单地获取整个历史,然后使用普通的 Haskell 浏览它,这听起来是一项相当微不足道的任务。类似的东西已经在任何地方实施了吗?

【问题讨论】:

  • 一个相关的问题是如何将:browse 或tab-auto-completion 等命令的输出放入可用的Haskell 列表中。
  • 这是关于将history :: IO [String] 添加到 GHCi 的问题,对吧? AFAIK,没有这样的功能。对于:browse,不知Distribution.HaskellSuite.Modules能不能做到。
  • 是的,这正是我要找的。像searchHistory :: (String -> Bool) -> IO () 这样的东西可能会更有用(在匹配命令“forward”之前添加,这样就可以使用向上箭头访问和执行它),尽管这个想法看起来有点程序化/破坏性。
  • @leftaroundabout:你知道有反向搜索吗? Ctrl+R,就像在 bash 中一样。这是你要找的吗?
  • @Zeta:哇,就这么简单??好吧,我应该尝试过自己不应该......想知道,我应该关闭这个问题,还是改写它以专注于字符串阅读历史或其他内容,或者你会发布ctrl+r作为答案吗?

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


【解决方案1】:

可能有更好的方法可以做到这一点,它可以开发成一个不错的小包以加载到 .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 和其他一些命令来搜索您的历史记录,这样会更有用。它特别有用,因为它会搜索匹配的潜台词。

【讨论】:

  • 我仍然会接受这个作为我所说的问题的答案(不过,正如你自己所说,ctrl+r 是实际 problem 的更好解决方案手头)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2017-07-05
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多