Clozure CL中文版024:铁杉编程(下)

  • 0

Clozure CL中文版024:铁杉编程(下)

Category:帮助手册 Tags : 

控制显示

查看

A hemlock-view表示用于显示缓冲区内容的GUI对象。从概念上讲,它由文本缓冲区,半永久状态信息的模式行,瞬态状态信息的回波区和用于读取提示输入的文本输入区组成。(目前最后两个是混合的,即文本输入发生在回声区域)。

用于处理hemlock-views的API尚未完全定义。如果您需要使用超出此处列出的视图,您可能需要访问源代码并找到一些内部函数来调用。

当前观点

current-view[功能]

current-view返回hemlock视图,该视图是当前正在执行的命令的目标。这通常是当前应用程序中最前面的铁杉窗口。

查看功能

hemlock-view-p 对象[功能]

如果object是一个铁杉视图,则此函数返回t,否则返回nil。

hemlock-view-buffer 查看[功能]

此函数返回视图中显示的缓冲区。

光标位置

mark-column 标记[功能]

此功能返回显示标记的X位置,假设其线条显示在无限宽屏幕上。这考虑了诸如制表符之类的奇怪字符。

move-to-column 标记 &optional 线[功能]

此功能类似于hemlock-interface:move-to-position,除了它将标记移动到与指定列对应的行上位置。如果该行不会到达指定的列,则返回nil并且不修改标记。请注意,由于字符可能显示在屏幕上的多个列上,因此列的多个不同值可能会导致标记移动到相同位置。

重新显示

屏幕上缓冲区内容的显示在每个命令结束时更新。以下函数可用于控制视图中缓冲区的滚动位置。

set-scroll-position 怎么 &optional [功能]

通常,在更改缓冲区或选择内容(即活动区域)的命令之后,事件处理程序重新定位视图以使选择可见,并根据需要滚动缓冲区。调用此函数会告诉系统不要这样做,而是以特定方式定位缓冲区。 how可以是以下之一:

:中心选择

这使得选择(或点)在可见区域中居中。 what被忽略了。

:向上翻页

这会导致显示缓冲区的上一页what被忽略。

:向下翻页

这会导致显示缓冲区的下一页。what被忽略了。

:线向上

这会导致what前面的行在顶部滚动。what必须是整数。

:线下

这会导致what下一行在底部滚动。what必须是整数。

:线

这会导致包含的行what被滚动到视图的顶部。what必须是一个标记。

逻辑密钥事件

介绍

hemlock-interface:prompt-for-key诸如Emacs查询之类的 一些原语和命令直接从键盘替换读取键事件而不是使用命令解释器。为了鼓励这些命令之间的一致性并使它们可移植且易于定制,有一种定义逻辑键事件的机制。逻辑键事件是表示某些键事件集的关键字。系统全局将这些关键事件解释为特定行动的指标。例如,help逻辑键事件表示在给定的Hemlock实现中请求帮助的键事件集。此映射是多对多映射,而不是一对一映射,因此给定的逻辑键事件可能具有多个对应的实际键事件。此外,任何键事件都可以表示不同的逻辑键事件。

逻辑键事件功能

*logical-key-event-names*[变量]

此变量包含将所有逻辑键事件名称映射到标识逻辑键事件的关键字的字符串表。

define-logical-key-event 字符串名称 文档[功能]

此函数定义一个名为string-name的新逻辑键事件。逻辑键事件操作将逻辑键事件参数作为关键字,其名称为字符串名称大写,其中空格由连字符替换。

文档描述了逻辑键事件指示的操作。

logical-key-event-key-events 关键字[功能]

此函数返回表示逻辑键事件关键字的键事件列表。

logical-key-event-name 关键字[功能]

logical-key-event-documentation 关键字[功能]

这些函数返回给定义逻辑键事件关键字的define-logical-key-event的字符串名称和文档。

logical-key-event-p 键事件 关键字[功能]

如果key-event是逻辑键事件关键字,则此函数返回t。这可以设置或解除作为特定逻辑键事件的键事件。关键字是未定义的逻辑键事件是错误的。

系统定义的逻辑密钥事件

有许多默认的逻辑键事件,其中一些由本手册中记录的函数使用。如果命令想要读取符合这些描述之一的单个键事件命令,则应将键事件读取与相应的逻辑键事件进行比较,而不是明确提及代码中的特定键事件。在许多情况下,您可以使用hemlock-interface:command-case宏。它使逻辑键事件易于使用,并负责提示和显示帮助消息。

  • :abort表示提示器应终止其活动,而不执行任何方便的关闭操作。
  • :yes表示提示者应该采取正在考虑的操作。
  • :no表示提示者不应该考虑采取行动。
  • :do-all表示提示器应尽可能多次重复所考虑的操作。
  • :do-once表示提示器应执行一次考虑的操作然后退出。
  • :help表示提示器应显示一些帮助信息。
  • :confirm表示提示者应该提供任何输入,或者如果用户没有输入,则使用默认值。
  • :quote表示提示器应该将以下键事件作为自身,而不需要任何类型的命令解释。
  • :keep表示提示符应该保留一些东西。
  • :y表示短暂的积极响应
  • :n表示短的否定响应

在以下情况下定义新的逻辑键事件:

  1. 有关的关键事件代表一般操作类,并且若干命令可能想要采取这种类型的类似操作。
  2. 命令实现者选择的确切键事件可能在用户之间产生暴力味道争议,然后用户可以在其init文件中轻松地更改命令。
  3. 您正在使用command-case它可以防止实现者在其他可能的可移植代码中指定非标准字符以进行调度,并且您可以在站点相关文件中定义和设置逻辑键事件,您可以在其中提及依赖于实现的字符。

回声区

Hemlock提供了许多用于显示信息和提示用户输入信息的工具。其中大部分通过显示在屏幕底部的小区域进行工作,称为回声区域。

回声区域功能

clear-echo-area[功能]

清除回声区域。

message control-string &rest format-arguments[功能]

loud-message control-string &rest format-arguments[功能]

在回显区域中显示消息,替换以前的内容(如果有)。响亮的消息就像消息,但它也会发出哔哔声。

beep[功能]

通常通过发出声音来引起用户的注意。

提示功能

提示功能可用于从用户获得短的单行输入。

可可注意:由于实现限制,一次只允许一个缓冲区读取提示输入。如果在提示操作已在另一个缓冲区中生效时调用提示功能,则尝试失败,告诉用户“缓冲区xxx已在等待输入”。

大多数提示函数接受以下关键字参数:

:必须同时存在

如果:必须存在具有非零值,则提示用户,直到获得有效响应。如果:必须存在为nil然后以字符串形式返回任何输入。默认值为t。

:默认

如果在提示用户时给出空输入,则返回此值。如果没有给出默认值,则必须在发生任何有趣的事情之前给出一些输入。

:默认字符串

如果给出:default,那么这是一个要打印的字符串,以指示默认值。默认值是以下值的某种表示形式:default,例如对于缓冲区,它是缓冲区的名称。

:提示

这是要显示的提示字符串。

:帮帮我

这类似于:prompt,除了在输入期间键入help命令时显示。

这也可能是一种功能。当没有参数调用时,它应该返回一个字符串作为帮助文本或执行一些操作来帮助用户,返回nil。

prompt-for-buffer &key prompt help :必须存在 default default-string[功能]

提示完成缓冲区名称并返回相应的缓冲区。如果必须存在为nil,则返回输入字符串(如果它不是缓冲区名称)。在以下情况下,这拒绝接受空字符串作为输入:default和:default-string为nil。:default-string可用于在以下情况下提供默认缓冲区名称:default为nil,但是:must-exist为非nil时,必须命名已存在的缓冲区。

prompt-for-key-event &key :提示 :帮助[功能]

当用户键入下一个键事件时,此功能会提示立即返回键事件。 hemlock-interface:command-case对大多数用途更有用。适当时,使用逻辑键事件

prompt-for-key &key prompt help :必须存在 default default-string[功能]

此函数提示输入一个键,一个键事件向量,适用于传递给操作键绑定的任何函数。如果必须存在,则必须在当前环境中绑定密钥,并将当前绑定的命令作为第二个值返回。

prompt-for-file &key prompt help :必须存在 default default-string[功能]

此功能提示输入可接受的文件名。“可接受”意味着它是一个合法的文件名,如果必须存在非零,则存在。prompt-for-file返回Common Lisp路径名。如果文件以输入的形式存在,则返回该文件,否则它将与merge-pathnames合并为default。

prompt-for-integer &key prompt help :必须存在 default default-string[功能]

此函数提示输入可能有符号的整数。如果必须存在为nil,则prompt-for-integer将输入作为字符串返回(如果它不是有效整数)。

prompt-for-keyword string-tables &key prompt help :必须存在 default default-string[功能]

此函数使用列表字符串表中的字符串表提示输入完成的关键字。如果必须存在非nil,则结果必须是其中一个字符串表中字符串的明确前缀,并且即使仅键入完整字符串的前缀,也会返回完整字符串。此外,这将返回字符串表中相应条目的值作为第二个值。

如果必须存在为nil,则此函数返回与输入完全相同的字符串。prompt-for-keyword与必须存在的nil和prompt-for-string之间的区别在于用户可以使用Complete Parse和Complete Field命令完成输入。

prompt-for-expression &key prompt help :必须存在 default default-string[功能]

该函数读取Lisp表达式。如果必须存在为nil,并且发生读取错误,则返回键入的字符串。

prompt-for-string &key prompt help default default-string[功能]

此函数提示输入字符串; 这不能失败。

prompt-for-variable &key prompt help :必须存在 default default-string[功能]

此功能提示输入变量名称。如果必须存在非nil,则字符串必须是当前环境中定义的变量,在这种情况下,找到的变量的符号名称将作为第二个值返回。

prompt-for-y-or-n &key prompt help :必须存在 default default-string[功能]

这会提示输入逻辑键事件:Y或:N,返回t或nil而不等待确认。当用户键入确认键时,如果提供了确认键,则返回默认值。如果必须存在为nil,则返回用户首先键入的任何键事件; 但是,如果用户键入上述键事件之一,则返回t或nil。这类似于Common Lisp函数y-or-np。

prompt-for-yes-or-no &key prompt help :必须存在 default default-string[功能]

此函数用于提示y或n,因为是或否是对于y或np的p。必须填写“是”或“否”,必须确认。

command-case ({key value} *{{{tag} *| tag} help {form} *} *[Macro]

这个宏类似于Common Lisp case宏。诸如Help之类的命令使用它来获取键事件,将其转换为字符,然后将字符分派给某些情况。除了字符调度之外,它还通过直接使用输入键事件来支持逻辑键事件,而无需将其转换为字符。由于此宏的描述相当复杂,请首先考虑以下示例:

(defcommand “Save All Buffers” (p)  “Give the User a chance to save each modified buffer.”  (dolist (b *buffer-list*)    (select-buffer-command () b)    (when (buffer-modified b)      (command-case (:prompt “Save this buffer: [Y] ”                         :help “Save buffer, or do something else:”)       ((:yes :confirm)       “Save this buffer and go on to the next.”       (save-file-command () b))       (:no “Skip saving this buffer, and go on to the next.”)       ((:exit #\p) “Punt this silly loop.”       (return nil))))))

命令大小写提示键事件,然后使用逻辑键事件或与输入匹配的字符(称为标记)执行第一个分支中的代码。每个字符必须是标准字符,满足Common Lisp标准-char-p谓词,并且调度机制通过将键事件映射到具有ext:key-的字符来将输入键事件与任何字符标记进行比较。事件字符。如果标记是逻辑键事件,则搜索适当的大小写将使用logical-key-event-p将键事件读取与标记进行比较。

命令案例的所有用法都有两个默认情况:help和:abort。您可以通过指定包含这些逻辑键事件标记的分支来轻松覆盖这些内容。:help分支使用各种指定的帮助字符串在弹出窗口中显示有效响应的描述。:abort分支发出编辑错误信号。

键/值参数控制提示。以下是有效值:

:帮帮我

默认值:help case在弹出窗口中显示此字符串。此外,它格式化有效输入的描述,包括每个案例的帮助字符串。

:提示

这是读取键事件时使用的提示。

:绑定

这指定了提示机制绑定输入键事件的变量。任何情况都可以引用此变量。如果您想知道哪个字符对应于键事件,请使用key-event-char。

您可以使用t代替指定标签或标签列表。这将成为默认分支,如果不采用其他分支,则执行其表单,包括default:help和:abort情况。此选项没有帮助字符串,默认情况下:help case不描述默认分支。每个命令案例都有一个默认分支; 如果没有指定,则宏包括一个发出蜂鸣声和重新发出的声音(见下文)。

在命令案例的主体内,有一个定义的reprompt宏。它使提示机制和调度机制立即重复,而不在当前分支中进一步执行。

解析行为的控制

beep 歧义初始 )[铁杉变量]

如果此变量为true,则尝试完成不明确的解析将导致“嘟嘟”声。

定义新的提示功能

提示功能是通过与在与回波区域相关联的缓冲区上的“回波区域”模式中定义的命令配合的功能解析来实现的。您可以通过使用适当的参数调用parse-for-something来实现新的提示函数。

parse-for-something &key[功能]

此功能进入用户的模式读取输入并在回波区域中回显它,并在完成时返回一个值。输入由与回波区域相关联的缓冲区中以“回波区”模式绑定的命令管理。接受以下关键字参数:

:verification-function

这是由“Confirm Parse”命令调用的。解析提示输入时,它完成大部分工作。Confirm Parse使用一个参数调用它,该参数是用户到目前为止键入的字符串。该函数应该返回一个值列表,这些值是递归编辑的结果,或者是nil,表示解析失败。为了返回零值,可以返回非零秒值以及零第一值。

:string-tables

这是与此解析相关的字符串表列表(如果有)。

:value-must-exist

这由验证功能以及可能的一些命令引用。

:default

提示用户时表示默认对象的字符串。当用户输入为空时,Confirm Parse将此提供给解析验证功能。

:default-string

当提示用户时,如果:未指定default,则Hemlock将此字符串显示为默认对象的表示; 例如,在提示输入缓冲区时,此参数将是默认缓冲区名称。

:type

解析的类型,例如:file,:keyword,:string。这告诉完成命令如何完成,使用:string禁用完成。

:prompt

提示显示给用户。

:help

用于当前解析的帮助字符串或函数。

一些回声区域命令

这些是与提示例程协调的一些Echo Area命令。Hemlock绑定了特定于Echo Area的其他命令,但是这里提到它们并不感兴趣,例如删除到行的开头或向后删除一个单词。

help 解析绑定 家里,C-_ 回波 区域 模式)[铁杉命令]

显示当前正在进行的解析的帮助文本。

complete 关键字结合 逃逸 回波 区域 模式)[铁杉命令]

这试图完成当前区域。如果输入不明确或不正确,它会发出编辑错误信号。

complete fieldecho 区域模式下绑定 空格 )[Hemlock Command]

与此类似Complete Keyword,但仅尝试使用非零:parse-field-separator属性完成并包含关键字中的第一个字符。如果没有字段分隔符,则尝试完成整个关键字。如果它不是关键字解析,那么只需自我插入。

confirm 解析绑定 返回 回波 区域 模式)[铁杉命令]

使用当前输入调用验证功能。如果它返回一个非零值,那么它将作为解析的值返回。如果验证函数返回非零秒值,则解析可以返回零值。

本章讨论了在各种级别(标记,区域和缓冲区)中读取和写入文件的方法。这也会处理影响读取文件的缓冲区状态的自动机制。

文件选项和类型挂钩

用户在文件的第一行指定具有特殊语法的文件选项。如果第一行包含字符串“ – * – ”,则Hemlock将第一个这样的事件和第二个字段之间的文本解释为一行,它必须包含在一行中,作为由分号分隔的“option:value”对列表。以下是一个典型的例子:

;;; -*- Mode: Lisp, Editor; Package: Hemlock -*-

有关更多详细信息和预定义选项,请参阅Hemlock用户手册。

当Hemlock根据路径名的类型将文件读入缓冲区时,将执行文件类型挂钩。当用户指定打开主模式的模式文件选项时,Hemlock会忽略类型挂钩。这种机制主要用作打开某些适当的默认主要模式的简单方法。

define-file-option name缓冲区 {declaration} * {form} *[Macro]

这定义了一个带有字符串名称name的新文件选项。缓冲区和值指定缓冲区和选项值字符串的变量名称,并使用这些绑定来评估表单。

define-file-type-hook type-list缓冲区 类型{declaration} * {form} *[Macro]

这定义了当文件选项无法设置主模式时执行process-file-options(下面)的一些代码。这会将type-list中的每个类型(字符串)与将缓冲区绑定到文件所在缓冲区的例程相关联,并键入路径名的类型。

process-file-options 缓冲 &optional 路径名[功能]

这将检查缓冲区中的文件选项,并调用处理程序(如果有)。路径名默认为缓冲区的路径名,但可能为零。如果没有指定主模式的模式文件选项,并且路径名具有类型,则会尝试调用相应的文件类型挂钩。read-buffer-file调用它。

路径名和缓冲区

没有好的方法可以唯一地识别缓冲区名称和路径名。但是,Hemlock有一种方法可以将路径名映射到缓冲区名称,这些名称应该用于自定义和基元之间的一致性。与此无关,Hemlock提供了一种在向用户询问路径名时始终生成提示默认值的方法。

pathname-to-buffer-name 路径名[功能]

此函数返回“file-namestring directory-namestring”形式的字符串。

pathname 默认值初始 路径名 “gazonk.del”)[Hemlock变量]

last resort pathname 默认 函数[Hemlock Variable]

last resort pathname defaults初始 pathname quot; gazonkquot;)[Hemlock Variable]

这些变量控制了在向用户发布时需要的默认路径名的计算。路径名默认值是粘滞默认值。有关详细信息,请参阅“Hemlock用户手册”。

buffer-default-pathname 缓冲[功能]

如果绑定,则返回Buffer Pathname。如果它没有绑定,并且缓冲区的名称仅由字母数字字符组成,则返回由缓冲区名称形成的路径名。如果缓冲区的名称中包含其他字符,则返回在缓冲区上调用的Last Resort Pathname Defaults Function的值。

文件组

目前Hemlock不支持文件组。

文件阅读和写作

Common Lisp路径名由文件原语使用。对于探测,检查写入日期等,所有Common Lisp文件功能都可用。

read-file 路径名 标记[功能]

这将在path处插入由pathname命名的文件。

write-file region pathname &key keep-backup append[功能]

keep 备份 文件初始 为零)[Hemlock变量]

此函数将region的内容写入pathname命名的文件。这使用流写入区域,就像它打开时一样:if-exists提供为:rename-and-delete。

当keep-backup(默认为Keep Backup Files的值)为非零时,这将打开流,如果:if-exists是:rename。如果append是非nil,则将文件写为就像打开文件一样:if-exists提供为:append。

如果追加和保持备份都以非零提供,则表示错误。

write-buffer-file 缓冲 路径名[功能]

write 文件 [Hemlock变量]

add 换行符 EOF 写入 文件初始 :询问用户)[铁杉变量]

write-buffer-file将缓冲区写入pathname命名的文件,包括以下内容:

  • 它假设pathname以某种方式与缓冲区的路径名相关:如果缓冲区的写入日期与路径名不同,则会在覆盖文件之前提示用户进行确认。
  • 它在写入文件的EOF上查询添加换行符(有关可能的值,请参阅Hemlock用户手册),并在必要时与用户交互。
  • 它设置路径名默认值,并在使用写文件后,标记缓冲区未修改。
  • 它更新Buffer的路径名和写日期。
  • 如果可能,它会根据新路径名重命名缓冲区。
  • 它调用Write File Hook。

Write File Hook是一个以新写入的缓冲区为参数的函数列表。

read-buffer-file pathname buffer[功能]

read 文件 [Hemlock变量]

read-buffer-file删除缓冲区的区域,并使用read-file将pathname读入其中,包括以下内容:

  • 如果文件存在,它将缓冲区的写入日期设置为文件的写入日期; 否则,它会消息这是一个新文件并将缓冲区的写入日期设置为nil。
  • 它将缓冲区的点移动到开头。
  • 它设置缓冲区的未修改状态。
  • 如果文件存在,它将缓冲区的路径名设置为探测路径名的结果; 否则,此函数将缓冲区的路径名设置为将路径名与默认目录合并的结果。
  • 它将Pathname Defaults设置为上一项的结果。
  • 它处理文件选项。
  • 它调用Read File Hook。

Read File Hook是一个列表函数,它带有两个参数—缓冲区读入和文件是否存在,如果是,则为t。

Hemlock的Lisp环境

对于涉及Hemlock与外部世界的交互的任何函数和变量,本章都是一个问题。

进入并离开编辑器

ed &optional x[功能]

这是一个标准的Common Lisp函数。如果提供了x并且是字符串或路径名,则在hemlock视图中访问由x指定的文件(如果需要,打开一个新窗口,否则将带有该文件的现有窗口带到前面),并且片万视图对象是从函数返回值。

如果x为null,则创建并返回一个新的空的hemlock视图。

如果x是符号或setf函数名称,它会尝试编辑名称的定义。在最后一种情况下,函数返回而不等待操作完成(例如,它可能会建立一个非模态对话框,要求用户选择多个定义之一),因此返回值始终为NIL。

键盘输入

*key-event-history*[变量]

这是一个Hemlock 环形缓冲区,用于保存最后收到的60个密钥事件。

last-key-event-typed[功能]

此函数返回用户键入的最后一个键事件以调用当前命令。

last-char-typed[功能]

此函数返回与键入的最后一个键事件对应的字符。

铁杉溪流

可以创建输出到缓冲区或从缓冲区输入的流。这种机制非常强大,可以轻松地将Hemlock连接到Lisp。

请注意,对这些流的操作直接在缓冲区上运行,因此它们具有与此处描述的相同的限制,用于与来自GUI线程外部的缓冲区进行交互。

make-hemlock-output-stream mark &optional buffered[功能]

此函数返回一个流,该流在标记处插入指向它的所有输出。如果标记是左插标记,则效果最佳。缓冲控制是否缓冲流,其有效值为以下关键字:

:没有

没有缓冲。这是默认值。

:线

只要写入换行符或使用强制输出显式完成,就会刷新缓冲区。

:充分

只有在使用force-output明确完成时才会更新流

hemlock-output-stream-p 对象[功能]

如果object是一个hemlock-output-stream对象,则此函数返回t。

make-hemlock-region-stream 区域[功能]

此函数返回一个流,可以从中读取区域中的文本。

hemlock-region-stream-p 对象[功能]

如果object是一个hemlock-region-stream对象,则此函数返回t。

with-input-from-region (var region{declaration} * {form} *[Macro]

在评估表单时,将var绑定到从区域返回输入的流。

with-output-to-mark (var mark [buffered]{declaration} * {form} *[Macro]

在评估表单期间,将var绑定到在永久标记处插入输出的流。Buffered与make-hemlock-output-stream具有相同的含义。

with-pop-up-display (var &key height name{declaration} * {form} *[Macro]

此宏在上下文中执行表单,其中var绑定到流。Hemlock将输出收集到此流并尝试弹出包含所有输出的适当高度的显示。当提供高度时,Hemlock立即创建弹出窗口,强制在换行符上输出。这对于显示临时兴趣的信息很有用。

错误系统的接口

Hemlock命令从最初的Cocoa线程中的事件处理程序执行。它们在ccl :: with-standard-abort-handling形式中执行,这意味着cl:abort,ccl:abort-break,ccl:throw-cancel将仅中止当前命令并以有序的方式退出事件处理程序。

此外,目前,命令执行期间的lisp错误会在系统控制台中转储回溯,否则就像在handle-lisp-errors下面一样处理 ,这意味着无法在错误点调试错误。一旦Clozure CL更好地支持在初始Cocoa线程中调试错误,将提供更好的Hemlock错误处理,这将允许某种方式进行调试。

editor-error &rest args[功能]

调用此函数以向用户报告次要错误。这些是普通用户在编辑过程中可能遇到的错误,例如搜索失败或尝试删除超过缓冲区的末尾。此函数只是中止当前命令。指定的任何args用于格式化要放置在echo区域中的错误消息。此功能永不返回。

handle-lisp-errors {form} *[Macro]

在此宏的主体内,发生的任何Lisp错误都是通过在对话框中显示错误消息并中止当前命令来处理的,并将错误文本留在echo区域中。这个宏应该包含在代码中,这些代码可能由于用户的某些操作而导致错误 – 例如,代表用户评估代码片段并由用户提供代码片段。

定义编辑

Hemlock提供了查找函数或变量定义的命令,并将用户放在缓冲区中的定义中。提供了一个函数以允许在Hemlock之外调用此功能。请注意,此函数不常见,因为在命令解释器外部调用是安全的,实际上它可以从任何线程调用。

edit-definition 名称[功能]

此函数尝试查找name包含它的窗口的定义,创建或激活,并滚动视图以显示定义。如果有多个可用定义,则可以选择使用哪个定义。此功能可能在操作完成之前返回。

事件安排

目前没有提供事件调度功能。

in-lisp {form} *[功能]

这会评估handle-lisp-errors中的表单。它还将* package *绑定到Current Package命名的包,如果它是非零的。代表用户评估Lisp代码时使用此选项。

do-alpha-chars (var kind [result]{form} *[Macro]

这将按照Common Lisp the Language中的字符关系指定的顺序,将Common Lisp绑定var中的字母字符按顺序迭代到每个字符。种类是以下之一:lower,:upper或:both。当用户提供:两者时,首先处理小写字符。

高级文本基元

本章讨论在高级文本形式上运行的基元,而不是字符和单词。对于英文文本,有一些函数可以了解句子和段落结构,对于Lisp源代码,有一些函数可以理解这种语言。本章还介绍了将文件节组织为逻辑页面和格式化文本表单的机制。

缩进文本

indent 函数初始 tab-to-tab-stop)[Hemlock变量]

此变量的值确定缩进的完成方式,它是一个以标记作为参数传递的函数。该函数应缩进标记指向的行。该功能可以在线上移动标记。标记为:左插入。默认情况下,只需在标记处插入制表符。Lisp模式的函数可能会将标记移动到行的开头,删除水平空格,并为Lisp代码计算一些适当的缩进。

indent 标签初始 为零)[Hemlock变量]

spaces 每个 标签初始 8)[Hemlock变量]

如果缩进应尽可能使用制表符,则缩进与制表符应为true。如果为nil,则默认为仅使用空格。每个选项卡的空格定义选项卡的大小。

indent-region 区域[功能]

indent-region-for-commands 区域[功能]

indent-region在区域的每一行上调用Indent Function的值。indent-region-for-commands使用缩进区域,但首先保存撤消命令的区域。

delete-horizontal-space 标记[功能]

这将使用Space属性(请参阅系统定义的字符属性)删除标记两侧的所有字符。

Lisp文本缓冲区

Hemlock将其Lisp原语基于解析缓冲区块并注释行,以确定行上出现什么样的Lisp语法或标记可能是什么形式(例如,字符串,注释,列表等)。如果在这些表单周围移动标记时超出了解析表单块,则这些不能很好地工作,但是解析的块在某种程度上是可编程的。

还有一个顶级形式的概念,该文档通常与defun同义使用,意味着在由括号分隔的源文件中出现的Lisp形式,在某行的开头有左括号。函数的名称包括这种不一致。

pre-command-parse-check 标记 为肯定[功能]

parse 启动 函数初始 解析块)[Hemlock变量]

parse 结束 函数初始 结束语句块)[Hemlock变量]

minimum 解析的行初始 50)[Hemlock变量]

maximum 解析的行初始 500)[Hemlock变量]

defun 解析 目标初始 2)[Hemlock变量]

pre-command-parse-check调用Parse Start Function和Parse End Function on mark得到两个标记。然后它解析标记之间的所有行,包括它们指向的完整行。当for-sure为非零时,无论有关行的任何缓存信息,都会解析该区域。使用以下例程的每个命令在执行此操作之前都会调用此命令。

start和end变量的默认值使用Minimum Lines Parsed,Maximum Lines Parsed和Defun Parse Goal来确定要解析的区域的大小。这两个函数始终至少包括传递给它们的标记之前和之后的最小行数。他们尝试在标记传递之前和之后包含顶级表单的Defun Parse目标数,但这些函数永远不会返回包含超过传递给它们之前或之后的最大行数的标记。

form-offset 标记 计数[功能]

如果为正,则尝试向前移动标记计数表单;如果为负,则向后计数向后移动。马克永远感动。如果在适当的方向上有足够的形式,则返回标记,否则为零。

top-level-offset 标记 计数[功能]

如果为正,则尝试向前移动标记计数顶级表单,如果为负,则尝试向前移动标记计数顶级表单。如果在适当的方向上有足够的顶级表单,则返回mark,否则为nil。只有在成功的情况下才会移动标记。

mark-top-level-form mark1 mark2[功能]

这会将mark1和mark2分别移动到当前或下一个顶级表单的开头和结尾。Mark1用作开始查看的参考。即使不成功,也可以改变标记。如果成功,返回mark2,否则为nil。如果可能,Mark2将保留在顶级表单后面的行的开头,但如果最后一行在结束括号后面有文本,则会在表单后面立即留下标记。

defun-region 标记[功能]

这将返回相对于标记的当前或下一次defun周围的区域。马克不习惯形成这个地区。如果没有合适的顶级表单,则表示编辑器错误。这首先调用pre-command-parse-check。

inside-defun-p 标记[功能]

start-defun-p 标记[功能]

它们分别返回标记在顶级形式内或紧接在其Lisp语法(参见系统定义字符属性)值为:opening-paren 的字符之前的行的开头。

forward-up-list 标记[功能]

backward-up-list 标记[功能]

这些移动标记分别在Lisp语法(参见系统定义的字符属性)值为:closing-paren或紧接在其Lisp语法值为:opening-paren的字符之前。

valid-spot mark forwardp[功能]

这将返回t或nil,具体取决于mark指示的字符是否为有效点。设置forwardp时,请使用标记后的字符,反之亦然。有效位置不包括注释文本,字符串内部和字符引用。

defindent 名字 [功能]

这将使用name定义具有count特殊参数的函数。indent-for-lisp,“Indent Function” 在Lisp模式下的值,使用它来特别缩进这些参数。例如,do有两个,with-open-file有一个,等等。系统定义了许多这些,包括特殊Hemlock表单的定义。Name是一个简单字符串,不区分大小写且纯文本(即Lisp读取器不读取); 因此,“与嘟m”不同于“嘟m:与嘟m”。

英文文本缓冲区

本节介绍了解基本英语语言表单的一些例程。

word-offset 标记 计数[功能]

这会将标记计数字向前移动(如果为正)或向后移动(如果为负)。如果标记位于单词的中间,则计为一个单词。如果在适当的方向上有计数(-count if negative)字,则返回mark,否则为nil。这总是移动标记。单词位于两个字符之间,其字符分隔符属性值为1(请参阅系统定义字符属性)。

sentence-offset 标记 计数[功能]

这会将标记计数句子向前移动(如果是正向)或向后移动(如果为负)。如果标记位于句子的中间,则计为一个。如果在适当的方向上有计数(-count if negative)句子,则返回mark,否则为nil。这总是移动标记。

句子以Sentence Terminator属性为1的字符结尾,后跟两个空格,换行符或缓冲区的末尾。终止字符可选地后跟任何数量的字符,其句子结束字符属性为1.句子在前一个句子结束之后,段落的开头或缓冲区的开头处开始。

paragraph-offset 标记 计数 &optional 前缀[功能]

paragraph 分隔符 函数初始 )[Hemlock变量]

这会将标记计数段向前移动(如果为正)或向后移动(如果为负)。如果标记位于段落的中间,则计为一个。如果在适当的方向上有计数(-count if negative)段落,则返回mark,否则为nil。如果有足够的段落,这只会移动标记。

段落分隔符函数包含一个带标记的函数,通常在一行的开头,并返回当前行是否应该破坏该段落。如果下一个字符(行中的第一个字符)的段落分隔符属性值为1,则default-para-delim-function返回t。对于块样式,这通常是空格,用于缩进段落或换行符。有些模式需要更复杂的决定因素; 例如,Scribe模式会在集合中添加一些字符,并在特殊情况下添加某些格式化命令。

前缀默认为“Fill Prefix”,并且正确的前缀是正确跳过段落所必需的。如果prefix是非nil,并且一行以prefix开头,则扫描进程会在调用Paragraph Delimiter Function之前跳过该前缀。注意,当扫描段落边界,并且前缀是非零时,行可能是段落的一部分,无论它们是否包含前缀; 只有调用定界符函数的结果很重要。

程序员应该知道找到当前段落结尾的习语。假设paragraphp是移动标记一段的结果,则以下正确确定是否确实存在当前段落:

(or paragraphp  (and (last-line-p mark)       (end-line-p mark)       (not (blank-line-p (mark-line mark)))))

在此示例中,mark位于缓冲区中最后一个段落的末尾,缓冲区中没有最后一个换行符。paragraph-offset将返回nil,因为它不能跳过任何段落,因为mark位于当前和最后一段的末尾。但是,您仍然找到了要操作的当前段落。mark-paragraph理解这个问题。

mark-paragraph mark1 mark2[功能]

这标志着下一个或当前段落,将mark1设置为开头,将mark2设置为结尾。这用了“Fill Prefix”。无论前一行是否为空,Mark1始终位于段落的第一行。Mark2通常位于段落结束行之后的行的开头,成功时返回mark2。如果找不到段落,则标记保持不动,并返回nil。

逻辑页面

目前不支持逻辑页面。

填充

填充是对文本的操作,该操作在给定列之前在字边界处断开长行并将较短的行合并在一起以试图使每一行大致指定长度。这与试图在尴尬的地方添加空格以使每条线的长度完全相同的理由不同。Hemlock的填充可选地在每行的开头插入指定的字符串。此外,它消除了行和单词之间的额外空格,但它知道句子后面有两个空格。

fill 初始 75)[Hemlock变量]

fill 前缀初始 为零)[Hemlock变量]

这些变量保存Hemlock填充基元的前缀和列参数的默认值。如果Fill Prefix为nil,则没有填充前缀。

fill-region 区域 &optional 前缀 [功能]

这将删除区域中的所有空行,并根据前缀和列填充它。前缀和列默认为“填充前缀和填充列”。

fill-region-by-paragraphs 区域 &optional 前缀 [功能]

这会在区域内找到段落并用填充区域填充它们。这会忽略段落之间的空白行。前缀和列默认为“填充前缀和填充列”。

公用事业

本章描述了许多用于操作Hemlock用于记录信息的某些类型对象的实用程序。字符串表用于存储变量,命令,模式和缓冲区的名称。环列表可用于提供终止响铃,最近命令历史记录或其他用户可见功能。

字符串表函数

字符串表与Common Lisp哈希表类似,它们将值与对象相关联。存在一些有用的差异:在字符串表中,键始终是不区分大小写的字符串,并且提供基元以便于关键字完成和识别。可以将任何类型的字符串添加到字符串表中,但字符串表函数始终返回simple-string的字符串。

其中一个表中的字符串条目可以被视为分为字段或关键字。该界面提供关键字完成和识别,主要用于实现一些Echo Area命令。这些例程在逐个字段的基础上执行前缀匹配,允许在继续输入后面的字段时对早期字段进行模糊规范。虽然字符串表可以使用任何string-char作为分隔符,但使用空格以外的字符可能会使Echo Area命令失败或意外工作。

make-string-table[功能]

此函数创建一个空字符串表,该表使用分隔符作为字符,该字符必须是字符串字符,用于区分字段。Initial-contents以点状a-list的形式指定一组初始字符串及其值,例如:

‘((“Global” . t) (“Mode” . t) (“Buffer” . t))

string-table-p 字符串表[功能]

如果string-table是字符串表对象,则此函数返回t,否则返回nil。

string-table-separator 字符串表[功能]

此函数返回给予make-string-table的分隔符。

delete-string 字符串 [功能]

clrstring [功能]

delete-string从string-table表中删除string的任何条目,如果有条目则返回t。clrstring从表中删除所有条目。

getstring 字符串 [功能]

此函数返回多个值,如果找到则返回与字符串对应的值,如果不是则返回nil,如果找到则返回n,如果不是则返回nil。

这可以使用setf设置,以添加新条目或存储字符串的新值。尝试插入一个连续出现多个字段分隔符的字符串是错误的。

complete-string 字符串 [功能]

此函数尽可能在表列表上完成字符串,返回五个值。表具有不同的分隔符是错误的。五个返回值如下:

  • 字符串的最大完成次数,如果没有,则为nil。
  • 指示返回字符串的有用性:

:没有

没有完成字符串。

:完成

完成是一个有效的条目,但也存在其他有效的完成。当提供的字符串是另一个条目的条目和初始子字符串时,会发生这种情况。

:独特

完成是一个有效的条目和独特的。

:暧昧

完成无效; 如果给出返回的字符串,get-string将返回nil和nil。

  • 完成时字符串的值为:unique或:complete,否则为nil。
  • 返回完成的索引或nil,指示向字符串添加单个字段的位置。当完成包含多个字段的字符串的添加时,命令Complete Field使用此命令。
  • 完成时第一个不明确字段后分隔符的索引:不明确或:完成,否则为零。

find-ambiguous 字符串 [功能]

find-containing 字符串 [功能]

find-ambiguous返回表匹配字符串中所有字符串的字母顺序列表。如果字符串中的每个字段按顺序排列是条目字段的初始子字符串,则将条目视为匹配; 条目可能还有字段。

find-containing类似,但它忽略了string中字段的顺序,返回表中匹配字符串中字段的任何排列的所有字符串。

do-strings (string-var value-var table result声明 标记 语句[Macro]

此宏按字母顺序迭代表中的字符串。在每次迭代中,它将string-var绑定到条目的字符串,将value-var绑定到条目的值。

环功能

编辑器中有各种用途,可以使用一组值,因此Hemlock提供了一般的环形缓冲区类型。它用于维护一系列被 杀死区域,一圈 标记或命令串环,各种模式和命令作为历史机制保持不变。

make-ring 长度 &optional 删除功能[功能]

使一个空的环形对象能够容纳长度为Lisp的对象。删除函数是每个对象在结束之前传递给它的函数。长度必须大于零。

ringp 戒指[功能]

如果ring是一个环形对象,则返回t,否则返回nil。

ring-length 戒指[功能]

返回多个值,返回当前包含的元素数和它可以容纳的最大元素数。

ring-ref 指数[功能]

返回环中的索引项,其中零是最近推送的索引。这可以用setf设置。

ring-push [功能]

将对象推入环状,可能导致最旧的项目消失。

ring-pop 戒指[功能]

从环中删除最近推送的对象并将其返回。如果环不包含任何元素,则发出错误信号。

rotate-ring 偏移[功能]

在正偏移的情况下,旋转多次前进。在正向旋转中,每个元素的索引减1,除了最初具有零索引的索引,该索引是最后一个元素。负偏移以另一种方式旋转环。

撤消命令

目前没有提供撤消工具的API。

本章对于其他任何地方都不适合的评论和功能来说都是一个包罗万象。

关键事件

介绍

编辑器输入的规范表示是键事件结构。用户可以将命令绑定到键,键是非空的键事件序列。键事件由称为键的识别标记和表示修饰符的位字段组成。用户通过提供反映键盘键上图例的名称来定义键盘。用户类似地定义修饰符名称,但系统选择用于识别修饰符的位和掩码。您可以使用keysym和修饰符名称以#k语法在文本上指定键事件和Hemlock键。以下是一些例子:

#k”C-u”#k”Control-u”#k”c-m-z”#k”control-x meta-d”#k”a”#k”A”#k”Linefeed”

这在代码和包含bind-key调用的init文件中使用非常方便。

#k语法由双引号分隔,但系统解析内容而不是将其作为Common Lisp字符串读取。在双引号内,空格分隔多个键事件。单个键事件可选地以由连字符终止的修饰符名称开始。修饰符名称是字符的字符序列,系统使用不区分大小写。以下修饰符是一个键名称,如果它由多个字符组成,则不区分大小写,但如果名称只包含单个字符,则它区分大小写。

您可以使用反斜杠转义特殊字符—连字符,双引号,开角支架,近角括号和空格—您可以通过连续使用两个来指定反斜杠。您可以使用尖括号括起一个包含许多特殊字符的keysym名称。在键名称位置出现的尖括号之间,只有两个特殊字符,即闭合尖括号和反斜杠。

接口

define-keysym keysym preferred-name &rest 其他名称[功能]

为了#k语法,此函数建立从首选名称到keysym的映射。其他名称也映射到keysym,但系统在打印键事件时使用preferred-name。名称是不区分大小写的简单字符串; 但是,如果字符串包含单个字符,则使用区分大小写。重新定义keysym或重用名称具有未定义的效果。

Keysym可以是任何对象,但通常它是表示事件的窗口系统代码的整数,或者是允许将keysym映射到其代码的关键字。

define-keysym-code keysym 代码[功能]

定义关键事件的窗口系统代码,其中Hemlock由keysym表示。

define-mouse-keysym 按钮 keysym 名称 shift-bit 事件键[功能]

此函数为表示鼠标单击事件的键事件定义名为name的keysym。Shifted-bit是一个已定义的修饰符名称,只要在传入事件中设置了shift位,它就会返回它返回的键事件中的鼠标键事件集。

name-keysym 名称[功能]

此函数返回名为name的keysym。如果name未知,则返回nil。

keysym-names keysym[功能]

此函数返回keysym的所有名称列表。如果keysym未定义,则返回nil。

keysym-preferred-name keysym[功能]

这将返回keysym的首选名称,通常是如何打印的。如果keysym未定义,则返回nil。

define-key-event-modifier 长名 短名[功能]

这会将长名称和短名称建立为修饰符名称,以便在#k语法中指定键事件。名称是不区分大小写的字符串。如果已定义任一名称,则表示发生错误。

系统定义以下默认修饰符(首先是长名称,然后是短名称):

  • “超级”,“H”
  • “超级”,“S”
  • “Meta”,“M”
  • “控制”,“C”
  • “转变”,“转变”
  • “锁定”,“锁定”

*all-modifier-names*[变量]

此变量包含所有已定义的修饰符名称。

make-key-event-bits &rest 修饰符名称[功能]

此函数从提供的修饰符名称返回适合make-key-event的位。如果未定义任何名称,则表示发生错误。

key-event-modifier-mask 修饰符名称[功能]

此函数返回修饰符名称的掩码。此掩码适用于键事件位。如果modifier-name未定义,则表示错误。

key-event-bits-modifiers [功能]

这将返回一个键事件修饰符名称列表,每个修饰符设置一个位。

make-key-event 对象 [功能]

此函数返回具有位的对象描述的键事件。对象是keysym,string或key-event之一。当object是键事件时,它使用key-event-keysym。您可以使用make-key-event-bits或key-event-modifier-mask来形成位。

key-event-p 对象[功能]

此函数返回object是否为键事件。

key-event-bits 关键事件[功能]

此函数返回键事件的位字段。

key-event-keysym 关键事件[功能]

此函数返回键事件的keysym字段。

char-key-event 字符[功能]

此函数返回与字符关联的键事件。您可以通过设置此表单将键事件与字符相关联。

key-event-char 关键事件[功能]

此函数返回与键事件关联的字符。您可以通过设置此表单将角色与键事件相关联。系统默认以某种依赖于实现的方式转换键事件以进行文本插入; 例如,在ASCII系统下,键事件#k“Ch”以及#k“backspace”将映射到导致退格的Common Lisp字符。

key-event-bit-p 键事件 位名称[功能]

此函数返回key-event是否具有由bit-name命名的位集。如果未定义位名,则表示错误。

do-alpha-key-events (var kind &optional result表格[Macro]

此宏评估每个表单,其中var绑定到表示字母字符的键事件。Kind是以下之一:lower,:upper或:both,并且这将按照az AZ的顺序将var绑定到每个键事件。当:两者都被指定时,它首先处理小写字母。

pretty-key-string 密钥 &optional long-names-p[功能]

这将以用户期望的方式返回表示键,键事件或键事件向量的字符串。长名称-p表示是否应使用长名称或短名称来描述修饰符。


Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

欢迎大家来到本站,请积极评论发言;

加QQ群学习交流。