我已经读过你可以使用\033[K
删除到bash行的末尾,并\r
返回到行的开头。所以你可以将它们组合起来用另一条线覆盖一条线。
我尝试了不同的配置,几乎任何安排,甚至。
\r\033[K\rString\r
总会有来自某个地方的额外![K
。
我现在使用的实际脚本是:
putStrOver :: String -> IO ()
putStrOver str = putStr $ "\033[K" ++ str ++ "\r"
用作:
forM [1..n] $ \i -> do
-- calc percentage
putStrOver $ "Generating: " ++ show perc ++ "%"
它让我得到的是:
所以从某个地方生成的这个烦人的额外![K
部分总是如此。我首先想到它可能是来自其他地方的!
,所以我采用了全新的GHCi环境并测试了该功能:
mapM_ (\i -> putStrOver . show $ i) [1..]
仍然会打印![K
:
我在Mac OS X Yosemite上使用终端bash,如果这对任何事情都有用。
发生了什么事?我该如何解决这个问题?
答案 0 :(得分:9)
Haskell与我所知道的(或者至少现在可以想到的)所有其他编程语言不同,并不将\033
解释为八进制文字而是十进制文字。这解释了为什么你得到!
,因为!
在ASCII中是33。
解决方案是将\033
替换为haskell代码中的\o33
(或\x1b
或\27
)。或者,也许更狡猾,\ESC
。它们都意味着相同的东西,所以选择你认为最具可读性的那个。