支持 ANSI 转义序列光标移动

致癌物质

我正在制作一个简单的 ASCII 动画,我需要能够将光标放置在控制台屏幕中的任意点。

在搜索时,我发现这个博客表明可以通过以下方式实现:

(print (str (char 27) "[2J")) ; clear screen
(print (str (char 27) "[;H")) ; move cursor to the top left corner of the screen

,它使用 ANSI 转义序列。

第一行按预期工作,但不幸的是,我找不到允许第二行移动光标的控制台。

查看了 ANSI 转义序列是如何工作的之后,我编写了这个函数来简化它的使用:

(defn move-cursor-to [x y]
  (print (str (char 27) "[" y ";" x "H")))

但是当我运行时(move-cursor-to 10 10),我尝试过的每个“控制台”的输出都是错误的:

  • IntelliJ/Cursive 的 REPL 完全忽略了它;什么都不打印。

  • IntelliJ 的终端将转义字符打印为 a ?,并逐字打印其余的 ( ?[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)))))

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

蒂姆X

有更简单的方法!

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

该库将允许您在屏幕上寻址任意位置。它可以使用终端模拟器,也可以创建一个基于摆动的窗口。

使用这个库的另一个好处是它还包含对虚拟窗口虚拟屏幕的支持,这可以使您的输出看起来更流畅并减少潜在的闪烁。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章