如何在SBCL中设置终端流的charpos

时间:2016-11-07 04:51:10

标签: common-lisp 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*))))
尽管事后read-line charpos应该回到0,

会打印7(或14,21,......取决于你运行它的次数)。

由于

1 个答案:

答案 0 :(得分:1)

所以,这就是......

简单方法: 如果您确实希望确保达到左边距,则可以始终使用fresh-line来执行此操作。

CHARPOS

SB-IMPL::CHARPOS是从一个输出流的左边距开始的字符位置。它没有记录或导出,但ANSI流的评论指出:

  :charpos           - Return current output position on the line.

当您将流混合在一起时,屏幕上的光标位置,并且(正如您已发现的那样),它不会跟踪双向流的输入端。

其Gray Streams访问者为stream-line-column

  

返回下一个字符的列号         将写入,如果对此流没有意义,则为NIL。         一行中的第一列编号为0.此函数用于         PPRINT和FORMAT~T指令的实现。每一个         定义了字符输出流类,方法必须是         为此功能定义的,尽管它是允许的         总是返回NIL。

实际上做你要求的事情

如果你想以这样的方式包装*query-io*,你可以为系统指定明显的输出列 - 例如,因为你期望另一个流(输入端的回声)已发送一个新的行 - 你可以将它包装在你自己的Gray流类中,然后对你应该返回的方法进行自己的内部计算。 (基本上只是一个defclass,以及make-instance :afterstream-line-column的实现

但是,我认为这不是一个好主意......

为什么我认为你不应该

请注意,*query-io*可以从单独的窗口/窗口小部件中绘制输入,而不是输出显示的位置 - 例如,我已经看过CLIM中双向流的示例打印输出到上面的窗格并从下面的迷你缓冲区收集输入(像许多互联网中继聊天程序一样),所以如果您的目标是任何程度的可移植性,那么假设您输出到那个是不安全的流和用户的输入将出现在屏幕上。

假设用户必须输入换行符以完成输入也不完全安全 - 允许用户按下的 Return 可能无法打印换行;例如,它可能会清除他们的输入框。例如,他们也可能通过单击“确定”按钮完成输入。

如果您确定*query-io*已连接到具有屏幕编辑器的终端 - 即像Gnome终端这样的终端而不是,例如,Slime会话 - 您可以使用(作为@coredump建议)CL-Charms https://github.com/HiTECNOLOGYs/cl-charms或类似的东西,准确地将光标定位在窗口内。