我希望能够提示用户输入(比如 FilePath
),但也希望提供一个 mutable/interactive 字符串作为默认值,所以改为让用户键入完整路径,我可以提示:
C:\Users\John\project\test
并让他们能够退格 4 次并输入 final
以生成 C:\Users\John\project\final
,而不是键入整个路径。
然而,使用 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
中提供了一个简单的文本编辑组件。
关于haskell - Haskell 终端输入中的可编辑默认字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71851486/