美文网首页Scheme每天写1000字每天写500字
ChezScheme 第十四章 表达式编辑器

ChezScheme 第十四章 表达式编辑器

作者: 业翔 | 来源:发表于2019-11-12 20:56 被阅读0次

    表达式编辑器

    如第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>如下格式:

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

    相关文章

      网友评论

        本文标题:ChezScheme 第十四章 表达式编辑器

        本文链接:https://www.haomeiwen.com/subject/ntfcictx.html