20.6 影响输出的变量

Variable: standard-output

该变量的值为默认输出流——即当 stream 参数为 nil 时,打印函数所使用的输出流。 默认值为 t,表示在回显区(echo area)中显示。

Variable: print-quoted

若该变量值非 nil,则表示使用简化的读取器语法(reader syntax)打印带引号的形式,例如 (quote foo) 会打印为 'foo,而 (function foo) 会打印为 #'foo。默认值为 t

Variable: print-escape-newlines

若该变量值非 nil,则字符串中的换行符会被打印为 ‘\n’,换页符会被打印为 ‘\f’。 默认情况下,这些字符会被打印为实际的换行符和换页符。

该变量会影响带引号打印的函数 prin1print,但不会影响 princ。以下是使用 prin1 的示例:

(prin1 "a\nb")
     ⊣ "a
     ⊣ b"
     ⇒ "a
b"

(let ((print-escape-newlines t))
  (prin1 "a\nb"))
     ⊣ "a\nb"
     ⇒ "a
b"

在第二个表达式中,prin1 调用期间 print-escape-newlines 的局部绑定生效,但在打印结果时不生效。

Variable: print-escape-control-characters

若该变量值非 nil,则带引号打印的函数 prin1print 会将字符串中的控制字符打印为反斜杠序列。 若该变量与 print-escape-newlines 均非 nil,则后者对换行符和换页符优先生效。

Variable: print-escape-nonascii

若该变量值非 nil,则带引号打印的函数 prin1print 会将字符串中的单字节非 ASCII 字符 无条件打印为反斜杠序列。

当输出流为多字节缓冲区或指向多字节缓冲区的标记时,无论该变量取值如何,上述函数都会将单字节非 ASCII 字符 打印为反斜杠序列。

Variable: print-escape-multibyte

若该变量值非 nil,则带引号打印的函数 prin1print 会将字符串中的多字节非 ASCII 字符 无条件打印为反斜杠序列。

当输出流为单字节缓冲区或指向单字节缓冲区的标记时,无论该变量取值如何,上述函数都会将多字节非 ASCII 字符 打印为反斜杠序列。

Variable: print-charset-text-property

该变量控制打印字符串时 ‘charset‘ 文本属性的输出行为。其取值应为 niltdefault

若取值为 nil,则从不打印 charset 文本属性;若为 t,则始终打印该属性。

若取值为 default,则仅当存在 “非预期(unexpected)” 的 charset 属性时才打印该属性。对于 ASCII 字符,所有字符集均被视为 “预期的(expected)”;其他情况下,字符的预期 charset 属性由 char-charset 函数给出。

Variable: print-length

该变量的值为打印任意列表、向量或布尔向量时的最大元素数量。若待打印对象的元素数量超过该值,则会使用省略号缩写输出。

若取值为 nil(默认值),则无元素数量限制。

(setq print-length 2)
     ⇒ 2
(print '(1 2 3 4 5))
     ⊣ (1 2 ...)
     ⇒ (1 2 ...)
Variable: print-level

该变量的值为打印时括号和方括号的最大嵌套深度。任何嵌套深度超过该限制的列表或向量都会使用省略号缩写输出。 取值为 nil(默认值)时表示无嵌套深度限制。

User Option: eval-expression-print-length
User Option: eval-expression-print-level

这两个变量分别为 eval-expression 函数所使用的 print-lengthprint-level 值, 因此也间接作用于许多交互式求值命令(see Evaluating Emacs Lisp Expressions in The GNU Emacs Manual)。

以下变量用于检测并报告循环结构和共享结构:

Variable: print-circle

若取值非 nil,则该变量启用打印时对循环结构和共享结构的检测功能。See 循环对象的读取语法

Variable: print-unreadable-function

默认情况下,Emacs 会将不可读对象打印为 ‘#<...>’。例如:

(prin1-to-string (make-marker))
     ⇒ "#<marker in no buffer>"

若该变量值非 nil,则其应为一个函数,用于处理这些不可读对象的打印逻辑。该函数会接收两个参数:待打印对象,以及 打印函数使用的 noescape 标志(see 输出函数)。

该函数的返回值可以是:nil(按默认方式打印对象)、字符串(直接打印该字符串),或其他任意对象(不打印该对象)。例如:

(let ((print-unreadable-function
       (lambda (object escape) "hello")))
  (prin1-to-string (make-marker)))
     ⇒ "hello"
Variable: print-gensym

若取值非 nil,则该变量启用打印时对未注册符号(see 创建与编入符号)的检测功能。启用该功能后, 未注册符号会以 ‘#:’ 为前缀打印,该前缀会告知 Lisp 读取器生成一个未注册符号。

Variable: print-continuous-numbering

若取值非 nil,则表示在多次打印调用间使用连续编号。这会影响 ‘#n=’ 标签和 ‘#m#’ 引用的打印编号。 请勿使用 setq 设置该变量;应仅通过 let 将其临时绑定为 t。绑定该变量时,还应将 print-number-table 绑定为 nil

Variable: print-number-table

该变量持有一个向量,供打印功能内部用于实现 print-circle 特性。除非在绑定 print-continuous-numbering 时将其绑定为 nil,否则不应直接使用该变量。

Variable: float-output-format

该变量指定浮点数的打印格式。默认值为 nil,表示使用能无信息丢失表示该数字的最短输出形式。

若要更精确地控制输出格式,可将该变量设为一个字符串。该字符串应包含 C 函数 sprintf 所用的 ‘%’ 格式说明符。 关于格式说明符的使用限制,详见该变量的文档字符串。

Variable: print-integers-as-characters

当该变量值非 nil 时,代表可打印图形基础字符的整数会使用 Lisp 字符语法打印(see 基本字符语法), 其他数字则按常规方式打印。例如,列表 (4 65 -1 10) 会被打印为 ‘(4 ?A -1 ?\n)’。

更精确地说,以下值会以字符语法打印:属于 Unicode 通用类别(Letter、Number、Punctuation、Symbol、Private-use)的字符 (see Character Properties),以及拥有专属转义语法的控制字符(如换行符)。

User Option: pp-default-function

该用户变量指定 pp 函数用于美化输出的底层函数。默认使用 pp-fill,该函数会在速度与生成自然易读且适配 fill-column 宽度的输出之间取得平衡。此前的默认值为 pp-28,该函数速度更快,但生成的输出可读性较差且不够紧凑。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike