ChezScheme 第十四章 表达式编辑器

表达式编辑器

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355