第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-macroee-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,作为复合命令的一部分运行时,即使连续运行两次,也无法识别它已经连续运行两次。

results matching ""

    No results matching ""