我希望能够提示用户输入(比如FilePath
(,但也希望提供一个可变/交互式字符串作为默认值,所以我可以用提示,而不是让用户键入完整路径
C:UsersJohnprojecttest
并让他们能够退格4次并输入final
以产生C:UsersJohnprojectfinal
,而不是键入整个路径。
但是,使用putStr
或System.IO.hPutStr stdout
打印默认字符串时,会将此默认值打印到终端,但不允许我更改任何默认值。例如
import System.IO
main = do
hSetBuffering stdout NoBuffering
putStr "C:\Users\John\project\test"
l <- getLine
doSomethingWith l
我怀疑Data.Text.IO
的interact
可能可以做我想做的事情,但我无法让它发挥作用。
如有任何建议,我们将不胜感激。
getLine
不提供任何行编辑功能。为此,您可以使用类似haskeline
的库,例如:
import System.Console.Haskeline
main :: IO ()
main = do
runInputT defaultSettings $ do
mInput <- getInputLineWithInitial "Enter path: "
("C:\Users\John\project\test", "")
case mInput of
Nothing -> do
outputStrLn "No entry."
Just input -> do
outputStrLn $ "Entry: " ++ show input
另一种选择是使用提供行编辑的包装器调用程序,例如rlwrap
。为了构建更复杂的全屏文本UI,还有brick
,它在Brick.Widgets.Edit
中提供了一个简单的文本编辑组件。