根据 CLTL2,所有处理键修饰符的函数似乎都从标准中删除了。 SBCL 好像没有这些。
带有修饰符的字符的打印表示是什么?如果 Common Lisp 中有这样的表示法,我如何在字符表示法中指定它们?
换句话说,Common Lisp 是否有一种符号来读取带有修饰符的字符和字符序列,类似于 Emacs 中的操作:?\C-q (Ctrl-q) 或 ?\M-\S-o (Alt-Shift-o) .
如果我想实现自己的功能,是否建议实现从标准中删除的功能,或者是否有更广泛使用的功能?作为一个附带问题:是否知道为什么这些函数从标准中删除?
想必您正在谈论字符控制位功能此处描述。
HyperSpec 中的相关问题撰写仅表示:
Common LISP 的早期版本将 FONT 和 BITS 合并为字符对象的属性。 这些和其他支持的属性被视为实现定义的属性,如果实现支持,则会影响所选函数的操作。
无论如何,标准并不禁止实现做这样的事情:
还允许使用其他实现定义的字符属性,例如,具有相同代码的两个字符可能会以其他实现定义的方式有所不同。
带有修饰符的字符没有标准的打印表示,因为 Common Lisp 实现不需要支持这些“字符”。
最好不要将它们视为字符,而是将其视为按键。通常,按下带有修饰符的键是为了发出某种信号,而不是生成一个字符。处理此问题的常用方法是将终端或控制台置于原始模式,以便程序在获取输入之前不会等待用户按 Enter。这需要与环境进行交互,您可以通过在 Linux 中操作
termios
struct 在 C 语言中完成此操作。 这是一个关于如何使其正常工作的教程。
您可以通过 Lisp 与 C 代码交互来执行此操作。 SBCL 有一些 Posix 扩展,允许您操作
termios
结构,这样您就不需要通过 C。或者您可以使用为您执行此操作的库,例如您可以使用 trivial-raw-io或终端按键。