如何使用 Haskelline 获取命令历史记录?

问题描述 投票:0回答:1

我似乎不知道如何让 Haskeline 允许用户使用箭头键浏览命令历史记录。

我阅读了Hackage并尝试使用Settings {complete =completeFilename,historyFile=Nothing,autoAddHistory=True}就像他们给出的默认值一样,但这不起作用,我尝试给historyFile一个值,然后它只会保存我输入的第一个命令并且只有在程序退出之后,我尝试过的所有小调整都没有帮助。如果相关,我可以提供其余的代码。

haskell read-eval-print-loop haskeline
1个回答
0
投票

不是完整的答案,但您可以测试以下最小示例吗:

import System.Console.Haskeline

main :: IO ()
main = runInputT settings loop
  where

    loop = do
      getInputLine "> "
      loop

    settings = Settings
      { complete = completeFilename
      , historyFile = Just ".foo_history"
      , autoAddHistory = True }

您应该能够在提示符下输入多个输入行,并使用箭头键滚动浏览历史记录:

$ runghc Line.hs
> foo
> bar
> baz
> [use arrow keys here]

如果输入一些行后按 Ctrl-C 退出,它们应该全部出现在“.foo_history”文件中:

> [Ctrl-C]

$ cat .foo_history 
baz
bar
foo

如果箭头键不起作用,请尝试 Emacs 兼容的击键(Ctrl-P 和 Ctrl-N 用于上一个和下一个)。

基于此:

  • 如果这个最小的示例也无法正常工作,那么问题很可能是 Haskeline 无法与您的“终端”一起正常工作。 (如果箭头键和 Ctrl-P/Ctrl-N 都不起作用,那么它可能认为您根本没有使用终端;如果箭头键不起作用但 Ctrl-P/Ctrl-N 起作用,那么它认为您正在使用终端,但它错误地识别了终端的类型)。如果是这种情况,您能否提供有关您正在运行的架构(Linux、Windows 等)以及如何调用该程序(在常规终端中、通过 IDE 控制台或其他方式)的更多详细信息).
  • 如果这个最小的示例工作正常,但你的程序却不能,那么你的程序可能有问题。在这种情况下,有一个最小的、独立的、可运行的示例来说明问题会很有帮助。一些可能需要检查的事情是:您是否使用任何可能干扰 Haskeline 自动历史记录处理的历史相关函数(例如,
    putHistory
    modifyHistory
    )?如果不是,您的程序是否可能尝试通过 Haskeline 的
    getInputLine
    以外的函数读取标准输入,并且可能“窃取”一些应由 Haskeline 处理的输入(例如,如果您打算从一个文件,但不小心运行了
    getLine
    而不是
    hGetLine
    )?
© www.soinside.com 2019 - 2024. All rights reserved.