Common Lisp 如何表示字符键的控制修饰符?

问题描述 投票:0回答:1

根据 CLTL2,所有处理键修饰符的函数似乎都从标准中删除了。 SBCL 好像没有这些。

带有修饰符的字符的打印表示是什么?如果 Common Lisp 中有这样的表示法,我如何在字符表示法中指定它们?

换句话说,Common Lisp 是否有一种符号来读取带有修饰符的字符和字符序列,类似于 Emacs 中的操作:?\C-q (Ctrl-q) 或 ?\M-\S-o (Alt-Shift-o) .

如果我想实现自己的功能,是否建议实现从标准中删除的功能,或者是否有更广泛使用的功能?作为一个附带问题:是否知道为什么这些函数从标准中删除?

common-lisp ansi-common-lisp
1个回答
1
投票

想必您正在谈论字符控制位功能此处描述

HyperSpec 中的相关问题撰写仅表示:

Common LISP 的早期版本将 FONT 和 BITS 合并为字符对象的属性。 这些和其他支持的属性被视为实现定义的属性,如果实现支持,则会影响所选函数的操作。

无论如何,标准并不禁止实现做这样的事情:

还允许使用其他实现定义的字符属性,例如,具有相同代码的两个字符可能会以其他实现定义的方式有所不同。

带有修饰符的字符没有标准的打印表示,因为 Common Lisp 实现不需要支持这些“字符”。

最好不要将它们视为字符,而是将其视为按键。通常,按下带有修饰符的键是为了发出某种信号,而不是生成一个字符。处理此问题的常用方法是将终端或控制台置于原始模式,以便程序在获取输入之前不会等待用户按 Enter。这需要与环境进行交互,您可以通过在 Linux 中操作

termios
struct 在 C 语言中完成此操作。 这是一个关于如何使其正常工作的教程

您可以通过 Lisp 与 C 代码交互来执行此操作。 SBCL 有一些 Posix 扩展,允许您操作

termios
结构,这样您就不需要通过 C。或者您可以使用为您执行此操作的库,例如您可以使用 trivial-raw-io终端按键

© www.soinside.com 2019 - 2024. All rights reserved.