支持ANSI转义序列光标移动

时间:2017-02-25 22:10:19

标签: clojure ansi-escape

我正在制作一个简单的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)))))

但这是一个糟糕的解决方案。它需要在使用前清除屏幕,这对于任何超出简单动画的内容都是不可接受的。

2 个答案:

答案 0 :(得分:1)

有一种更简单的方法!

有一种更简单的方法可以做到这一点。看一下 clojure-lanterna库。{

此库允许您处理屏幕上的任意位置。它可以 要么使用终端仿真器,要么可以创建基于 swing 的窗口。

使用此库的另一个优点是它还包含对该库的支持 虚拟窗口虚拟屏幕,可以使您的输出显示为 更顺畅,减少潜在的闪烁。

该库还支持ANSI颜色代码和其他一些不错的颜色 特征。

答案 1 :(得分:1)

Cursive仅实现ANSI命令的有限子集。特别是,大多数插入符号移动命令都不起作用。请随意为此提出问题,但修复它可能是低优先级,因为在REPL输出窗格中这样做非常棘手。