试图在线打印,让我额外“![K”某处

时间:2015-01-17 13:35:43

标签: bash haskell

问题

我已经读过你可以使用\033[K删除到bash行的末尾,并\r返回到行的开头。所以你可以将它们组合起来用另一条线覆盖一条线。

我尝试了不同的配置,几乎任何安排,甚至。

\r\033[K\rString\r

总会有来自某个地方的额外![K

实际的Haskell脚本详细信息

我现在使用的实际脚本是:

putStrOver :: String -> IO ()
putStrOver str = putStr $ "\033[K" ++ str ++ "\r"

用作:

forM [1..n] $ \i -> do
    -- calc percentage
    putStrOver $ "Generating: " ++ show perc ++ "%"

它让我得到的是:

Image showing an extra "![K" is prepended on the printed screen

试图找出问题

所以从某个地方生成的这个烦人的额外![K部分总是如此。我首先想到它可能是来自其他地方的!,所以我采用了全新的GHCi环境并测试了该功能:

mapM_ (\i -> putStrOver . show $ i) [1..]

仍然会打印![K

Example of the problem with the GHCi script

我在Mac OS X Yosemite上使用终端bash,如果这对任何事情都有用。

问题

发生了什么事?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

Haskell与我所知道的(或者至少现在可以想到的)所有其他编程语言不同,并不将\033解释为八进制文字而是十进制文字。这解释了为什么你得到!,因为!在ASCII中是33。

解决方案是将\033替换为haskell代码中的\o33(或\x1b\27)。或者,也许更狡猾,\ESC。它们都意味着相同的东西,所以选择你认为最具可读性的那个。