8 Edwin
本章介绍如何启动Edwin,Scheme的文本编辑器。Edwin与GNU Emacs非常类似——你应该到Emacs的手册中去找Edwin的命令以及键绑定的信息——只是Edwin的扩展语言是Scheme,而Emacs的是Emacs Lisp。本手册不讨论如何个性化Edwin。
8.1 启动Edwin
如下命令可以启动Edwin:
mit-scheme --edit
此外,你也可以通过给出"--edwin"命令行参数再调用edit过程启动Edwin。
edit                                                                                                                                [procedure]
edwin                                                                                                                            [procedure]
若是第一次进入文本编辑器,编辑器会做初始化(通过调用无参数的create-editor)。否则,进入上一个初始化的编辑器。
edwin过程只是edit的一个别名。
inhabit-editor-init-file?                                                                                                [variable]
当Edwin第一次初始化时,若初始化文件存在,它会加载你的初始化文件(linux下是"~/.edwin",PC上是"edwin.ini")。若Scheme变量inhabit-editor-init-file?为真,则即使你的初始化文件存在也不会加载。此变量默认为否。
你可以在你的Scheme初始化文件中设置此变量的值(见第2.2节[定制Scheme],P5)。
create-editor arg . . .                                                                                                      [procedure]
初始化Edwin,或若已经初始化过则重新初始化。create-editor通常会自动被edit触发。
若没有给出变量列表(args),则使用create-editor-args的值。换句话说,如下的调用是等同的:
(create-editor)
(apply create-editor create-editor-args)
另一方面,若给出了args,则会使用args并且更新create-editor-args的值,如下的调用将会等同:
(apply create-editor args)
(begin (set! create-editor-args args) (create-editor))
create-editor-args                                                                                                            [variable]
此变量控制着Edwin的初始化。如下的变量值有定义:
(#f)        这个是默认值。创建一个默认大小的窗口作为Edwin的主窗口。在unix下,若X11不可用,或DISPLAY环境变量没有定义,Edwin将运行在Scheme的控制台。
(x)          仅适用于unix。创建一个X window并把它作为Edwin的主窗口。这个需要DISPLAY环境变量在Scheme启动前设置为一个适当的值。
(x geometry)
仅适用于unix。与"(x)"类似,只不过geometry以通常的方式设置了窗口的几何。geometry必须是一个字符串,且其内容是X几何规格。
(console)
仅适用于unix。使得Edwin运行在Scheme的控制台,或者按照unix的术语,运行在标准输入和标准输出上。若控制台不是一个终端设备,或不够强大来运行Edwin,在初始化时会提示错误。
(win32)    仅适用于Windows。创建一个窗口并作为Edwin的主窗口。
8.2 离开Edwin
一旦进入了Edwin,可以通过如下的方式退出:
C-x z                停止Edwin并返回到Scheme(suspend-edwin)。进入Edwin的editor过程调用正常返回。接下来若调用edit则会从上次停止的地方重启Edwin。
C-x c                保存任何修改过的缓冲区,关闭Edwin并返回到Scheme(save-buffers-kill-edwin)。这个与suspend-edwin命令类似,不过下次调用edit会重新初始化编辑器。
C-x C-z            停止Edwin并挂起Scheme,把控制权交给操作系统的命令解释器(suspend-scheme)。当Scheme被重新启用(使用命令解释器的作业控制(job-control)命令),Edwin会自动从它停止的地方重启。这个命令与Emacs的C-x C-z命令是一样的。
C-x C-c            保存任何修改的缓冲区,然后关闭Edwin和Scheme(save-buffers-kill-scheme)。把控制权交给操作系统的命令解释器,Scheme进程也被终止。此命令与Emacs的C-x C-c命令相同。
8.3 Scheme模式(Mode)
就像你期待的那样,Edwin对Scheme代码的编辑和求值有特别的支持。本节介绍Scheme模式,适合编辑Scheme程序的模式。
Scheme模式通常在Scheme中访问一个以".scm"结尾的文件时自动进入。你也可以通过把"-*-Scheme-*-"作为文件的第一行,使得文件变成Scheme代码文件。最后,你可以通过执行M-x schme-mode命令把任何缓冲区进入Scheme模式。
Scheme模式与Emacs用来编辑Lisp代码的模式类似。所以,C-i会对当前行缩进,C-M-q会根据点的右边缩进表达式。闭合的括号会临时的闪亮匹配的开始的括号。大部分的Scheme的构造都需要Scheme模式来识别的特殊的缩进,例如,begin,do和let。
Scheme模式还对Scheme程序有特别的支持,很像Emacs在Lisp模式下所作的那样。提供了全局变量的补全功能:键入变量的前面几个字符,然后键入C-M-i,Edwin就会尝试去补全变量的名称,根据当前界限内的变量集。若给出了一个参数前缀,C-M-i会补全这个名称,根据当前的限制的(interned)符号集合(包括了边界变量作为一个子集)。
M-A命令(注意是大写的A)会显示一个过程的参数,当在一个过程调用里面使用的时候。例如,键入字符串"(quotient",然后按M-A,命令会在响应区域响应"(n d)"。使用一个前缀参数,M-A会在缓冲区插入参数的名字,所以在这个例子中,在运行了C-u M-A后,缓冲区会包含"(quotient n d"。
8.4 求值(Evaluation)
Scheme模式同样提供了一些命令来对Scheme表达式求值。最简单的求值命令就是C-x C-e,它会对左边(光标位于表达式后但在同一行)或上一个(光标位于表达式后但位于下一个表达式前且不在同一行)表达式求值。(这个组合按键适合于所有的缓冲区,即使它们不存在Scheme代码。)命令M-z对光标在表达式中的表达式进行求值。命令M-:会在迷你缓冲区提示输入表达式,并打印求值在响应区(echo area)。
其他的用来对大量代码求值的命令有C-M-z,对区域中的所有表达式求值(译者注:若在Windows下使用Edwin,请先清除启动Scheme时的版权信息,否则会报错!);M-o,对整个缓冲区内的表达式求值(译者注:在Windows下使用Edwin貌似是未定义命令,后面会讲到在REPL模式下未定义,此处可用)。这两个命令有一个潜在的危险,就是它们会对任何出现的表达式(译者注:不是以";"开始的,“;”应该表示Scheme中的注释)求值,即使那个不是一个错误的表达式。
通常,这些命令通过把表达式发送到一个REPL缓冲区来求值,在一个分开的线程里进行求值操作。这样有两点好处:它允许你在求值发生时继续进行编辑,并且它会对每个求值保持一个记录并打印到输出。若你想停止一个进行中的求值操作并擦除任何的行将求值的表达式,可以在任何Scheme缓冲区中使用C-c C-c命令。(注意:按照默认,Edwin启动时有一个叫做"*scheme*"的REPL缓冲区随着打开。)
若你更喜欢Scheme模式下的求值命令直接求值而不是发送到REPL缓冲区去求值,可以设置Edwin中的变量evaluate-in-inferior-repl为#f。这种情况下,在求值发生时,你将不能使用Edwin;任何的求值输出都将在求值结束时出现在一个弹出的缓冲区内;此时,你可以使用C-g命令来终止求值。
8.5 REPL模式
Edwin提供了一个专门的机制来跟Scheme的REPL缓冲区们进行交互。一个REPL缓冲区与一个Scheme的REPL在一个独立的执行线程里相连接;因此,表达式的求值可以与编辑器内的其他操作同时进行。一个REPL缓冲区会从一个求值的表达式捕获所有打印输出,包括支持交互程序,如:debug。基于如上和其他原因,REPL缓冲区是更好的跟Scheme解释器交互的方式。
当Edwin启动时,它有一个缓冲区:一个叫做“*scheme*”的REPL缓冲区。若此缓冲区存在,命令M-x repl会选中它;否则,它会创建一个新的REPL缓冲区。若你希望有两个REPL缓冲区,可以先把"*scheme*"重命名为其他名字,然后再次运行M-x repl命令即可。
REPL缓冲区支持所有Scheme模式下的相同的求值命令;事实上,REPL缓冲区使用一个特别的模式叫做REPL模式,它是从Scheme模式继承而来。如此,在Scheme模式下的任何的键值绑定定义在REPL模式下都适用。一个例外就是M-o,它在REPL模式下特意的设置为未定义;否则,一不小心就会在REPL缓冲区去重新运行所有已求值的表达式。
除了求值命令,REPL模式还提供了一些控制REPL本身的特殊的命令。命令C-c C-x和C-c C-u用来退出当前的求值,并各自返回当前会前一个REPL的层级。C-c C-b中断当前的求值并进入一个断点。
每一个REPL缓冲区都维护了一个键入的表达式的历史。有几个命令允许你去得到这个历史的内容。命令M-p在历史中向后移动,在当前位置插入以前的求过值的表达式。M-n则向前移动获得相应的历史数据。命令C-c C-r和C-c C-s则向后和向前搜索一个特定的字符串。命令C-c C-o删除任何以前求值的输出;不过要注意,这个命令不能被撤销,所以使用它时小心为妙。C-c C-l命令找到最近的表达式并移到那个位置。
当一个表达式在求值时出现了错误,REPL缓冲区会给出通知并提供说可以运行调试器。输入"y"或"n"则启动或不启动调试器。你可以启动调试器,当REPL缓冲区在通过C-c C-d命令执行监听时。两种情况下,都会启动Edwin调试器,会弹出一个新的包含调试器的窗口。你的REPL缓冲区会停留在错误的状态下,允许s你做进一步的检查。
8.6 Edwin调试器
Edwin调试器与命令行调试器类似,不过它能利用多窗口以及Edwin的命令结构来提供一个更直观的界面。调试器操作起来就像一个浏览器,很像Dired(译者注:Emacs中的文件管理器),展示给你一个子问题结构的概览,允许你通过选择结构的一部分做详细的检查。当启动时,调试器会创建一个缓冲区"*debug*"来展示子问题的结构,并选中第一行。
每一个以“S”开头的行代表了一个子问题或一个栈帧(stack frame)。一个子问题行可能后面会跟一些缩进的行(以"R"开头),表示相关子问题的缩略形式(reduction)。子问题用自然数来进行编号(index)。通过在一行单击鼠标或移动光标到那一行可以得到一个更加完整的对子问题或缩略形式的描述。描述缓冲区会显示额外的一些信息。
描述缓冲区包含三个主要区域。第一个区域包含一个当前表达式的美化(pretty-printed)版本。表达式的当前子问题会高亮显示。第二个区域包含一个当前表达式环境的桢表示(representation of the frames)。每个桢的绑定都会列在桢头下面。若在桢中不存在绑定,则不会列出任何东西。当前表达式的桢由"==>"符号开始。
底层的描述缓冲区包含第三个区域,在选择的子问题或缩略形式的环境下对表达式求值。这个部分是缓冲区中唯一个可以编辑的部分。在这个区域可以找到不同环境下的变量的值,或者设置可以修改变量的值或数据结构(注意:一般情况下,编译代码中的变量是不能被修改的)。
键入e会创建一个新的缓冲区,在其中你可以浏览当前的环境。在新的缓冲区内,你可以使用鼠标、方向键或C-n和C-p去选择行并查看不同的环境。这里的环境与描述缓冲区中的环境是一样的。若选择的环境结构太大而不能显示(也就是说若环境中绑定的数量超过了编辑器变量environment-package-limit的值),则会显示一条消息。若要在这种情况下显示这个环境,可以使用M-x set-variable来设置environment-package-limit为#f。在新的缓冲区的底部是一个对表达式求值的区域,与相应的描述缓冲区类似。
环境显示的外观由编辑器变量debugger-show-inner-frame-topmost?和debugger-compact-display?来控制,他们会分别影响环境桢的顺序以及行的间距。
键入q来推出调试器,杀死它的主缓冲区以及任何由它创建的其他缓冲区,还有用来显示调试器的弹出窗口。
注意:由调试器创建的描述缓冲区的名字是以空格开始的,它们不会出现在缓冲区列表中;这些缓冲区在调试器退出时会自动被删除。若你想保留其中的一个缓冲区,仅仅需要使用M-x rename-buffer来对它重命名即可:一旦被重新命名,则它就不会被自动删除。
8.7 最后的手段
若Scheme非正常退出,它会尝试保存任何未保存的缓冲区。缓冲区被保存到一个自动保存文件里,以防原始的比未保存的版本更有价值。你可以使用命令M-x recover-file来恢复自动版本的版本。自动保存文件的名称跟操作系统有关:unix下以及支持长文件名的PC文件系统中,"foo.scm"将会被保存为"#foo.scm#";在仅支持短文件名的PC系统中,将被保存为"foo.sav"。
如下的Scheme过程对从Edwin的实现中的Bug恢复会比较有帮助。所有这些都设计为当Edwin没有运行时都可使用——他们不应该在Edwin运行时使用。这些过程的设计是为了帮助Edwin实现者在编辑器实现过程中处理BUG;他们不是设计来做日常使用的,而是作为一个从BUG恢复的手段,而不需要从磁盘重新加载编辑器的World Image。
save-editor-files                                                                                                [procedure]
检查Edwin,并提供保存任何未保存的缓冲区。若一些BUG使得Edwin被杀死而没有保存缓冲区而你想在不重启编辑器的情况下保存信息时很有用。
reset-editor                                                                                                        [procedure]
重置编辑器,使得它在下次调用edit时重新初始化。若遭遇了Edwin的一个致命BUG,一个很好的恢复方式就是首先调用save-editor-files,然后调用reset-editor。这样会完全重置编辑器到它的初始状态。
reset-editor-windows                                                                                        [procedure]
重置Edwin的显示结构,而不影响任何的缓冲区和它们的内容。当显示代码的BUG使得Edwin的内部显示数据结构出现了不一致而阻止Edwin运行时比较有用。

MIT/GNU Scheme用户手册(八) Edwin相关推荐

  1. MIT线性代数笔记十八讲 行列式及其性质

      之前学习了大量长方形矩阵的性质,现在我们集中讨论方阵的性质,行列式和特征值将我们的又一个重点,求行列式则与特征值息息相关. 文章目录 1. 行列式 Determinants 2. 性质 Prope ...

  2. [MIT]微积分重点 第八课 链式法则 学习笔记

    1.链式法则 照例先给出链式法则: y=g(x)z=f(y)d⁡zd⁡x=d⁡zd⁡yd⁡yd⁡xy=g(x)\quad z=f(y) \\[2ex] \frac{\operatorname{d}z} ...

  3. scheme心得(1) continuation与阴阳谜题

    摘要:简要介绍了scheme语言中continuation的用法.解释了阴阳谜题程序的运行过程与结果. Scheme是一种lisp方言,个人比较常用的运行环境是MIT-GNU Scheme. 今天谈一 ...

  4. java中间语言汇编语言_中间语言(IL) | 学步园

    一.IL与汇编语言 IL是微软.NET平台上衍生出的一门中间语言,.NET平台上的各种高级语言(如C#,VB,F#)的编译器会将各自的代码转化为IL.,其中包含了.NET平台上的各种元素,如" ...

  5. 个人网页、博客、课程--不断更新

    论文和相关代码 :https://paperswithcode.com/ Caiming Xiong http://www.stat.ucla.edu/~caiming/ 论文,代码,博客 肖小粤的啵 ...

  6. 【历史上的今天】12 月 3 日:世界上第一条短信;Fortran 语言之父诞生;百度贴吧上线

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 3 日,在 20 年前的今天,电动平衡车(Segway)问世:电动平衡车是一种电力驱动.具 ...

  7. 收藏夹 -- 常来看看。

    Bookmarks Another Joel on Software - 未名空间(mitbbs.com) - 海外华人第一门户 麻省理工学院开放课件 | OCW Home Joel on Softw ...

  8. Scheme 语言介绍

    Scheme 语言介绍 Wolfgang Kreutzer 翻译:寒蝉退士 原文:http://www.cosc.canterbury.ac.nz/~wolfgang/cosc302/Chap2.3. ...

  9. 中国自由软件推广先锋的自述,心潮澎湃的一往无前,一定要看!作者:洪峰...

    一定要看,原文地址是: http://www.cppblog.com/toMyself/archive/2010/08/29/125217.html 本文内容经过了我(Shane Loo Li)少许修 ...

  10. 学习Linux的几点忠告(转贴)

    学习Linux的几点忠告(转贴)  可能是很老的帖子了吧............ 最近因为工作的需要和个人的兴趣,开始学习linux的知识,也转了不少的网站,许多问题在不同的地方得到了解决,进步是一方 ...

最新文章

  1. 用IE重起计算机或者关机
  2. python dig trace 功能实现——通过Querying name server IP来判定是否为dns tunnel
  3. HTML 各种鼠标手势
  4. html语言 section type,HTML5中div、article、section的区别及使用介绍
  5. android安全性发展,Android未来发展 安全是重点
  6. 配置 IIS 7 显示详细错误信息
  7. 【人脸识别】基于matlab二值膨胀差分和椒盐滤波教室内人数统计【含Matlab源码 251期】
  8. C语言中文网C++教程笔记
  9. 基于MFC的U盘检测
  10. python获取年末,月末,季末的日期和距指定时间的天数
  11. springcloud hystrix熔断器参数详解
  12. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析
  13. Visual studio 默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)
  14. DELL服务器部件型号/PN查找
  15. 医学影像数据集和其他数据集们
  16. 【通俗理解线性代数】 -- 矩阵的相似对角化
  17. 漫看影视:豆瓣2019年评分最高外语电影推荐
  18. 一个SQL,程序实现多日留存率计算
  19. 国产“芯” · 瑞芯微 RK3568 性能解析
  20. HP DL380 G7 物理机安装debian10 提示缺少:bnx2/bnx2-mips-09-6.2.1b.fw

热门文章

  1. css 实现一个带尖角的正方形
  2. 使用CPN Tools工具做简单的登录模型(初学者)
  3. 《车联网(智能网联汽车)产业发展行动计划》正式发布,车联网产业发展进一步提速...
  4. 点击链接元素出现蓝色边框或者出现半透明蓝色背景
  5. 计算机显示的数据的格式,GPS 数据格式及显示问题!!!
  6. 2345广告,够了!
  7. 基于I2C协议的AHT20温湿度传感器的数据采集及OLED屏显示
  8. shopex PHP Notice,解决最新shopex乱码问题
  9. 仿微博QQ搜索框实现
  10. HTML链接会议申请,会议流程.html