在 haskell stdin 上处理箭头键 ANSI 转义序列

Process arrow key ANSI escape sequences on haskell stdin

我正在尝试处理箭头键 ANSI 转义序列,即

up - "3[A"
down - "3[B"
left - "3[D"
right - "3[C"

在我的程序中,所以当我按下 up/down/left/right 箭头键时,它不必看起来像这样:

% stack runghc test.hs
Input a name?
^[[A^[[B^[[C^[[D^

在我的标准输入上,但我希望这些键被抑制或更好, 让他们真正工作(即移动光标 left/right)。我的代码如下:

main = do putStrLn "Input a name?"  
          name <- getLine  
          putStrLn $ ("His name is " ++ name)

如有任何帮助,我们将不胜感激。提前致谢。

获得类似 readline 的功能的最简单方法就是使用 readline。对于大多数简单的用例,rlwrap 就足够了,如 One REPL to bind them all?. If you need to do fancier integrations, you can use the readline 包中所述。

由于某些 errors and decided to use the haskeline 库,我在安装 readline 库时遇到了问题,这是一个更便携的纯 haskell 替代品。

使用它的语法并修改之前的代码,我得到:

main :: IO ()
main = do putStrLn "Input a name?"
          runInputT defaultSettings insertion
  where
      insertion :: InputT IO ()
      insertion = do
          minput <- getInputLine ""
          case minput of
              Nothing -> return ()
              Just input -> do outputStrLn $ "His name is " ++ input

这解决了问题,因为我现在可以使用箭头键自由移动光标,而不必看到任何尾随的 ANSI 转义序列,如下所示: