支持 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" 的输出都是错误的:
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)))))
但这是一个糟糕的解决方案。它需要在使用前清除屏幕,这对于任何超出简单动画的内容都是不可接受的。
有更简单的方法!
有一种更简单的方法可以做到这一点。看一下
clojure-lanterna 图书馆。
此库将允许您在屏幕上的任意位置寻址。它可以
要么使用终端模拟器,要么它可以创建基于 window 的 swing。
使用这个库的另一个好处是它还支持
虚拟 window 或 虚拟屏幕,这可以使您的输出看起来像
更平滑并减少潜在的闪烁。
该库还支持 ANSI 颜色代码和其他一些不错的代码
特征。
Cursive 仅实现有限的 ANSI 命令子集。特别是,大多数插入符号移动命令不起作用。请随意为此提交问题,但修复它的优先级可能较低,因为在 REPL 输出窗格中执行此操作非常棘手。
我正在制作一个简单的 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" 的输出都是错误的:
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)))))
但这是一个糟糕的解决方案。它需要在使用前清除屏幕,这对于任何超出简单动画的内容都是不可接受的。
有更简单的方法!
有一种更简单的方法可以做到这一点。看一下 clojure-lanterna 图书馆。
此库将允许您在屏幕上的任意位置寻址。它可以 要么使用终端模拟器,要么它可以创建基于 window 的 swing。
使用这个库的另一个好处是它还支持 虚拟 window 或 虚拟屏幕,这可以使您的输出看起来像 更平滑并减少潜在的闪烁。
该库还支持 ANSI 颜色代码和其他一些不错的代码 特征。
Cursive 仅实现有限的 ANSI 命令子集。特别是,大多数插入符号移动命令不起作用。请随意为此提交问题,但修复它的优先级可能较低,因为在 REPL 输出窗格中执行此操作非常棘手。