【转】Scheme 编程环境的设置
Scheme 编程环境的设置
介绍了这么久的 Scheme,却没有讲过如何配置一个高效的 Scheme 的编程环境。有些人开始学习 Scheme 的时候感觉无从下手,所以今天讲一下它的配置。
Scheme 的配置有很多种方式,我不想介绍太多东西,免得有人看花了眼,所以这里只介绍一下我自己的配置。我不大喜欢像 Quack 一类的复杂的环境,因为它们经常有很多多余的功能,却缺少我想要的功能。一旦我想修改它们,又到处出问题。我的配置很简约,我用它写了几千行的超高难度的代码,翻来覆去的改,感觉效率非常高,也没有觉得缺少什么特别重要的东西。
现在我就一步一步的介绍我的配置。
安装 Scheme
Chez Scheme
世界上最快,最成熟可靠的 Scheme 实现是 R. Kent Dybvig 所作的 Chez Scheme。它可以把 Scheme 编译成机器代码,运行速度非常高。Chez Scheme 曾经是商业软件,价格昂贵,然而现在却开源了,并且可以免费使用。你可以在这里下载 Chez Scheme 的源代码:
https://github.com/cisco/ChezScheme
编译安装很快很方便,在 Linux 和 Mac 系统基本就是这样:
./configure
make
sudo make install
整个编译安装过程只需要30秒。这是世界上最快编译自己全套系统的编译器。
Racket
如果你对性能没有特别高的需求,主要用于学习,也可以用 Racket。它可以在这里下载:
安装应该很容易。Ubuntu 也自带了 Racket,所以可以直接让系统安装它。
设置 ParEdit mode
我编辑 Scheme 的时候都用 Emacs。我使用一个叫做 ParEdit mode 的插件。它可以让你“半结构化”式的编辑 Scheme 和其它的 Lisp 文件。开头你可能会有点不习惯,可是一旦习惯了,你就再也离不开它。
ParEdit mode 可以在这里下载:
http://mumble.net/~campbell/emacs/paredit.el
下载之后,把它放到一个目录里,比如 ~/.emacs.d,然后打开 ~/.emacs 配置文件,加入如下设置:
(add-to-list 'load-path "~/.emacs.d")
(autoload 'paredit-mode "paredit"
"Minor mode for pseudo-structurally editing Lisp code."
t)
这样,只要你使用 M-x paredit-mode 就可以自动载入这个模式。具体的操作方式可以看它的说明(按 C-h m 查看“模式帮助”),我下面也会简单说一下。
设置 scheme mode
我一般就用系统自带的 Scheme 模式,叫 cmuscheme。但是为了方便,我自己写了几个函数,用于在执行 Scheme 代码的时候自动启动解释器,并且打开解释器窗口。你基本只需要把下面的代码拷贝到你的 .emacs 文件里就行:
;;;;;;;;;;;;
;; Scheme
;;;;;;;;;;;;
(require 'cmuscheme)
(setq scheme-program-name "racket") ;; 如果用 Petite 就改成 "petite"
;; bypass the interactive question and start the default interpreter
(defun scheme-proc ()
"Return the current Scheme process, starting one if necessary."
(unless (and scheme-buffer
(get-buffer scheme-buffer)
(comint-check-proc scheme-buffer))
(save-window-excursion
(run-scheme scheme-program-name)))
(or (scheme-get-process)
(error "No current process. See variable `scheme-buffer'")))
(defun scheme-split-window ()
(cond
((= 1 (count-windows))
(delete-other-windows)
(split-window-vertically (floor (* 0.68 (window-height))))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window 1))
((not (find "*scheme*"
(mapcar (lambda (w) (buffer-name (window-buffer w)))
(window-list))
:test 'equal))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window -1))))
(defun scheme-send-last-sexp-split-window ()
(interactive)
(scheme-split-window)
(scheme-send-last-sexp))
(defun scheme-send-definition-split-window ()
(interactive)
(scheme-split-window)
(scheme-send-definition))
(add-hook 'scheme-mode-hook
(lambda ()
(paredit-mode 1)
(define-key scheme-mode-map (kbd "<f5>") 'scheme-send-last-sexp-split-window)
(define-key scheme-mode-map (kbd "<f6>") 'scheme-send-definition-split-window)))
我的配置会在加载 Scheme 文件的时候自动载入 ParEdit mode,并且把 F5 键绑定到“执行前面的S表达式”。这样设置的目的是,我只要把光标移动到一个S表达式之后,然后用一根手指头按 F5,就可以执行程序。够懒吧。
ParEdit mode 的简单使用方法
ParEdit mode 是一个很特殊的模式。它起作用的时候,你不能直接修改括号。这样所有的括号都保持完整的匹配,不可能出现语法错误。但是这样有一个问题,如果你要把一块代码放进另一块代码,或者从里面拿出来,就不是很方便了。
为此,ParEdit mode 提供了几个非常高效的编辑方式。我平时只使用两个:
C-right
: 也就是按住 Ctrl 再按右箭头。它的作用是让光标右边的括号,“吞掉”下一个S表达式。比如,`(a b c) (d e)`。你把光标放在 `(a b c)` 里面,然后按 `C-right`。结果就是 `(a b c (d e))`。也就是把 `(d e)` 被整个“吞进”了 `(a b c)` 里面。
M-r
: 去掉外层代码。这在你需要去掉外层的 let 等结构的时候非常有用。比如,如果你的代码看起来是这样:
(let ([x 10])
(* x 2))
当你把光标放在
(* x 2)
的最左边,然后按M-r
,结果就变成了(* x 2)
也就是把外面的
(let ([x 10]) ...)
给“掀掉”了。其它的一些按键虽然也有用,不过我觉得这两个是最有用的,甚至不可缺少的。有些其他的自动匹配括号的模式,没有提供这种按键,所以用起来很别扭。
设置括号颜色
很多人看见 Lisp 就怕了,就是因为它看起来括号太多。可是这样的语法,却是有很大的好处的(参考这篇博文《谈语法》)。如果你真的觉得括号碍眼,你可以稍微调整一下括号的颜色,比如淡灰色。这样括号看起来就没有那么显眼了。
你只需要下载这个 el,放到你的 .emacs.d:
https://www.dropbox.com/s/v0ejctd1agrt95x/parenface.el
然后在 .emacs 里面加入两行:
(require 'parenface)
(set-face-foreground 'paren-face "DimGray")
然后再打开 Scheme 代码的时候,你就会看到是这个样子:
好了,这就是我写 Scheme 的所有配置了。希望这些有所帮助。
【转】Scheme 编程环境的设置的更多相关文章
- Scheme 编程环境的设置(racket/petite)-王垠
Scheme 编程环境的设置 http://www.yinwang.org/blog-cn/2013/04/11/scheme-setup/ sudo apt-get insatll racket ; ...
- Emacs下scheme编程环境的设置
Scheme编程环境搭建 1.1 安装Chez Scheme git clone https://github.com/cisco/ChezScheme.git cd ChezScheme ./con ...
- Python编程环境设置
第1节.Python编程环境设置 一.sublime相关 1.sublime REPL插件安装 (1)安装 先打开插件安装面板:ctrl+shift+P 输入install ,选择Package Co ...
- linux下ruby使用tcl/tk编程环境设置
正常情况下最新的ruby都是不带tcl/tk选项编译的,所以我们在运行tcl/tk代码时都会发生找不到tk库的错误.解决办法很简单只要以tcl/tk选项编译ruby即可. 这里以ubuntu 15.0 ...
- win7中java编程工具安装 java环境变量设置
一.下载java 官方地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html ...
- 【转】手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文) By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage ...
- Vim配置及说明——IDE编程环境
Vim配置及说明——IDE编程环境 Vim配置及说明——IDE编程环境 1.基本及字体 2.插件管理 3.主题风格 4.窗口设置 5.目录树导航 6.标签导航 7.taglist 8.多文档编辑 9. ...
- IDE编程环境
Vim配置及说明——IDE编程环境 目录 Vim配置及说明——IDE编程环境 1.基本及字体 2.插件管理 3.主题风格 4.窗口设置 5.目录树导航 6.标签导航 7.taglist 8.多文档编辑 ...
- Ubuntu下编程环境GNU安装
ubuntu下C编程 环境搭建 其实,linux下写C也是很容易的.IDE的话用 eclipse 集成 CDT 模块就行了.当然这属于重量级的了,就如同VC++之于windows一样.那有没有像T ...
随机推荐
- 递归的隐含限制——处理对象小的可以、大的不可以
最近自己编写了一个求n阶行列式的值的C程序,编译成功,并且使用了一个3阶行列式进行了测试,测试也成功了.以为这样就万事大吉了,可是后来在实际应用中调用该函数时却导致程序无法运行.注意到,实际应用中要求 ...
- 从#!/bin/bash中想到的...
罪过罪过,开发了N年的SHELL,竟然第一次思考#!/bin/bash是啥意思?真是怀疑以前的的代码是咋开发出来的- 如果要解释#!/bin/bash是啥意思?为啥每个SHELL脚本第一行都写它哪?首 ...
- infobright系列二:数据迁移
安装之后把之前infobright的数据迁移到新安装的infobright上. 1:挺掉相关的服务 2:scp 把旧数据拷到新安装的infobright上 3:修改/etc/my-ib.cnf的数据目 ...
- C++ Standard Library
C++ Standard Library *注:内容主要是对參考1的学习记录.知识点与图片大都来源于该书, 部分知识点与图片来源于參考2. 详细參考信息,见最下方參考. * C++98中新支持的语言特 ...
- OpenCV实现任意大小图片的合并(转)
OpenCV实现图像合并主要有两种方法 方法一:使用Mat.push_back方法将列数相同的图像加到最后一行 方法二: 主要思路是将图像拷贝到待合并图像的感兴趣区域 (1)新建一个要合并的图像(容器 ...
- nginx 和php设置上传大小及可以提交的内容限制
1. 以下代码加入 /etc/nginx/nginx.conf 文件中的 http{ ... } 块中 client_max_body_size 8M; 2. PHP 设置上传大小 打开 /etc/p ...
- Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程
Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程 下载安装文件 Oracle Data Integrator 12cR1 (12.1.3.0.0) http: ...
- java sm4国密算法加密、解密
java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...
- 删除sql server用户时报15138错误
问题 在删除sql server中某数据库下的用户时报15138错误,见下图 解决 可用下述sql代码检查该用户的架构信息,然后逐一修正 SELECT s.name FROM sys.schemas ...
- vsftp 虚拟用户测试
1.创建用于进行FTP验证的帐号密码数据库文件,单数行为账户名,偶数行为密码.[root@rhel1 vsftpd]# vi /etc/vsftpd/vuser.listuser1123456user ...