Clozure CL中文版024:铁杉编程(上)
Category:帮助手册铁杉编程
介绍
Hemlock是Clozure CL中使用的文本编辑器。它最初基于CMU Hemlock编辑器 ,但后来以各种方式与它分道扬.. 我们继续将编辑器称为IDE的一部分Hemlock给予信用到期的信用,但我们不会尝试与原始Hemlock的源代码或API兼容性。
与代码一样,本文档基于原始的Hemlock文档,并根据需要进行了修改。
Hemlock遵循Emacs兼容编辑器的传统,具有丰富的可扩展命令集。本文档描述了用于实现新命令的API。基本编辑器由一组用于操作缓冲区的Lisp实用程序函数和编辑器的其他数据结构组成。所有用户级命令都是根据这些功能编写的。要了解如何定义命令,请参阅命令。
文本的表示
在Hemlock中,文本表示为一系列行。从不存储换行符,但在行之间隐含。隐式换行符被#\Newline文本原语视为单个字符。
文本在首次引入Hemlock时会被分成几行。文本以两种方式从外部世界进入Hemlock:读取文件或从系统剪贴板粘贴文本。Hemlock使用启发式方法(这应记录在这里!) 决定使用什么新行约定将传入文本转换为其内部表示作为一系列行。同样,它使用启发式方法 (这应记录在这里!) 将内部表示转换为带有嵌入换行符的字符串,以便写入文件或将区域粘贴到剪贴板中。
行
A line是表示没有换行符的字符序列的对象。
linep line[功能]
如果line是一个line对象,则此函数返回t,否则返回nil。
line-string line[功能]
给定一行,此函数将字符串中的字符作为简单字符串返回。这可以设置为将字符串设置为不包含换行符的任何字符串。在某些行的行字符串设置为该字符串之后,破坏性地修改行字符串的结果或破坏性地修改任何字符串是错误的。
line-previous line[功能]
line-next line[功能]
给定一行,line-previous返回前一行,如果没有前一行,则返回nil。类似地,line-next返回行或nil之后的行。
line-buffer line[功能]
此函数返回包含此行的缓冲区。由于一行可能与任何缓冲区无关,因此行缓冲区返回nil。
line-length line[功能]
此函数返回行中的字符数。这最后排除了换行符。
line-character line index[功能]
此函数返回行内位置索引处的字符。索引大于行的长度或小于零是错误的。如果index等于行的长度,则返回#\ newline字符。
line-plist line[功能]
此函数返回行的属性列表。setf,getf,putf和remf可用于更改属性。这通常与线路签名结合使用,以缓存有关线路内容的信息。
line-signature line[功能]
此函数返回一个对象,该对象用作行的内容的签名。保证对行上文本的任何修改都会导致签名发生变化,因此它不是以前任何值的eql。即使文本未经修改,签名也可能会更改,但这种情况不会经常发生。
分数
A mark表示由行表示的文本内的特定位置和该行内的字符位置。虽然标记有时被宽泛地称为指向某个字符,但它实际上指向字符之间。如果charpos为零,则前一个字符是将前一行与标记行分隔的换行符。如果charpos等于行中的字符数,则下一个字符是将当前行与下一行分隔的换行符。如果标记的行没有前一行,则charpos为零的标记没有前一个字符; 如果标记的行没有下一行,则带有等于行长度的字符的标记没有下一个字符。
本节讨论涉及标记的非常基本的操作,但是很多Hemlock编程都建立在改变标记处的一些文本的基础上。有关标记的更多扩展用途,请参阅更改和搜索文本。
种类的标记
商标可能有两种生命周期中的一种:临时或永久。在对文本进行任意操作后,永久标记仍然有效; 临时标记没有。使用临时标记是因为在创建和使用时涉及较少的簿记开销。如果在指向的文本之后使用临时标记已被修改,则结果将是不可预测的。永久标记继续指向相同的两个字符,无论在它们之前或之后进行插入和删除。
有两种不同类型的永久性标记,它们仅在文本插入标记位置时的行为不同; 文本插入左插入标记的左侧和右插入标记的右侧。
标记功能
markp mark[功能]
如果mark是标记对象,则此函数返回t,否则返回nil。
mark-line mark[功能]
此函数返回标记指向的行。
mark-charpos mark[功能]
此函数返回字符位置 在线 标记后的字符,即标记行中标记前的字符数。
mark-buffer mark[功能]
返回包含此标记的缓冲区。
mark-absolute-position mark[功能]
此函数返回字符位置 在缓冲区 标记后面的字符,即标记缓冲区中标记前面的字符数。
mark-kind mark[功能]
该函数返回的一个:right-inserting,:left-inserting或 :temporary取决于标记的那种。相应的setf形式会更改标记的种类。
previous-character mark[功能]
next-character mark[功能]
此函数返回标记位置之前(之后)的字符,如果没有上一个(下一个)字符,则返回nil。这些字符可以在存在时用setf设置; 当没有上一个或下一个字符时,这些表单的setf方法会发出错误信号。
制作标记
mark line charpos &optional 类[功能]
此函数返回一个标记对象,该对象指向该行的charpos’th字符。一种是那种标志的创造,一个:temporary,:left-inserting或:right-inserting。默认值为:临时。
copy-mark 标记 &optional 类[功能]
此函数返回一个指向同一位置和相同类型的新标记,如果提供的话,则返回其类型。
delete-mark 标记[功能]
此功能删除标记。完成使用后删除任何永久性标记。
with-mark ({(mark pos [kind])} *){form} *[Macro]
此宏将每个变量标记绑定到一种类型的标记,默认为标记:temporary,指向与markpos相同的位置。退出范围时,标记将被删除。最后一个表单的值是返回的值。
移动标记
这些功能破坏性地修改标记以指向新位置。本文档的其他部分描述了特定于高级文本形式的标记移动例程,而不是字符和行,例如单词,句子,段落,Lisp表单等。
move-to-position mark charpos &optional line[功能]
此功能将标记更改为指向线条上的给定字符位置。行默认为标记行。
move-to-absolute-position 标记 位置[功能]
此函数将标记更改为指向缓冲区中的给定字符位置。
move-mark 标记 新位置[功能]
此功能将标记移动到与标记新位置相同的位置并将其返回。
line-start 标记 &optional 线[功能]
line-end 标记 &optional 线[功能]
此功能将标记更改为指向行的开头或结尾并将其返回。行默认为标记行。
buffer-start 标记 &optional 缓冲区[功能]
buffer-end 标记 &optional 缓冲区[功能]
这些函数将标记更改为指向缓冲区的开头或结尾,默认为当前指向的缓冲区标记。如果缓冲区未被提供,则标记与任何缓冲区取消关联是错误的。
mark-before 标记[功能]
mark-after 标记[功能]
这些功能在当前位置之前或之后将标记更改为指向一个字符。如果当前位置之前/之后没有字符,则它们返回nil并保持未修改的标记。
character-offset 标记 n[功能]
此功能将标记更改为点n个字符(如果n为负,则为n之前)当前位置。如果在标记之前(之前)少于n个字符,则返回nil并且标记未被修改。
line-offset mark n &optional charpos[功能]
此功能将标记更改为当前位置之后的n行(如果n为负则为n之前)。如果未指定charpos,则得到的标记的字符位置是(min(行长度结果行)(mark-charpos mark)),或者如果是(min(行长度结果行)charpos)。与字符偏移一样,如果没有n行,则返回nil并且不修改标记。
地区
A region只是一对标记:起始标记和结束标记。区域中的文本由起始标记后面的字符和结束标记前面的字符组成(请记住,标记指向一行上的字符,而不是它们之间的字符)。通过修改区域中的起始或结束标记,可以产生具有开始和结束的区域,这些区域无序或甚至在不同的缓冲区中。这些区域的使用是不确定的,可能导致任意不良行为。
区域功能
region 开始 结束[功能]
此函数返回由标记start和end构造的区域。标记指向非连续行或结束后开始是错误的。
regionp 区域[功能]
如果region是region对象,则此函数返回t,否则返回nil。
make-empty-region[功能]
此函数返回一个区域,其开始和结束标记指向一个空行的开头。起始标记是:right-inserting 标记,结尾是:left-inserting标记。
copy-region 区域[功能]
此函数返回包含指定区域中文本副本的区域。在数据引用方面,结果区域与区域完全不相交—标记,线条,文本等。
region-to-string 区域[功能]
string-to-region 字符串[功能]
这些函数将区域强制转换为Lisp字符串,反之亦然。在字符串中,行由换行符分隔。
line-to-region 行[功能]
此函数返回包含线上所有字符的区域。第一个标记是:right-inserting,最后一个是 :left-inserting。
region-start 区域[功能]
region-end 区域[功能]
此函数返回区域的开始或结束标记。
region-bounds 区域[功能]
此函数返回区域的起始和结束标记的多个值。
set-region-bounds 区域 开始 结束[功能]
此函数将区域的开始和结束设置为开始和结束。从末尾开始或在不同的缓冲区中开始是一个错误。
count-lines 区域[功能]
此函数返回区域中的行数,包括第一行和最后一行。换行符与其后面的行相关联,因此包含一些非换行符后跟一个换行符的区域是一行,但如果在开头添加换行符,则它将是两行。
count-characters 区域[功能]
此函数返回给定区域中的字符数。这会将换行计为一个字符。
缓冲区
缓冲区是一个包含以下内容的对象:
由于Hemlock目前在Cocoa中的集成方式,所有对缓冲区内容的修改都必须在GUI线程中进行。Hemlock命令总是在GUI线程中运行,所以大多数时候你不需要担心它。如果您在另一个需要修改缓冲区的线程中运行代码,则应使用gui::execute-in-gui或执行该操作gui::queue-for-gui。
检查来自任何线程的缓冲区没有内在限制,但是,Hemlock目前没有锁定,因此如果您在GUI线程外部查看缓冲区,则可能会看到缓冲区处于不一致状态。
当前缓冲区
Hemlock具有“当前缓冲区”的概念。在Hemlock命令期间将当前缓冲区定义为接收调用该命令的键事件的片万字视图的缓冲区。许多hemlock函数在当前缓冲区上运行,而不是采用显式缓冲区参数。实际上,当前缓冲区是许多文本操作函数的隐式参数。
current-buffer[功能]
返回当前缓冲区,在命令执行期间,该缓冲区是作为命令目标的缓冲区。
current-point[功能]
此函数返回当前缓冲区的缓冲点。这是命令中常见的习惯用法,尽管它的实现很简单,但它仍然被定义。
current-point-collapsing-selection[功能]
首先取消激活任何活动区域后,此函数返回当前缓冲区的缓冲点。
current-point-extending-selection[功能]
在首先确定存在活动区域之后,此函数返回当前缓冲区的缓冲点 – 如果该区域已处于活动状态,则使其保持活动状态,否则它将在点处建立新的(空)区域。
current-point-for-insertion[功能]
此函数检查当前缓冲区是否可以在其当前点进行修改,如果没有则进行修改。否则,它会删除当前选择(如果有),并返回当前点。
current-point-for-deletion[功能]
此函数检查当前缓冲区是否可以在其当前点修改,如果不是则可以修改。否则,如果当前缓冲区中有一个部分,它将删除它并返回NIL。如果没有选择,则返回当前点。
current-point-unless-selection[功能]
此函数检查当前缓冲区是否可以在其当前点修改,如果不是则可以修改。否则,如果当前缓冲区中有选择,则返回NIL。如果没有选择,则返回当前点。
current-mark[功能]
此函数返回当前缓冲区标记堆栈的顶部。缓冲区的开头始终至少有一个标记,返回的所有标记都是右插入。
pop-buffer-mark[功能]
此函数弹出当前缓冲区的标记堆栈,返回标记。如果堆栈变空,则会在堆栈上推送指向缓冲区开始的新标记。这始终会停用当前区域(请参阅活动区域)。
push-buffer-mark 标记 &optional 激活区域[功能]
此功能将标记推入当前缓冲区的标记堆栈,确保标记正确插入。如果标记未指向当前缓冲区,则表示发生错误。(可选)使当前区域处于活动状态,但这永远不会停用当前区域(请参阅活动区域)。马克回来了。
push-new-buffer-mark 标记 &optional 激活区域[功能]
此功能将新标记推送到标记堆栈的位置mark。这等同于调用push-buffer-mark上(copy-mark mark)。
all-buffers[功能]
此函数返回使用make-buffer创建的所有缓冲区对象的列表。
*buffer-names*[变量]
此变量包含一个字符串表 ,将缓冲区的名称映射到相应的缓冲区对象。
缓冲功能
make-buffer name &key :modes :modeline-fields :delete-hook[功能]
default 模式 字段[Hemlock变量]
make 缓冲 钩[Hemlock变量]
make-buffer创建并返回具有给定名称的缓冲区。如果名为name的缓冲区已存在,则返回nil。模式是应该在缓冲区中有效的模式列表,首先是主模式,然后是任何次模式。如果省略,则创建缓冲区,其中包含的模式列表“Default Modes”。Modeline-fields是一个modeline-field对象列表(参见 Modelines部分),它可能是nil。delete-hook是特定于此缓冲区的删除挂钩列表,delete-buffer与Delete Buffer Hook一起调用这些挂钩。
使用make-buffer创建的缓冲区将输入到列表(all-buffers)中,并将它们的名称插入到string-table * buffer-names *中。创建缓冲区时,将使用新缓冲区调用钩子Make Buffer Hook。
bufferp 缓冲[功能]
如果buffer是缓冲区对象,则返回t,否则返回nil。
buffer-name 缓冲[功能]
buffer 名称 钩子[Hemlock变量]
buffer-name返回给定缓冲区的名称,该字符串。相应的setf方法使用缓冲区和新名称调用Buffer Name Hook,然后设置缓冲区的名称。当用户提供已存在缓冲区的名称时,setf方法会发出错误信号。
buffer-region 缓冲[功能]
返回缓冲区的区域。请注意,这是包含缓冲区中所有文本的区域,而不是hemlock-interface:current-region。
可以使用setf设置它来替换缓冲区的文本。
buffer-pathname 缓冲[功能]
buffer pathname hook[Hemlock变量]
buffer-pathname返回与给定缓冲区关联的文件的路径名,如果没有关联文件,则返回nil。这是文件的最新版本,因为它是最近读取或写入的时间。有一个setf表单来更改路径名。更改路径名时,将使用缓冲区和新值调用钩子缓冲区路径名钩子。
buffer-write-date 缓冲[功能]
以通用时间格式返回与缓冲区关联的文件的写入日期。如果设置了buffer-pathname,则使用setf将其设置为相应的写入日期,如果日期未知或没有文件,则使用nil。
buffer-point 缓冲[功能]
返回标记,该标记是缓冲区中的当前位置。要移动点,请使用hemlock-interface:move-mark或hemlock-interface:move-to-position
buffer-mark 缓冲[功能]
此函数返回缓冲区标记堆栈的顶部。缓冲区域的开头始终至少有一个标记,返回的所有标记都是右插入。
buffer-start-mark 缓冲[功能]
buffer-end-mark 缓冲[功能]
这些函数返回缓冲区域的开始和结束标记:
(buffer-start-mark buffer ) <==> (region-start (buffer-region buffer))
和
(buffer-end-mark buffer ) <==> (region-end (buffer-region buffer))
buffer-writable 缓冲[功能]
buffer 可写 钩子[Hemlock变量]
如果可以修改缓冲区,则此函数返回t,如果不能,则返回nil。如果缓冲区不可写,则任何尝试更改缓冲区中的文本都会导致错误。有一个setf方法来更改此值。setf方法在存储新值之前调用缓冲区中的Buffer Writable Hook中的函数和新值。
buffer-modified 缓冲[功能]
buffer 修改 钩[Hemlock变量]
如果缓冲区已被修改,则buffer-modified返回t,如果没有,则返回nil。只要在缓冲区上执行文本更改操作,就会设置此属性。有一个setf方法来更改此值。只要修改标志的值发生变化,setf方法就会使用缓冲区调用Buffer Modified Hook中的函数。
with-writable-buffer (缓冲) &body 体[宏]
此宏执行具有缓冲区可写状态集的表单。执行表单后,将重置缓冲区的可写和修改状态。
buffer-signature 缓冲[功能]
此函数返回一个反映缓冲区当前签名的任意数字。当且仅当在调用之间未修改缓冲区时,结果是eql到先前的结果。
buffer-variables 缓冲[功能]
buffer-modes 缓冲[功能]
此函数返回缓冲区中活动模式的名称列表。首先是主要模式,然后是任何次要模式。请参阅“ 模式”一章。
buffer-delete-hook 缓冲[功能]
此函数返回删除缓冲区时delete-buffer调用的缓冲区特定函数列表。这是可以设置的。
delete-buffer 缓冲[功能]
delete 缓冲 钩[Hemlock变量]
delete-buffer从(hemlock-interface:all-buffers)中删除缓冲区及其名称hi:*buffer-names*。在删除缓冲区之前,这将调用buffer-delete-hook返回的缓冲区上的函数和Delete Buffer Hook中的函数。如果buffer是当前缓冲区,或者它在任何视图中显示,则此函数会发出错误信号。
模式行
缓冲区可以指定一个模式行,一行文本,显示在视图的底部以指示状态信息。模型由一系列模式 – 字段对象描述,这些对象具有单独的更新功能并且可选地是固定宽度的。它们具有eql名称以方便引用和更新,但名称对于所有创建的modeline-field对象必须是唯一的。所有modeline-field函数都必须将缓冲区作为参数并返回一个字符串。当显示具有指定宽度的模式行字段时,更新函数的结果将被截断或填充在右侧以满足约束。
每当发生以下更改之一时,所有缓冲区的模式行字段都会更新:
- 设置缓冲区的主要模式。
- 其中一个缓冲区的次要模式打开或关闭。
- 重命名缓冲区。
- 缓冲区的路径名会发生变化。
- 缓冲区的修改状态发生变化。
该策略是,无论何时发生这些更改,都可以保证在下一次重新播放之前更新模式行。此外,由于系统无法知道用户添加了哪些更新功能依赖于这些值的模式行字段对象,或者他如何更改默认模式行字段,因此我们必须更新所有字段。
用户应注意,可以随时更新模型,因此更新功能应小心避免不必要的延迟(例如,等待局域网确定信息)。
make-modeline-field &key :name :width :function[功能]
此函数返回具有名称,宽度和函数的modeline-field对象。宽度默认为nil,表示该字段是可变宽度; 否则,程序员必须将其作为正整数提供。函数必须将缓冲区作为参数并返回一个字符串。如果name已经命名了一个modeline-field对象,那么这就是一个错误信号。
modeline-field-name modeline-field[功能]
此函数返回modeline-field对象的name字段。如果使用setf设置,并且新名称已经命名了一个modeline-field,则setf方法会发出错误信号。
modeline-field-p modeline-field[功能]
如果参数是modeline-field对象,则此函数返回t,否则返回nil。
modeline-field 名称[功能]
这将返回名为name的modeline-field对象。如果不存在,则返回nil。
modeline-field-function modeline-field[功能]
返回更新modeline-field时调用的函数。当使用setf设置此项时,setf方法会更新包含给定字段的所有缓冲区上所有视图的modeline-field,因此下一次通过重新显示的行程将反映更改。所有modeline-field函数都必须将缓冲区作为参数并返回一个字符串。
modeline-field-width modeline-field[功能]
返回约束modeline-field的宽度,或nil表示它是可变宽度。当使用setf设置时,setf方法会更新包含给定字段的所有缓冲区上所有视图的所有模式行字段,因此下一次通过重新显示的行程将反映更改。
buffer-modeline-fields 缓冲[功能]
返回缓冲区的modeline-field对象列表的副本。可以破坏性地修改此列表而不影响缓冲区模式行的显示,但修改任何特定字段的组件(例如,宽度或函数)会导致更改在使用修改的模式行字段的每个模式行显示中通过重新显示反映到下一行。当使用setf设置此值时,setf方法方法会更新缓冲区上所有视图的所有模式行字段,因此通过重新显示的下一行将反映更改。
buffer-modeline-field-p 缓冲器 字段[功能]
如果field,modeline-field或name的名称在缓冲区的modeline-field对象列表中,则返回; 否则,返回nil。
update-modeline-fields 缓冲[功能]
进行排列,以便使用当前命令结尾处的最新值更新模式行显示。
改变和搜索文本
关于标记和文本更改的注释::临时标记在对标记指向的缓冲区进行任何更改后无效; 在进行此类更改后使用临时标记是错误的。
如果文本被删除,其中有永久性标记指向它,那么它们将指向文本所在的位置。
改变文字
insert-character 标记 字符[功能]
insert-string 标记 字符串[功能]
insert-region 标记 区域[功能]
在标记处插入字符,字符串或区域。insert-character如果字符不是,则表示错误string-char-p。如果字符串或区域为空,并且标记位于某个缓冲区中,则Hemlock保留缓冲区修改的标记缓冲区不受影响。
ninsert-region 标记 区域[功能]
比如insert-region,将区域插入标记的位置,破坏源区域。这必须谨慎使用,因为如果其他人可以参考源区域,则会发生坏事。特别是,应确保该区域未链接到任何现有缓冲区。如果region为空,并且mark在某个缓冲区中,那么Hemlock会对标记缓冲区的缓冲区修改不受影响。
delete-characters 标记 n[功能]
这将删除标记后的n个字符(如果n为负,则删除-n)。如果标记之后(或-n之前)的n个字符不存在,则返回nil; 否则,它返回t。如果n为零,并且标记位于某个缓冲区中,则Hemlock将标记缓冲区的缓冲区修改保留为不受影响。
delete-region 区域[功能]
这会删除区域。这比删除并保存区域(下面)更快,因为没有行被复制。如果region为空并且包含在某个缓冲区的缓冲区中,则Hemlock将缓冲区修改后的缓冲区保持不受影响。
delete-and-save-region 区域[功能]
这将删除区域并返回包含原始区域文本的区域。如果region为空并且包含在某个缓冲区的缓冲区中,则Hemlock将缓冲区修改后的缓冲区保持不受影响。在这种情况下,这将返回一个不同的空区域。
filter-region 功能 区[功能]
通过将每行的文本替换为包含该文本的字符串的函数的结果,破坏性地修改区域。功能必须遵守以下限制:
- 该论点可能不会被破坏性地修改。
- 返回值可能不包含换行符。
- 从函数返回后,返回值可能不会被破坏性地修改。
字符串按顺序传递。
使用此功能,可以通过以下方式将区域大写: (filter-region #’string-upcase region)
文本谓词
start-line-p 标记[功能]
如果标记指向行中第一个字符之前,则返回t,否则返回nil。
end-line-p 标记[功能]
如果标记指向行中最后一个字符之后和换行符之前,则返回t,否则返回nil。
empty-line-p mark [功能]如果标记指向的行不包含任何字符,则返回t。
blank-line-p 行[功能]
如果line仅包含Whitespace属性为1的字符,则返回t。有关字符属性 的讨论,请参阅“ 字符属性”一章。
blank-before-p 标记[功能]
blank-after-p 标记[功能]
这些函数测试它所在行上的标记之前或之后的所有字符是否具有Whitespace属性为1。
same-line-p mark1 mark2[功能]
如果mark1和mark2指向同一行,则返回t,否则返回nil; 那是,
(same-line-p a b) <==> (eq (mark-line a) (mark-line b))
mark< mark1 mark2[功能]
mark<= mark1 mark2[功能]
mark= mark1 mark2[功能]
mark/= mark1 mark2[功能]
mark>= mark1 mark2[功能]
mark> mark1 mark2[功能]
这些谓词测试一段文本中两个标记的相对顺序,即如果标记指向其后的位置,则标记为>另一个标记。如果标记不指向同一缓冲区,则会发出错误信号,除非对于此类标记,mark =始终为false且mark / =始终为true。
line< line1 line2[功能]
line<= line1 line2[功能]
line>= line1 line2[功能]
line> line1 line2[功能]
这些谓词测试line1和line2的顺序。如果行不在同一缓冲区中,则会发出错误信号。
lines-related line1 line2[功能]
如果line1和line2在同一个缓冲区中,则此函数返回t,否则返回nil nil。
first-line-p 标记[功能]
last-line-p 标记[功能]
first-line-p如果在打开线标记之前没有线,则返回t,否则返回nil。Last-line-p类似的测试测试标记后是否没有线。
杀死戒指
从缓冲区中删除 了一个全局的区域环。在执行修改之前,某些命令会将受影响区域保存在kill ring上。您应该考虑使命令可撤消,但这是一种简单的方法,可以实现用户恢复的不太令人满意的方法。
kill-region 区域 电流型[功能]
这会杀死区域,将其保存在杀戮戒指中。Current-type是:kill-forward或:kill-backward。当这hemlock-interface:last-command-type 是其中之一时,这会分别将区域添加到杀伤环顶部的开头或结尾。使用命令Undo可以撤消调用它的结果(参见Hemlock用户手册)。这会将last-command-type设置为current-type,并与kill-characters进行交互。
kill-characters 标记 计数[功能]
character 删除 阈值 (初始 值 5)[Hemlock变量]
如果计数为正,则kill-characters在mark之后杀死count个字符,否则在mark之前如果count为负则杀死。当count大于或等于Character Deletion Threshold时,被杀死的字符将保存在kill ring中。hemlock-interface:last-command-type为了与阈值进行比较,可以连续多次调用(即,不 设置)以累积有效计数。
这将设置last-command-type,并与kill-region进行交互。当它向kill ring添加一个新区域时,它将last-command-type设置为:kill-forward(如果count为正)或:kill-backward(如果count为负)。当last-command-type为:kill-forward或:kill-backward时,这会将kill字符添加到kill ring顶部的开头(如果count为负)或end(如果count为正数),则设置last-command-type,好像它向kill ring添加了一个新区域。当kill ring不受影响时,将last-command-type设置为:char-kill-forward或:char-kill-backward,具体取决于count是正还是负。
如果删除字符,则返回标记。如果在适当的方向上没有计数字符,则返回nil。
活跃地区
每个缓冲区都有一个标记堆栈和一个标记,称为大多数文本在名义上发生变化的点。在标记堆栈的顶部,当前标记和当前缓冲区的点(当前点)之间,即所谓的当前区域。当用户试图在当前区域上操作而没有被激活时,某些命令会发出错误信号。如果用户关闭此功能,则当前区域实际上始终处于活动状态。
在编写标记文本区域的命令时,程序员应确保激活该区域。这通常从用于标记区域的基元自然发生,但有时您必须明确激活该区域。这些命令应该以这种方式编写,因此它们不需要用户单独标记区域然后激活它。修改区域的命令不必担心停用该区域,因为修改缓冲区会自动停用该区域。插入文本的命令通常会短暂地激活该区域; 也就是说,该区域对紧随其后的命令是活动的,允许用户想要删除插入的区域,填充它或其他任何东西。
一旦标记命令使该区域激活,它将保持活动状态,直到:
- 命令使用该区域,
- 命令修改缓冲区,
- 命令改变当前窗口或缓冲区,
- 命令发出编辑错误信号,
- 或用户输入Cg。
active 区域 启用 (初始 值 t)[Hemlock变量]
当此变量为非零时,如果该区域未处于活动状态,则某些基元会发出编辑器错误信号。对于更传统的Emacs区域语义,这可以设置为nil。
*ephemerally-active-command-types*[变量]
这是一个命令类型列表,其初始值是以下列表:ephemerally-active和:unkill。当前一个命令的类型是其中之一时,当前区域仅对当前正在执行的命令有效,无论它是否执行某些操作以停用该区域。但是,当前命令可以激活该区域以用于将来的命令。:ephemerally-active是一个默认命令类型,可用于临时激活区域,并且:unkill是两个命令使用的类型,Un-kill和Rotate Kill Ring(用户通常认为是Cy和My)。
activate-region[功能]
这使得当前区域活跃。
deactivate-region[功能]
调用此项后,当前区域不再处于活动状态。
region-active-p[功能]
返回当前区域是否处于活动状态,包括短暂的。这会忽略活动区域已启用。
check-region-active[功能]
当启用活动区域时,这表示编辑器错误,并且当前区域未激活。
current-region &optional error-if-not-active deactivate-region[功能]
这将返回由当前标记和当前点形成的区域,如果当前区域未激活,则可选地发出编辑器错误信号。错误 – 如果不活动默认为t。每次调用都返回一个不同的区域对象 根据deactivate-region(默认为t),获取当前区域会将其取消激活。无论区域是否处于活动状态,Hemlock原语都可以自由修改文本,因此检查此内容的命令可以在方便时停用该区域。
搜索和替换
在使用任何这些函数进行字符搜索之前,请查看 字符属性。它们提供了类似于真实Emacs中的语法表的工具。语法表是一种功能强大,通用且高效的机制,用于在各种模式下为字符分配含义。
new-search-pattern 种类 方向 模式 &optional 结果 – 搜索模式[功能]
返回一个搜索模式对象,可以将其赋予find-pattern和replace-pattern函数。搜索模式是要执行的特定搜索类型的规范。direction是:forward或:backward,表示要搜索的方向.sty表示要搜索的搜索模式的类型,pattern表示要搜索的内容。模式的解释取决于所制作的模式的类型。目前定义的搜索模式有:
:字符串不敏感
不区分大小写的字符串是否搜索模式
:字符串大小写
区分大小写的字符串是否搜索模式。
:字符
查找字符模式的出现次数。这是区分大小写的。
:不字符
找到一个不是字符图案的字符。
:测试
找到满足函数模式的字符。此函数可能无法以任何特定方式应用,因此它应仅取决于其参数是什么,并且应该没有副作用。
:测试不
类似于:test,除了它找到一个未通过测试的字符。
:任何
查找字符串模式中的字符。
:没有
查找不在字符串模式中的字符。
结果搜索模式(如果提供)是一种搜索模式,用于破坏性地修改以生成新模式。在合理的情况下应该提供,因为某些类型的搜索模式可能涉及大型数据结构。
search-pattern-p 搜索模式[功能]
如果search-pattern是搜索模式对象,则返回t,否则返回nil。
get-search-pattern 字符串 方向[功能]
get-search-pattern接口指向搜索和替换命令可以使用的默认搜索字符串和模式。然后,这些命令在提示搜索或替换内容时共享默认值,并在每次执行时保存搜索模式。这在更新模式对象时使用默认搜索类型(请参阅Hemlock用户手册)。
*last-search-string*[变量]
返回搜索的最后一个字符串,在提示时很有用。
find-pattern 标记 搜索模式[功能]
从mark开始查找搜索模式的下一个匹配项。如果找到匹配,则将标记更改为指向匹配文本之前的点,并返回匹配的字符数。如果未找到匹配项,则返回nil并且不修改标记。
replace-pattern 标记 搜索模式 替换 &optional n[功能]
将search-pattern的n个匹配替换为从mark开始的字符串替换。如果n为nil(默认值),则替换所有匹配项。返回完成最后一次替换之前的标记。
当前环境
不同的范围
在Hemlock中,变量,键绑定和 字符属性的“当前”值 取决于当前缓冲区 及其中活动的模式。Hemlock值有三种可能的范围:
缓冲本地
仅当缓冲区是本地缓冲区时才存在该值。
模式本地
仅当当前模式在当前缓冲区中处于活动状态时,才会显示该值。
全球
除非被缓冲区或模式本地值遮挡,否则该值始终存在。
阴影
在不同的范围内,同一事物可能存在不同的值。例如,可能存在给定变量的全局绑定以及当前缓冲区中的本地绑定。每当发生冲突时,都会发生阴影,只允许其中一个值在当前环境中可见。
解决此类冲突的过程可以描述为搜索可能定义值的位置列表,返回找到的第一个值。搜索顺序如下:
- 当前缓冲区中的本地值。
- 按照从最高优先级模式到最低优先级模式的顺序,模式当前缓冲区的次要模式中的本地值。具有相同优先级的次模式的顺序是未定义的。
- 在当前缓冲区的主模式下模式本地值。
- 全球价值观。
铁杉变种
Hemlock实现了一个与普通Lisp变量分开的变量系统,原因如下:
- Hemlock有不同的范围规则,在编辑器中很有用。Hemlock变量可以是缓冲区或模式的本地变量。
- Hemlock变量有钩子,当有人设置变量时调用的函数列表。请参阅Hemlock传递给这些钩子函数的参数的变量值。
- 有一个变量名称和文档的数据库,可以更容易地找出存在哪些变量及其值的含义。
变量名称
对于用户,变量名称是不区分大小写的字符串。该字符串称为变量的字符串名称。字符串名称通常由用空格分隔的单词组成。
在Lisp代码中,变量名称是符号。通过用连字符替换字符串名称中的任何空格来创建此符号的名称。此符号名称始终在Hemlock包中实现。
*global-variable-names*[变量]
此变量包含所有全局Hemlock变量名称的字符串表。每个条目的值是变量的符号名称。
current-variable-tables[功能]
此函数返回当前在当前缓冲区中全局建立的变量表的列表,以及当前缓冲区的模式。此列表适用于prompt-for-variable。
变量函数
在以下描述中,name是变量的符号名称。
defhvar string-name documentation &key :mode :buffer :hooks :value[功能]
此函数定义Hemlock变量。当变量未定义时,采用变量名称的函数会发出错误信号。
字符串名称
要定义的变量的字符串名称。
文件
变量的文档字符串。
模式,缓冲区
如果提供了缓冲区,则该变量对该缓冲区是本地的。如果提供了mode,则它是该模式的本地模式。如果两者都没有提供,则它是全局的。
值
这是变量的初始值,默认为nil。
挂钩
这是有人设置变量值时要调用的函数的初始列表。这些函数在Hemlock建立新值之前执行。请参阅传递给钩子函数的参数的变量值。
如果具有相同名称的变量已存在于同一位置,则defhvar会在挂钩和值中设置其挂钩和值(如果用户提供这些关键字)。
variable-value 名 &optional 种 在那里[功能]
此函数在某个位置返回Hemlock变量的值。为类型定义了以下值:
:当前
返回当前环境中存在的值,同时考虑任何模式或缓冲区局部变量。这是默认值。
:全球
返回全局值。
:模式
返回名为where的模式中的值。
:缓冲
返回缓冲区中的值。
当使用setf设置时,Hemlock设置指定变量的值,并使用name,kind,where和新值调用其钩子列表中的函数。
variable-documentation 名 &optional 种 在那里[功能]
variable-hooks 名 &optional 种 在那里[功能]
variable-name 名 &optional 种 在那里[功能]
这些函数返回Hemlock变量的文档,钩子和字符串名称。种类和where参数与变量值相同。可以使用setf设置文档和挂钩列表。
string-to-variable 字符串[功能]
此函数将字符串转换为相应的变量符号名称。字符串不必是实际Hemlock变量的名称。
value 名称[微距]
setv name new-value[Macro]
这些宏获取并设置Hemlock变量名称的当前值。不评估名称。有一个setf形式value。
hlet ({(var value)} *){form} *[Macro]
这个宏非常类似于让它生效; 在其范围内,每个Hemlock变量var都具有相应的值,但在通过任何方式退出范围后,将删除绑定。这不会导致调用任何钩子。返回最后一个表单的值。
hemlock-bound-p 名 &optional 种 在那里[功能]
如果name在由kind和where指定的位置定义为Hemlock变量,则返回t,否则返回nil。
delete-variable 名 &optional 种 在那里[功能]
delete 变量 钩[Hemlock变量]
delete-variable使Hemlock变量名不再在指定位置定义。种类和具有与变量值相同的含义,除了:当前不可用,并且种类的默认值为:global
如果不存在此类变量,则将发出错误信号。在删除变量之前,使用相同的参数调用钩子,Delete Variable Hook。
钩
诸如设置变量,更改缓冲区,更改窗口,打开和关闭模式等的铁杉行为通常具有与它们相关联的钩子。钩子是在系统执行操作之前调用的函数列表。该手册描述了对象特定的钩子以及在这些对象上定义的其余操作。
通常,钩子存储在Hemlock变量,Delete Buffer Hook和Set Window Hook中。这导致了一点点混淆,因为这些变量具有系统在有人更改其值时执行的挂钩。当有人设置变量时,Hemlock调用的这些钩子函数是存储在对象而不是Hemlock变量中的钩子的示例。这些都是编辑器活动的钩子,但是Hemlock将它们保存在不同的位置。这就是为什么本节中的一些例程对hook place参数有一个特殊的解释。
add-hook 地方 钩乐趣[宏]
remove-hook 地方 钩乐趣[宏]
这些宏在某些地方添加或删除钩子函数。如果已经存在hook-fun,则此调用无效。如果place是一个符号,那么它就是一个Hemlock变量; 否则,它是一个广义变量或存储位置。以下是两个例子:
(add-hook delete-buffer-hook ‘remove-buffer-from-menu)(add-hook (variable-hooks ‘check-mail-interval) ‘reschedule-mail-check)
invoke-hook 放置 &rest args[宏]
该宏调用所有函数。如果place是一个符号,那么它就是一个Hemlock变量; 否则,它是一个广义变量。
命令
介绍
用户告诉Hemlock执行某些操作的方式是调用命令。命令有三个属性:
名称
命令的名称提供了引用它的方法。命令名称通常是由空格分隔的大写单词,例如前向单词。
文件
联机帮助工具使用命令的文档。
功能
命令由Lisp函数实现,该函数可从Lisp调用。
定义命令
*command-names*[变量]
保存将命令名称与命令对象关联的字符串表。只要定义了新命令,就会在此表中输入。
defcommand {command-name | (command-name function-name &amp; key)} lambda-list command-doc {function-doc} {form} *[Macro]
定义名为name的命令。defcommand创建一个函数来实现lambda-list和提供的表单中的命令。lambda-list必须指定一个必需参数,见下文,按惯例通常命名p。如果调用者未指定function-name,则defcommand通过用连字符替换所有空格并附加“-command”来创建命令名称。任何关键字参数都是make-command。Command-doc成为命令的命令文档。Function-doc(如果存在)将成为函数的文档,主要应描述将命令作为函数调用所涉及的问题,例如任何其他参数。
make-command 名称 文档 功能 &key :transparent-p[功能]
使用命令文档文档和函数函数定义名为name的新命令。如果:transparent-p为true,则命令变为透明。输入到字符串表中hemlock-interface:*command-names*的命令,命令对象作为其值。通常,命令实现者将使用defcommand宏,但这允许在较低级别访问命令定义机制,这有时是有用的。
commandp 命令[功能]
如果command是命令对象,则返回t,否则返回nil。
command-documentation 命令[功能]
command-function 命令[功能]
command-name 命令[功能]
返回命令的文档,函数或名称。这些可以用setf设置。
命令文档
命令文档描述了命令作为扩展命令或从密钥调用时的作用。命令文档可以是字符串或函数。如果文档是字符串,那么第一行应简要概括该命令,其余行填充详细信息。例:
(defcommand “Forward Character” (p) “Move the point forward one character. With prefix argument move that many characters, with negative argument go backwards.”. . .)
命令文档也可以是一个参数的函数。使用:short或:full调用该函数,表示该函数应返回一个简短的文档字符串或执行某些操作以完全记录该命令。
命令解释器
命令解释器是事件处理程序调用的功能,用于处理来自键盘的键事件,并根据用户键入的内容分派给不同的命令。当命令解释器执行命令时,我们说它调用命令。命令解释器还为连续运行的命令(例如最后一个命令类型寄存器)之间的通信提供便利。它还负责重置通信机制,清除回声区域,显示用户缓慢键入的部分键等。
控制命令解释器
command 中止 钩子[Hemlock变量]
只要有人中止命令,命令解释器就会调用此变量中的函数(例如,如果某人调用了编辑器错误)。
编辑输入
编辑器输入的规范表示是键事件结构。用户可以将命令绑定到键,键是非空的键事件序列。键事件由称为键的识别标记和表示修饰符的位字段组成。用户通过提供反映键盘键上图例的名称来定义键名。用户类似地定义修饰符名称,但系统选择用于识别修饰符的位和掩码。您可以使用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语法由双引号分隔。在双引号内,空格分隔多个键事件。单个键事件可选地以由连字符终止的修饰符名称开始。修饰符名称是字符的字符序列,系统使用不区分大小写。以下修饰符是一个键名称,如果它由多个字符组成,则不区分大小写,但如果名称只包含单个字符,则它区分大小写。
您可以使用反斜杠转义特殊字符—连字符,双引号,开角支架,近角括号和空格—您可以通过连续使用两个来指定反斜杠。您可以使用尖括号括起一个包含许多特殊字符的keysym名称。在键名称位置出现的尖括号之间,只有两个特殊字符,即闭合尖括号和反斜杠。
有关键事件的更多信息,请参阅键事件部分。
将命令绑定到键
命令解释器根据确定要调用的命令 键绑定。密钥绑定是命令和一系列密钥事件之间的关联。一系列键事件称为键,由单个键事件或键事件的序列(列表或向量)表示。
由于键绑定可以是模式或缓冲区的本地,因此当前环境确定在任何给定时间有效的键绑定集。当命令解释器试图找到一个键的绑定时,它首先检查当前缓冲区中是否存在本地绑定,然后是否在每个次模式和当前缓冲区的主模式中都存在绑定,最后检查是否存在全局绑定。如果未找到任何绑定,则命令解释程序会发出蜂鸣声或闪烁屏幕以指示此情况。
bind-key 命名 键 &optional 样的 地方[功能]
此函数在某些环境中关联命令名称和密钥。密钥是键事件或一系列键事件。有三种可能的类型值:
:全球
默认情况下,进行全局键绑定。
:模式
在名称所在的模式下进行模式特定的键绑定。
:缓冲
制作一个缓冲区域的本地绑定。
如果密钥是已经存在于指定位置的密钥绑定的某个前缀,则新密钥将覆盖旧密钥绑定,从而有效地删除它。
do-alpha-key-events 对于在某些新模式下设置绑定很有用。
command-bindings 命令[功能]
此函数返回命令绑定的位置列表。一个位置被指定为键的列表(总是一个向量),绑定的类型,以及where(绑定为本地的模式或缓冲区,如果是全局的则为nil)。
delete-key-binding 关键 &optional 种 在那里[功能]
此函数在某些地方删除了键的绑定。密钥是键事件或一系列键事件。kind是要删除的绑定类型,其中之一是:global(默认值),: mode或:buffer。如果kind是:mode,模式名称在哪里,如果kind是:buffer,那么缓冲区在哪里。
如果密钥未绑定,则此功能发出错误信号。
get-command 关键 &optional 种 在那里[功能]
此函数返回绑定到key的命令,如果未绑定则返回nil。密钥是键事件或一系列键事件。如果key是某些键的初始子序列,则返回关键字:prefix。有四种情况:
:当前
使用当前缓冲区的搜索列表返回密钥的当前绑定。如果键有任何透明键绑定,则它们将作为第二个值在列表中返回。
:全球
返回key的全局绑定。这是默认值。
:模式
在名为where的模式下返回key的绑定。
:缓冲
返回键本地绑定到缓冲区所在的位置。
map-bindings 函数 种类 &optional 其中[功能]
此函数映射到某些位置的键绑定。对于每个绑定,这将传递密钥和绑定到它的命令。种类和bind-key中的相同。在给定的迭代之后,密钥不保证保持有效。
关键翻译
密钥转换是命令解释器在执行任何其他操作之前应用于密钥的过程。有两种关键翻译:替换和位前缀。在任何一种情况下,命令解释器在指定的键事件序列出现在键中时都会转换键。
在替换转换中,系统用另一个键事件序列替换匹配的子序列。密钥转换不会递归地应用于替换的键事件。
在位前缀转换中,系统删除匹配的子序列,并有效地设置密钥中下一个键事件中的指定位。
在翻译密钥时,如果系统遇到密钥事件的不完整的最终子序列,则会中止翻译过程。当最后的键事件形成某些翻译的前缀时会发生这种情况。当它们转换为位前缀时也会发生这种情况,但系统无法应用指示的修饰符。如果对此部分未翻译的密钥有绑定,则命令解释程序将调用该命令; 否则,它将等待用户键入更多的键事件。
key-translation 关键[功能]
此表单是可设置的,允许用户注册命令解释器将在用户键入键事件时使用的关键翻译。
此函数返回key的键转换,如果没有则返回nil。密钥是键事件或一系列键事件。如果key是翻译的前缀,则返回:prefix。
键转换是键或修饰符规范。位转换具有列表形式:(:bits {bit-name} *)。
每当key作为绑定操作函数的键参数的子序列出现时,该部分将被替换为翻译。
透明键绑定
模式本地的键绑定可以是透明的。透明键绑定不会遮蔽较少的本地键绑定,而是指示应在第一个正常键绑定之前调用绑定命令。透明键绑定主要用于实现自动填充和单词缩写等次要模式。对于给定键,可能存在多个透明键绑定,在这种情况下,所有透明命令都按照它们被找到的顺序被调用。如果键入的键没有正常的键绑定,那么即使存在透明的键绑定,命令解释器也会表现为键未绑定。
:transparent-p参数用于hemlock-interface:defmode确定模式中的所有键绑定是否透明。此外,可以通过对defcommand和make-command的:transparent-p参数声明特定命令是透明的。
命令类型
在许多编辑器中,命令的行为取决于在它之前调用的命令的类型。Hemlock提供了一种支持这种称为的机制command type。
last-command-type[功能]
这将返回调用的最后一个命令的命令类型。如果使用setf设置,则提供的值将成为last-command-type的值,直到下一个命令完成。如果上一个命令没有设置last-command-type,那么它的值为nil。通常,命令类型是关键字。由于透明键绑定而调用命令后,不会清除命令类型。
命令参数
可以通过三种方式调用命令:它可以绑定到已键入的键,可以作为扩展命令调用,或者可以将其称为Lisp函数。理想情况下,命令应该以这样的方式编写,即无论调用它们的方式,它们都会表现得很明智。如果命令要正常运行,则实现命令的函数必须遵守关于参数传递的某些约定。
前缀参数
每当调用一个命令时,它都会作为第一个参数传递,这就是所谓的前缀参数。prefix参数始终是整数或nil。当命令使用此值时,它通常作为重复计数或某些概念上类似的函数。
prefix-argument[功能]
此函数返回prefix参数的当前值。使用setf设置时,新值将成为下一个命令的前缀参数。如果前一个命令未设置前缀参数,则命令的前缀参数为nil。由于透明键绑定,在调用命令后,不会清除prefix参数。
Lisp参数
通常需要从Lisp代码调用命令,在这种情况下,否则将提示的参数将作为prefix参数后面的可选参数传递。命令应该提示未提供的任何参数。
模式
模式是Hemlock值的集合,其可以根据手头的编辑任务存在于 当前环境中。典型模式的一个示例是Lisp,用于编辑Lisp代码。
模式挂钩
将模式添加到缓冲区或从缓冲区中删除模式时,将调用其模式挂钩。钩子函数有两个参数,包括缓冲区和t(如果正在添加模式)或nil(如果它被删除)。模式挂钩通常用于使模式执行额外的操作。例如,有人可能会创建一个文本模式挂钩,在您输入时打开自动填充模式。
主要和次要模式
有两种模式,主要模式和次要模式。缓冲区总是只有一个主要模式,但它可能有任意数量的次要模式。主要模式可能具有模式字符属性,而次要模式可能没有。
主要模式通常用于以某种主要方式更改环境,例如安装用于编辑某些语言的特殊命令。次要模式通常会改变环境的一些小属性,例如线条是否在太长时间后自动断开。无论主要模式和次要模式有效,小模式都应该起作用。
default 模式 (初始 值 &#039;(“基本” &quot;“保存”)[Hemlock变量]
此变量包含模式名称列表,当没有其他信息可用时,这些模式名称将在缓冲区中实例化。
*mode-names*[变量]
保存所有模式名称的字符串表。
illegal[Hemlock Command]
这是一个有用的命令,可以在希望通过使它们实际上非法的方式影响全局绑定的模式中进行绑定。此外,虽然不太可能,但较小的模式可能会影响主模式绑定。此命令调用编辑器错误。
模式功能
defmode name &key :setup-function :cleanup-function :major-p :precedence :transparent-p :documentation[功能]
此函数定义名为name的新模式,并将其输入 hemlock-interface:*mode-names*。如果提供major-p并且不是nil,则模式是主要模式; 否则它是次要模式。
Setup-function和cleanup-function分别是在模式打开后和关闭之前调用缓冲区调用的函数。这些函数通常用于创建缓冲区本地键或变量绑定,并在关闭模式时删除它们。
优先级仅对次要模式有意义。次模式的优先级决定了它在缓冲区模式列表中的顺序。在当前环境中搜索值时,将按顺序搜索次要模式,因此次要模式的优先级确定在存在多个定义时找到的值。
Transparent-p确定定义模式的本地键绑定是否透明。除了找到的第一个普通键绑定之外,还调用透明键绑定,而不是遮蔽较少的本地键绑定。
文档是关于该模式的一些介绍性文本。诸如Describe Mode之类的命令使用它。
mode-documentation 名称[功能]
此函数返回名为name的模式的文档。
buffer-major-mode 缓冲[功能]
buffer 主 模式 挂钩[Hemlock变量]
buffer-major-mode返回缓冲区主模式的名称。主要模式可以用setf改变; 然后使用缓冲区和新模式调用Buffer Major Mode Hook。
buffer-minor-mode 缓冲区 名称[功能]
buffer 小 模式 钩子[Hemlock变量]
如果次模式名称在缓冲区中处于活动状态,则buffer-minor-mode返回t,否则返回nil。可以使用setf打开或关闭次要模式; 然后使用缓冲区,名称和新值调用Buffer Minor Mode Hook。
mode-variables 名称[功能]
返回模式局部变量的字符串表。
mode-major-p 名称[功能]
如果name是主要模式的名称,则返回t;如果是次要模式的名称,则返回nil。名称不是模式的名称是错误的。
角色属性
介绍
字符属性提供有关字符信息的全局数据库。此工具类似于其他编辑器(如Emacs)的语法表,但更为通用。例如,您应该为需要有关字符是否为空格的信息的命令使用字符属性。出于以下原因使用字符属性:
- 如果这些信息都在一个地方,那么通过更改语法表就可以轻松地更改编辑器的行为,这比将字符常量连接到命令更容易。
- 信息的集中化避免了不必要的重复工作。
- 语法表原语可能比可以在原始级别之上写入的任何内容更快。
请注意,角色属性方案的一个重要部分是角色属性是全局的,并且供用户更改。不应将有关某些命令集内部(以及用户不应了解的)字符的信息保留为字符属性。对于这样的用途,该功能提供了各种角色搜索能力hemlock-interface:find-pattern。20)。
字符属性名称
对于Hemlock变量,字符属性具有用户可见的字符串名称,但在Lisp代码中称为符号。字符串名称通常由空格分隔的大写单词组成,通过用连字符替换所有空格并在关键字包中实现此字符串,将其转换为关键字。因此,名为“Ada Syntax”的属性将变为:ada-syntax。
*character-attribute-names*[变量]
只要定义了字符属性,就会在此字符串表中输入其名称 ,并将相应的关键字作为值。
字符属性函数
defattribute 名称 文档 &optional 类型 初始值[功能]
此函数定义一个名称为字符串的新字符属性。字符属性操作将属性参数作为关键字,其名称为大写,其中空格由连字符替换。
文档描述了character属性的用法。
Type,默认为(mod 2),指定character属性值的类型。字符属性的值可以是可以指定为make-array的任何类型。初始值(默认值0)是所有字符最初对此属性具有的值。
character-attribute-name 属性[功能]
character-attribute-documentation 属性[功能]
这些函数返回属性的名称或文档。
character-attribute 属性 字符[功能]
character 属性 钩子[Hemlock变量]
character-attribute返回character的属性值。如果属性未定义,则表示错误。
setf将设置角色的属性。此setf方法在进行更改之前调用属性和字符的Character Attribute Hook中的函数。
如果character为nil,则可以访问或设置缓冲区开头或结尾的属性值。缓冲区的开头和结尾因此成为一种虚构的字符,在许多情况下简化了字符属性的使用。
character-attribute-p 符号[功能]
如果symbol是字符属性的名称,则此函数返回t,否则返回nil。
shadow-attribute 属性 字符 值 模式[功能]
shadow 属性 钩子[Hemlock变量]
在模式模式下,此函数将值设置为字符属性属性的值。模式必须是主模式的名称。调用此函数时,将使用相同的参数调用Shadow Attribute Hook。如果在值被遮蔽时设置属性的值,则仅影响阴影值,而不影响全局值。
unshadow-attribute 属性 字符 模式[功能]
unshadow 属性 钩子[Hemlock变量]
使角色的属性值不再在模式中被遮蔽。Unshadow属性Hook在调用此函数时使用相同的参数调用。
find-attribute 标记 属性 &optional 测试[功能]
reverse-find-attribute 标记 属性 &optional 测试[功能]
这些函数查找下一个(或上一个)字符,该字符具有从mark开始的字符属性属性的某些值。它们传递测试一个参数,即测试角色的属性值。如果测试成功,则这些例程将标记修改为(在反向查找属性之后)满足测试的字符。如果没有字符满足测试,那么这些返回nil,并且标记保持不变。测试默认为#’not-zerop。无法保证测试以任何特定方式应用,因此它应该没有副作用,并且仅取决于其参数。
find-not-attribute 标记 属性[功能]
reverse-find-not-attribute 标记 属性[功能]
它们分别等同于(find-attribute mark属性#’zerop)和(reverse-find-attribute mark属性#’zerop)。
角色属性钩子
将字符属性机制用作关于字符的其他信息的抽象接口通常很有用,这些信息实际上存储在别处。例如,Hemlock的某些实现可能决定定义一个Print Representation属性,该属性控制字符在输出设备上的显示方式。
为了使这很容易,每个属性都有一个钩子函数列表,只要当前值因任何原因发生变化,就会用属性,字符和新值调用它们。
character-attribute-hooks 属性[功能]
返回属性的当前挂钩列表。这可以用setf设置。在hemlock-interface:add-hook和hemlock-interface:remove-hook宏都应该用来操纵这些列表。
系统定义的字符属性
这些是在Hemlock中预定义的:
“空白”
值为1表示字符为空格。
“字分隔符”
值为1表示字符分隔单词(请参阅英文文本缓冲区部分)。
“空间”
这就像Whitespace,但它不应该包含Newline。Hemlock主要用于处理线上的缩进。
“句子终结者”
值为1表示这些字符终止句子(请参阅英文文本缓冲区部分)。
“句子关闭字符”
值为1表示这些分隔符,例如“或”,可以跟在句子终结符之后。
“段落分隔符”
值为1表示这些字符在开始一行时分隔段落(请参阅英文文本缓冲区部分)。
“页面分隔符”
值为1表示此字符 在开始一行时将逻辑页面分隔开。
“Lisp语法”
它使用以下符号值:
- 这些字符没有任何有趣的属性。
- :space这些字符的行为类似于空格,不应包含换行符。
- :newline这是换行符。
- :open-paren这是(性格。
- :close-paren这是)角色。
- :prefix这是一个字符,它是其前面的任何表单的一部分,例如单引号’。
- :string-quote这是引用字符串文字的字符,“。
- :char-quote这是转义单个字符的字符\。
- :comment这是与行的其余部分进行注释的字符,;。
- :components这些字符构成符号名称。