如何在 SBCL 中设置终端流的字符
How to set the charpos of a terminal stream in SBCL
我试图说服 SBCL,终端的字符在 read-line
后恢复为 0。
比如下面这段代码
(progn
(format *query-io* "input: ")
(force-output *query-io*)
(prog1
(read-line *query-io*)
(write (sb-impl::charpos *query-io*))))
会打印 7(或 14、21,...取决于你 运行 它的次数)尽管 read-line
charpos
之后应该返回到 0 .
谢谢
所以,事情是这样的……
简单的方法:
如果你真的想确保到达左边距,你总是可以使用 fresh-line
来做到这一点。
CHARPOS
SB-IMPL::CHARPOS
是从一个输出流的左边距开始的字符位置。它没有记录或导出,但对 ANSI 流的评论指出:
:charpos - Return current output position on the line.
当您将流混合在一起时,不是屏幕上的光标位置,并且(如您所见),它不会跟踪双向流的输入端。
它的 Gray Streams 访问器是 stream-line-column
Return the column number where the next character
will be written, or NIL if that is not meaningful for this stream.
The first column on a line is numbered 0. This function is used in
the implementation of PPRINT and the FORMAT ~T directive. For every
character output stream class that is defined, a method must be
defined for this function, although it is permissible for it to
always return NIL.
确实按照你的要求做了
如果你想用这样一种方式包装 *query-io*
,你可以为系统指定明显的输出列——例如,因为你希望另一个流(输入端的回声)发送了一个新的行——你可以把它包装在你自己的灰色流 class 中,然后你自己在内部计算那个方法“应该”做什么 return。 (基本上只是一个 defclass
,以及 make-instance :after
和 stream-line-column
的实现)
但是,我认为总的来说这不是个好主意……
为什么我认为你不应该
请记住,*query-io*
有可能从一个单独的 window/widget 绘制其输入而不是其输出出现的地方——例如,我已经看到示例,其中 CLIM 打印输出中的双向流进入上部窗格并从下面的迷你缓冲区收集输入(如许多 Internet 中继聊天程序),因此如果您的目标是任何程度的可移植性,假设您对该流的输出和用户的输入将是不安全的出现在屏幕上。
假设用户必须输入一个换行符来完成他们的输入也不是完全安全的——允许用户按下的 Return 可能不会打印换行符;例如,它可能会清除他们的输入框。例如,他们也可能通过单击“确定”按钮完成了输入。
如果您确定 *query-io*
连接到具有屏幕编辑器的终端——即像 Gnome Terminal 这样的终端,而不是 Slime 会话——您可以使用(如@coredump建议)CL-Charms https://github.com/HiTECNOLOGYs/cl-charms 或类似的东西将光标准确定位在 window.
我试图说服 SBCL,终端的字符在 read-line
后恢复为 0。
比如下面这段代码
(progn
(format *query-io* "input: ")
(force-output *query-io*)
(prog1
(read-line *query-io*)
(write (sb-impl::charpos *query-io*))))
会打印 7(或 14、21,...取决于你 运行 它的次数)尽管 read-line
charpos
之后应该返回到 0 .
谢谢
所以,事情是这样的……
简单的方法:
如果你真的想确保到达左边距,你总是可以使用 fresh-line
来做到这一点。
CHARPOS
SB-IMPL::CHARPOS
是从一个输出流的左边距开始的字符位置。它没有记录或导出,但对 ANSI 流的评论指出:
:charpos - Return current output position on the line.
当您将流混合在一起时,不是屏幕上的光标位置,并且(如您所见),它不会跟踪双向流的输入端。
它的 Gray Streams 访问器是 stream-line-column
Return the column number where the next character will be written, or NIL if that is not meaningful for this stream. The first column on a line is numbered 0. This function is used in the implementation of PPRINT and the FORMAT ~T directive. For every character output stream class that is defined, a method must be defined for this function, although it is permissible for it to always return NIL.
确实按照你的要求做了
如果你想用这样一种方式包装 *query-io*
,你可以为系统指定明显的输出列——例如,因为你希望另一个流(输入端的回声)发送了一个新的行——你可以把它包装在你自己的灰色流 class 中,然后你自己在内部计算那个方法“应该”做什么 return。 (基本上只是一个 defclass
,以及 make-instance :after
和 stream-line-column
的实现)
但是,我认为总的来说这不是个好主意……
为什么我认为你不应该
请记住,*query-io*
有可能从一个单独的 window/widget 绘制其输入而不是其输出出现的地方——例如,我已经看到示例,其中 CLIM 打印输出中的双向流进入上部窗格并从下面的迷你缓冲区收集输入(如许多 Internet 中继聊天程序),因此如果您的目标是任何程度的可移植性,假设您对该流的输出和用户的输入将是不安全的出现在屏幕上。
假设用户必须输入一个换行符来完成他们的输入也不是完全安全的——允许用户按下的 Return 可能不会打印换行符;例如,它可能会清除他们的输入框。例如,他们也可能通过单击“确定”按钮完成了输入。
如果您确定 *query-io*
连接到具有屏幕编辑器的终端——即像 Gnome Terminal 这样的终端,而不是 Slime 会话——您可以使用(如@coredump建议)CL-Charms https://github.com/HiTECNOLOGYs/cl-charms 或类似的东西将光标准确定位在 window.