第14章 表达式编辑器
如第2.2节所述,启用表达式编辑器(expeditor)后,允许用户去编辑输入到系统的表达式,并可以在输入表达式的历史记录中来回移动。 本章描述以下内容:一组参数,用来控制表达式编辑器的各方面行为(第14.1节);一个过程,用于绑定快捷键到编辑命令(第14.2节);各种内建编辑命令(第14.3节);创建新的编辑命令的机制(第14.4节)。
这些机制可以通过导入expression-editor
模块来使用。
module: expression-editor
libraries: (chezscheme)
该expression-editor
模块导出一组参数和过程的绑定,可以用于修改表达式编辑器与用户的交互方式,包括用于调用各种编辑命令的快捷键。
表达式编辑器的基本使用在第2.2节进行了描述。
第14.1节 表达式编辑器的参数
全局参数: ee-auto-indent
ee-auto-indent
是一个布尔值,它确定表达式编辑器在输入表达式时是否缩进表达式。其默认值为#t。
全局参数: ee-standard-indent
ee-standard-indent
是一个非负 fixnum 值,它确定每个表达式相对于封闭表达式的缩进量(在单个空格中)。当ee-auto-indent
是 true,或显式调用缩进命令时,将根据某个缩进启发器使代码不对齐。该变量默认值是 2。
全局参数: ee-auto-paren-balance
ee-auto-paren-balance
是一个布尔值,确定在键入时,表达式编辑器是否自动更正右边的圆括号或方括号,以匹配左边的圆括号或方括号。默认值是 #t。
全局参数: ee-flash-parens
ee-flash-parens
是一个布尔值,它确定当输入一个括号,去匹配另一个括号时,表达式编辑器是否短暂移动光标。
全局参数: ee-paren-flash-delay
ee-paren-flash-delay
是一个非负 fixnum 值,它确定当光标移动到匹配的圆括号或方括号时,或当输入圆括号或方括号时,表达式编辑器暂停的时间(以毫秒为单位)。如果ee-flash-parens
为false,则忽略该值。默认值是 100。
全局参数*: ee-default-repeat
ee-default-repeat
是一个非负 fixnum 值,它确定当ee-command-repeat
编辑命令(默认绑定到Esc- ^ U)使用后,且后面没有数字序列的时候,下一个命令的重复执行次数。默认值是 4 。
全局参数: ee-noisy
ee-noisy
是布尔值,它确定当发生错误时,表达式编辑器是否发出哔哔声,例如尝试为非定界符找到匹配的定界符。默认值是 #f 。
全局参数: ee-history-limit
ee-history-limit
是一个非负 fixnum 值,它确定由表达式编辑器保存的,会话期间或会话之间的历史记录的数量。只有最后 (ee-history-limit)
条记录被保存。
全局参数*: ee-common-identifiers
ee-common-identifiers
是一组符号列表,它们被认为足够通用了。它们可以出现在调用一个增量标识符的补全编辑命令之前,它们也可以在增量标示符的补全使用之后才出现。其默认值包含几十个条目。它们都有几个字符长度(根据用户最有可能完全输入短的理论)。
第14.2节 快捷键绑定
快捷键绑定通过ee-bind-key
完成的。默认的快捷键绑定已在第14.3节中描述。
过程: (ee-bind-key key procedure)
返回: unspecified
该ee-bind-key
过程用于添加,改变被表达式编辑器认可的快捷键绑定。
key
必须是字符或字符串,如果是字符串,它必须具备以下格式:
<key-string> => "<key-char>+"
这里的
<key-char> => \\e (指定一个转义字符)
| ^x (指定 control-x)
| \\^ (指定插入键)
| \\\\ (指定反斜杠)
| plain char (\或^以外的任何字符)
请注意,语法中的每个双反斜杠实际上仅表示字符串中的一个反斜杠。
例如,"\eX"代表双字符的序列Escape-x,即“Escape”键,然后是(大写)“X”键。类似地,"\e^X"代表两个字符的序列Escape-Control-x,即"escape"键,后跟Control-X。
由单个普通字符组成的字符键和字符串键始终表示单个击键。
procedure
参数通常应该是下面描述的内置编辑命令之一。也可以使用ee-string-macro
和ee-compose
定义新的编辑命令。
第14.3节 编辑命令
根据使用情况,编辑命令分为几部分。每个命令都列出了默认的字符序列,已经可以调用它的序列。
插入命令
命令: ee-insert-self
快捷键: 大多数可打印字符
插入键入的字符到条目中。
命令: ee-insert-paren
快捷键: (, ), [, ]
插入键入的圆括号或方括号到条目中。
如果参数ee-auto-paren-balance
是true,当编辑器会匹配到左括号,且需要平衡左括号的时候,并会补充右括号。
如果参数ee-flash-parens
是true, 编辑器会短暂移动光标到匹配的分隔符。如果找到一个,将暂停一会时间。该时间可以通过参数ee-paren-flash-delay
来控制。如果当前没有显示匹配的分隔符,光标将视情况闪烁到条目显示部分的左上角或左下角。
如果用于圆括号或方括号以外的命令,则此命令的行为是不确定的。
命令: ee-newline
快捷键: 无
如果参数ee-auto-indent
为true,则在光标位置插入换行符,移至下一行,并缩进该行。如果条目为空,则不执行任何操作。另请参阅ee-newline/accept
。
命令: ee-open-line
快捷键: ^O
在光标位置插入换行符并缩进下一行,但不会移动到下一行。
命令: ee-yank-kill-buffer
快捷键: ^Y
插入kill缓冲区的内容,该内容由下面描述的删除命令设置。
命令: ee-yank-selection
快捷键: ^V
插入窗口系统当前选择或粘贴缓冲区的内容。在X Windows下的Shell窗口中运行时,此命令要求将DISPLAY环境变量设置为适当的显示。
光标移动命令
命令: ee-backward-char
快捷键: 左箭头, ^B
将光标向左移动一个字符。
命令: ee-forward-char
快捷键: 右箭头, ^F
将光标向右移动一个字符。
命令: ee-next-line
快捷键: 下箭头, ^N
将光标向下移动一行(如有必要,向左移动,以使光标不会超出最后一个可能的位置)。如果光标位于当前条目的末尾,并且尚未修改当前条目,则此命令的行为类似于ee-history-fwd
。
命令: ee-previous-line
快捷键: 上箭头, ^P
将光标向上移动一行(必要时向左移动,以使光标不会超出最后一个可能的位置)。如果光标位于当前条目的顶部,并且尚未修改当前条目,则此命令的行为类似于ee-history-bwd
。
命令: ee-beginning-of-line
快捷键: home, ^A
将光标移动到当前行的第一个字符。
命令: ee-end-of-line
快捷键: end, ^E
将光标移动到当前行最后一个字符的右侧。
命令: ee-beginning-of-entry
快捷键: escape-<
将光标移动到条目的第一个字符。
命令: ee-end-of-entry
快捷键: escape->
将光标移动到条目的最后一个字符的右侧。
命令: ee-goto-matching-delimiter
快捷键: escape-]
将光标移动到匹配的定界符。如果光标下方的字符不是括号或方括号,或者找不到匹配的定界符,则无效。
命令: ee-flash-matching-delimiter
快捷键: ^]
将光标短暂移动到匹配的定界符(如果可以找到),暂停一段时间,此时间由参数ee-paren-flash-delay
控制。如果当前未显示匹配的定界符,则视情况将光标闪烁到条目显示部分的左上角或左下角。
命令: ee-exchange-point-and-mark
快捷键: ^X-^X
将光标移动到标记,并将标记保留在旧光标位置。 (可以使用ee-set-mark设置该标记。)
命令: ee-forward-sexp
快捷键: escape-^F
将光标移动到下一个表达式的开头。
命令: ee-backward-sexp
快捷键: escape-^B
将光标移动到上一个表达式的开头。
命令: ee-forward-word
快捷键: escape-f, escape-F
将光标移动到下一个单词的末尾。
命令: ee-backward-word
快捷键: escape-b, escape-B
将光标移动到上一个单词的开头。
命令: ee-forward-page
快捷键: pagedown, ^X-]
将光标向下移动一个屏幕页面。
命令: ee-backward-page
快捷键: pageup, ^X-[
将光标上移一个屏幕页面。
删除命令
命令: ee-delete-char
快捷键: delete
删除光标下方的字符。 另请参见ee-eof/delete-char。
命令: ee-backward-delete-char
快捷键: backspace (rubout), ^H
删除光标左侧的字符。
命令: ee-delete-line
快捷键: ^U
删除当前行的内容,留下空行。如果在多行条目中的仅显示的第一条上使用,ee-delete-line
将会删除条目所有内容,类似ee-delete-entry
(下面描述)。
命令: ee-delete-to-eol
快捷键: ^K, escape-K
如果光标在一行的末尾,则将该行与下一行连接,否则将其从光标位置删除到该行的末尾。
命令: ee-delete-between-point-and-mark
快捷键: ^W
删除当前光标位置和标记之间的文本。 (可以使用ee-set-mark
设置该标记。)
命令: ee-delete-entry
快捷键: ^G
删除当前条目的内容。
命令: ee-reset-entry
快捷键: ^C
删除当前条目的内容并移至历史记录的末尾。
命令: ee-delete-sexp
快捷键: escape-^K, escape-delete
删除在光标下开始的表达式,或者如果没有表达式在光标下开始,则删除直到下一个表达式。
命令: ee-backward-delete-sexp
快捷键: escape-backspace (escape-rubout), escape-^H
删除光标左侧的表达式。
标识符/文件名补全命令
这些命令执行标识符或文件名的补全。标识符补全在字符串常量之外执行。文件名补全是在字符串常量中执行的。(在确定光标是否在字符串常量内时,表达式编辑器仅查看当前行,因此可以被跨越多行的字符串常量所欺骗。)
命令: ee-id-completion
快捷键: 无
在光标左侧立即插入标识符或文件名可能补全的公共前缀。标识符的补全基于交互环境中定义的标识符。当恰好有一个可能的补全时,通用前缀是补全。如果没有文件名或标识符前缀紧接在光标的左边,或者可能的补全没有公共前缀,则此命令无效。如果连续运行两次,将显示可能补全的列表。
另请参见ee-id-completion/indent
。
命令: ee-next-id-completion
快捷键: ^R
在光标左侧立即插入标识符或文件名的可能补全之一。标识符的补全基于交互环境中定义的标识符。如果连续运行两次或两次以上,此命令将循环遍历所有可能的补全。其遍历顺序由以下规则决定:首先出现的是标识符,其名称出现在参数ee-common-identifiers
的列表值中;排第二的是绑定在交互环境中,但未绑定在scheme环境中的标识符(即用户定义的标识符)。最后出现的是scheme环境的那些标识符。出现在ee-common-identifiers
列表中的一组匹配项中,最早列出的那些项显示在前。该顺序在其他两组中按字母顺序排列。
另请参见ee-next-id-completion/indent
。
移动历史命令
表达式编辑器会在每个会话期间维护条目的历史记录。除非通过命令行参数--eehistory off
禁用了此功能,否则它还会保存跨会话的历史记录。
从一个历史记录条目移动到另一个历史记录条目时,仅显示每个多行条目的第一行。redisplay命令(默认绑定^ L)可用于显示整个条目。也可以向下移动一行显示其余条目的一部分。
命令: ee-history-bwd
快捷键: escape-uparrow, escape-^P
如果当前条目为空或尚未修改,则移至上一个历史条目;否则无效。
另请参见ee-previous-line
。
命令: ee-history-fwd
快捷键: escape-downarrow, escape-^N
如果当前条目为空或尚未修改,则移至下一个历史记录条目;否则无效。
另请参见ee-next-line
。
命令: ee-history-bwd-prefix
快捷键: escape-p
移至最接近的上一个历史记录条目(如果有),该条目以构成当前条目的字符序列开头。可以多次使用以搜索相同的前缀。
命令: ee-history-fwd-prefix
快捷键: escape-n
移至最接近的下一个历史记录条目(如果有),该条目以构成当前条目的字符序列开头。可以多次使用以搜索相同的前缀。
命令: ee-history-bwd-contains
快捷键: escape-P
移动到最接近的上一个历史记录条目(如果有),其中包含组成当前条目的字符序列。可以多次使用以搜索相同的内容。
命令: ee-history-fwd-contains
快捷键: escape-N
移动到最接近的下一个历史记录条目(如果有),其中包含组成当前条目的字符序列。可以多次使用以搜索相同的内容。
缩进命令
命令: ee-indent
快捷键: escape-tab
重新缩进当前行。
另请参见ee-next-id-completion/indent
。
命令: ee-indent-all
快捷键: escape-q, escape-Q, escape-^Q
重新缩进整个条目的每一行。
杂项命令
命令: ee-newline/accept
快捷键: enter, ^M
如果运行在一个开始于一个平衡的表达式的条目的后面,行为类似ee-accept
,否则类似ee-newline
。
命令: ee-id-completion/indent
快捷键: tab
如果标识符(在字符串常量之外)或文件名(在字符串常量内)刚出现在光标的左侧,并且刚输入了该标识符或文件名的最后一个字符,那么它的行为类似于ee-id-completion
。否则它类似ee-indent
。
如果已存在标识符或文件名(即不是刚刚键入的标识符)出现在光标的左侧,则该命令的首次使用类似于ee-newline
,第二次连续使用类似于ee-id-completion
,而第三次连续使用类似于ee-id-completion
。
命令: ee-next-id-completion/indent
快捷键: none
如果标识符(在字符串常量之外)或文件名(在字符串常量内)出现在光标的左侧,并且刚输入了该标识符或标识符的最后一个字符,行为类似于ee-next-id-completion,否则行为类似ee-indent。
命令: ee-eof/delete-char
快捷键: ^D
如果条目为非空,则行为类似于ee-delete-char
;否则行为类似ee-eof
。如果该条目是非空的,并且此命令连续运行两次或更多次,则一旦该条目变为空,它就什么也不做。这是为了防止在重复运行命令(可能借助键盘的自动重复功能)以删除条目中的所有字符的情况下意外退出。
创建新编辑命令
过程: (ee-string-macro string)
返回: 一个新的编辑命令
新编辑命令在当前光标位置之前插入字符串。
预定义了两个字符串宏:
(ee-string-macro "(define ") escape-d
(ee-string-macro "(lambda ") escape-l
过程: (ee-compose ecmd ...)
返回: 一个新的编辑命令
每个ecmd必须是一个编辑命令。 新的编辑命令按顺序运行每个编辑命令ecmd。
例如,以下表达式将^Xp
绑定到行为类似于ee-history-bwd-prefix
的编辑命令,但是将光标留在表达式的末尾而不是第一行的末尾,从而能显示整个条目。
(let ()
(import expression-editor)
(ee-bind-key "^Xp"
(ee-compose ee-history-bwd ee-end-of-entry)))
类似ee-id-completion
,作为复合命令的一部分运行时,即使连续运行两次,也无法识别它已经连续运行两次。