我正在制作一个简单的ASCII动画,我需要能够将光标放在控制台屏幕的任意位置。
在搜索时,我发现this blog表明可以通过以下方式实现:
(print (str (char 27) "[2J")) ; clear screen
(print (str (char 27) "[;H")) ; move cursor to the top left corner of the screen
,它使用ANSI转义序列。
第一行按预期工作,但遗憾的是,我还没有找到允许第二行移动光标的控制台。
在looking up how ANSI escape sequences work之后,我写了这个功能以便于它的使用:
(defn move-cursor-to [x y]
(print (str (char 27) "[" y ";" x "H")))
但是当我运行(move-cursor-to 10 10)
时,每个"控制台"的输出都是错误的。我试过了:
IntelliJ / Cursive的REPL完全忽略了它;什么都不打印。
IntelliJ的终端将转义字符打印为?
,并按字面打印其余字符(?[10;10H
)
Window 10的命令提示符打印类似于IntelliJ的终端,但它打印的?
在一个框内。
我做错了吗?有没有办法让它在标准的Windows 10命令提示符下工作?
我写这篇文章是为了填补空白:
(defn move-cursor-to [x y]
(let [r #(apply str (repeat % %2))]
(print (str (r y \newline)
(r x \space)))))
但这是一个糟糕的解决方案。它需要在使用前清除屏幕,这对于任何超出简单动画的内容都是不可接受的。
答案 0 :(得分:1)
有一种更简单的方法可以做到这一点。看一下 clojure-lanterna库。{
此库允许您处理屏幕上的任意位置。它可以 要么使用终端仿真器,要么可以创建基于 swing 的窗口。
使用此库的另一个优点是它还包含对该库的支持 虚拟窗口或虚拟屏幕,可以使您的输出显示为 更顺畅,减少潜在的闪烁。
该库还支持ANSI颜色代码和其他一些不错的颜色 特征。
答案 1 :(得分:1)
Cursive仅实现ANSI命令的有限子集。特别是,大多数插入符号移动命令都不起作用。请随意为此提出问题,但修复它可能是低优先级,因为在REPL输出窗格中这样做非常棘手。