CLisp 25:可自由控制的字符窗口

CLisp的叫法为随机访问屏幕Random Screen Access

使用screen包提供的功能,可以打开一个像Edit编辑器一样的窗口,可以指定坐标输出字符串,键盘输入时没有回显。

使用make-window打开窗口,返回一个窗口对象,最后使用close关闭窗口。通常使用with-window宏来打开窗口,可以保证窗口最终被关闭,改宏用变量*window*保存打开的窗口对象。

窗口对象可以作为输出流使用,例如(format screen:*window* “something”)

       光标的位置,就是下次输出的位置,一开始光标在(0,0)处,输出字符后自动后移,超过窗口宽度后自动换行。通过(set-window-cursor-position *window* x y)设置光标位置。通过(multiple-value-bind (x y) (window-cursor-position *window*))获取光标位置。通过(multiple-value-bind (height width) (window-size *window*))获取窗口的高度和宽度。没有函数设置窗口的大小,只能在窗口标题栏上、右键菜单、属性、布局,设置窗口大小。

       通过(window-cursor-on *window*)显示闪烁的光标,通过(window-cursor-off *window*)隐藏光标,一开始光标是隐藏的。

       字符可以显示为高亮、非高亮。通过(highlight-on *window*)切换到高亮模式,之后输出的字符都是高亮的,通过(highlight-off *window*)退出高亮模式。默认是非高亮模式,切换模式时不会改变已经输出的字符。

       (clear-window *window*) 清除整个窗口,并将光标设置到(00)位置。

       (clear-window-to-eot *window*) 清除光标后面的所有内容,半个窗口。

       (clear-window-to-eol *window*) 清除光标到行为的内容,半行。

       (delete-window-line *window*)  删除光标所在的一整行,下面所有行都往上移。

       (insert-window-line *window*)  在光标处插入一个新行,下面所有行都往下移。

       如果不停地输出字符,超过窗口大小了,又会回到第一行,覆盖以前的输出。设置光标位置时,如果超出窗口范围,不会起任何作用。

 

       前面讲的都是输出相关的,下面介绍如何从键盘读取输入。

不能使用*terminal-io*,即不能用最容易学到的读键盘的方法。要使用ext:*keyboard-input*,而且一次只能读取一个字符。例如执行(read)会出错,执行(read ext:*keyboard-input*)会出错,执行(read-line ext:*keyboard-input*)会出错,而执行(read-char ext:*keyboard-input*)才不会出错。

       ext:*keyboard-input*是一个输入流,能够字符和控制键的状态,每次返回一个sys:input-character对象。例如对象 #S(SYSTEM::INPUT-CHARACTER :CHAR #\a :BITS 0 :FONT 0 :KEY NIL)

       属性CHAR:就是输入的字符,实际使用时需要加上shift键的状态。使用函数character取出该属性。

       属性KEY:就是控制键的状态,取值controlshiftmeun(alt)win(Windows)apps(右键菜单)UPDownLeftRight等等。使用函数ext:char-key取出该属性。

       这里有个小程序,方便查看不同按键的返回值,按Escape键退出。

(defun main ()

  (screen:with-window

      (loop

        (setq ch (read-char ext:*keyboard-input*))

        (if (equal (character ch) #\Escape)

            (return))

        (format screen:*window* "~A~%" ch))))

      

       除了read-char,还有几个有用的函数。read-char-no-hand:有字符则读,无字符则返回NILclear-input:清空输入。listen:检查有没有输入。

 

       有了上面这些函数,就可以做出像EditVI一样的程序来,也可以做出字符界面的游戏。最后提一下,如果程序出错,抛出异常,会进入Debug状态,Debug信息显示在原来的DOS窗口,而DOS窗口被我们新建的窗口挡住了,你可以输入并执行指令,但是看不到,就像下盲棋一样。推荐输入(close screen:*window*)返回DOS窗口,并调试程序。如果不像调试程序,输入quitctrl+d能结束调试状态,并返回DOS窗口。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值