支持 ANSI 转义序列光标移动

Support for ANSI escape sequence cursor moving

我正在制作一个简单的 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) 时,我尝试过的每个 "console" 的输出都是错误的:

我做错了什么吗?有没有办法让它在标准 Windows 10 命令提示符下工作?

我写这个是为了同时填补空白:

(defn move-cursor-to [x y]
  (let [r #(apply str (repeat % %2))]
    (print (str (r y \newline)
                (r x \space)))))

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

有更简单的方法!

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

此库将允许您在屏幕上的任意位置寻址。它可以 要么使用终端模拟器,要么它可以创建基于 window 的 swing

使用这个库的另一个好处是它还支持 虚拟 window虚拟屏幕,这可以使您的输出看起来像 更平滑并减少潜在的闪烁。

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

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