*if_mzsch.txt* For Vim version 7.1. 最近更新: 2007年5月
VIM 参考手册 by Bram Moolenaar
译者: Willis
http://vimcdoc.sf.net
Vim 的 MzScheme 接口 *mzscheme* *MzScheme*
1. 命令 |mzscheme-commands|
2. 示例 |mzscheme-examples|
3. 线程 |mzscheme-threads|
4. Vim 访问例程 |mzscheme-vim|
5. 动态调入 |mzscheme-dynamic|
{Vi 无此功能}
只有 Vim 编译时加入 |+mzscheme| 特性后才能使用 MzScheme 接口。
来自于 Brent Fulgham 的工作。
动态调入部分则由 Sergey Khorev 加入。
如何下载 MzScheme 和其它的信息可见:
http://www.plt-scheme.org/software/mzscheme/
备注: FreeBSD 上应该用 "drscheme" 移植版本。
1. 命令 *mzscheme-commands* *:mzscheme* *:mz* :[range]
mz[scheme]{stmt}
执行 MzScheme 语句{stmt}
。{Vi 无此功能}
:[range]
mz[scheme] <<{endmarker}
{script}
{endmarker}
执行内含 MzScheme 脚本{script}
。 注意: 如果编译时不带 MzScheme 特性,此命令会失败。要避 免错误,见 |script-here|。 *:mzfile* *:mzf* :[range]
mzf[ile]{file}
执行{file}
文件里的 MzScheme 脚本。{Vi 无此功能}
所有语句都在 :mzfile 启动时所在的当前缓冲区的命名空间 里执行。如果想访问其它命名空间,用 'parameterize'。 这些命令基本上做同样的一件事 - 执行一段 MzScheme 代码。执行期间,"当前行范围" 设为给定的行范围。 :mzscheme 执行的代码来自命令行。 :mzfile 执行的代码来自给定文件的内容。 每个缓冲区都有自己的 MzScheme 命名空间。'vimext' 模块的 `global-namespace' 值 可以绑定全局命名空间。 MzScheme 接口定义从 exn 派生的 exn:vim 例外。若干 Vim 错误抛出此例外。 编译时,MzScheme 接口记住当前的 MzScheme collection 路径。如果你想指定额外的路 径,使用 'current-library-collection-paths' 参数,例如,要附加 (cons) 用户的局 部 MzScheme collection 路径::mz << EOF
(current-library-collection-paths
(cons
(build-path (find-system-path 'addon-dir) (version) "collects")
(current-library-collection-paths)))
EOF
vimext 模块提供所有的功能。 exn:vim 无需显式导入 (import)。 为了避免和 MzScheme 冲突,require 模块时考虑使用 prefix。 例如::mzscheme (require (prefix vim- vimext))
下面的例子都使用此命名方案。注意 你需要为每个缓冲区都这样做一遍。 自动实例化可以用自动命令完成。例如,在 .vimrc 里可以写 (EOF 不应缩进):function s:MzRequire()
if has("mzscheme")
:mz << EOF
(require (prefix vim- vimext))
(let ((buf (vim-get-buff-by-name (vim-eval "expand(\"
<afile>
\")"))))(when (and buf (not (eq? buf (vim-curr-buff))))
(parameterize ((current-namespace (vim-get-buff-namespace buf)))
(namespace-attach-module vim-global-namespace 'vimext)
(namespace-require '(prefix vim vimext)))))
EOF
endif
endfunction
function s:MzStartup()
if has("mzscheme")
au BufNew,BufNewFile,BufAdd,BufReadPre * :call s:MzRequire()
:mz << EOF
(current-library-collection-paths
(cons
(build-path (find-system-path 'addon-dir) (version) "collects")
(current-library-collection-paths)))
EOF
endif
endfunction
call s:MzStartup()
全局命名空间此时就会用前缀 "vimext:" 实例化该模块。 *mzscheme-sandbox* 在沙盘 |sandbox| 里执行时,对一些文件系统和 Vim 接口的过程的访问受到限制。
2. 示例 *mzscheme-examples*:mzscheme (display "Hello")
:mzscheme (vim-set-buff-line 10 "This is line #10")
内含脚本的使用:function!
<SID>
SetFirstLine():mz << EOF
(display "!!!")
(vim-set-buff-line 1 "This is line #1")
(vim-beep)
EOF
endfunction
nmap
文件执行:<F9>
:call<SID>
SetFirstLine()<CR>
:mzfile supascript.scm
在另一个缓冲区里用 |:mzfile| 执行的脚本运行的 MzScheme 程序访问当前缓冲区的 命名空间:; 移到下面的窗口
(vim-command "wincmd j")
; 在窗口所属的缓冲区的上下文内执行,假设该缓冲区定义了 'textstring'
(parameterize ((current-namespace
(vim-get-buff-namespace (vim-curr-buff))))
(eval '(vim-set-buff-line 1 textstring)))
3. 线程 *mzscheme-threads* MzScheme 接口支持线程。它们和操作系统的线程相互独立,因此调度是必要的。 'mzquantum' 选项决定 Vim 应每隔多久轮询可用的 MzScheme 线程。 备注 Vim 控制台版本的线程调度不如 GUI 版本的可靠。
5. VIM 函数 *mzscheme-vim* *mzscheme-vimext* 'vimext' 模块提供对 MzScheme 接口定义的例程的访问。 通用
(command{command-string}
) 执行 Vim ":Ex" 风格的命令。 (eval{expr-string}
) 计算 vim 表达式,返回字符串。 |List| 通过连接项目并插入换行符来转化为字 符串。 注意 这和 MzScheme 的 eval 有冲突。 (range-start) Scheme 命令传递的行范围的开始行 (range-end) 和结束行。 (beep) 响铃 (get-option{option-name}
[buffer-or-window]) 得到 Vim 选项值 (局部或全局 值,见 set-option)。 (set-option{string}
[buffer-or-window]) 设置 Vim 选项。字符串{string}
使用设置选 项形式 (optname=optval 或 optname+=optval 等)。如果带{buffer}
或{window}
,设置局部 选项。{buffer-or-window}
也可以使用符号 'global,这时就会使用 |:setglobal|。 global-namespace MzScheme 主命名空间。 缓冲区 *mzscheme-buffer*
(buff?{object}
) 对象是缓冲区么? (buff-valid?{object}
) 对象是合法的缓冲区 (也就是,对应真正 Vim 缓冲区) 么? (get-buff-line{linenr}
[buffer]) 得到缓冲区的行。 (set-buff-line{linenr}
{string}
[buffer]) 设置缓冲区的行。如果{string}
是 #f,删除 得到的行。[buffer] 参数可选。如果省略,使 用当前缓冲区。 (get-buff-line-list{start}
{end}
[buffer]) 得到缓冲区的行列表。{Start}
和{end}
从 1 开始。包含{Start}
,不包含{end}
。 (set-buff-line-list{start}
{end}
{string-list}
[buffer]) 设置缓冲区的行列表。如果字符串列表{string-list}
是 #f 或 null,删除所有行。 如果列表短于{end}
-{start}
,删除其余行。 (get-buff-name [buffer]) 得到缓冲区的文本名。 (get-buff-num [buffer]) 得到缓冲区的编号。 (get-buff-size [buffer]) 得到缓冲区的行数。 (insert-buff-line-list{linenr}
{string/string-list}
[buffer]) 在缓冲区第{linenr}
行之后插入行列表。如果{linenr}
为 0,在缓冲区开头插入。 (curr-buff) 得到当前缓冲区。使用 `vimcmd' 模块的例程修 改当前缓冲区。 (buff-count) 得到编辑器的缓冲区总数。 (get-next-buff [buffer]) 得到下一个缓冲区。 (get-prev-buff [buffer]) 得到前一个缓冲区。如果没有更多缓冲区,返回 #f。 (open-buff{filename}
) 打开新缓冲区 (编辑文件 "name")。 (get-buff-by-name{buffername}
) 根据文件名得到缓冲区,如果没有此缓冲区,返 回 #f。 (get-buff-by-num{buffernum}
) 根据缓冲区号得到缓冲区 (如果没有对应此编号 的缓冲区,返回 #f)。 (get-buff-namespace [buffer]) 得到缓冲区的命名空间。 窗口 *mzscheme-window*
(win?{object}
) 对象是窗口么? (win-valid?{object}
) 对象是合法的窗口 (也就是,对应真正 Vim 窗 口) 么? (curr-win) 得到当前窗口。 (win-count) 得到窗口总数。 (get-win-num [window]) 得到窗口的编号。 (get-win-by-num{windownum}
) 根据窗口号得到窗口。 (get-win-buffer [window]) 得到给定窗口的缓冲区。 (get-win-height [window]) (set-win-height{height}
[window]) 取得/设置 窗口高度。 (get-win-width [window]) (set-win-width{width}
[window])取得/设置 窗口宽度。 (get-win-list [buffer]) 得到对应特定缓冲区的窗口列表。 (get-cursor [window]) 得到窗口的光标位置,以组对 (行号 . 列号) 形式出现。 (set-cursor (line . col) [window]) 设置光标位置。
5. 动态调入 *mzscheme-dynamic* MS-Windows 上,可以动态调入 MzScheme 库。|:version| 输出这时应包括 |+mzscheme/dyn|。 这意味着 Vim 只有在必要时才寻找 MzScheme DLL 文件。如果不使用 MzScheme 接口, 你就不需要它们。这样,即使没有这些 DLL 文件,你也可使用 Vim。 要使用 MzScheme 接口,MzScheme DLL 必须在搜索路径上。控制台窗口里输入 "path" 可以看到 (搜索路径) 当前使用的目录。 DLL 的名字必须匹配 Vim 编译时所使用的 MzScheme 版本。对于 MzScheme 209 版本, 它们的名字分别为 "libmzsch209_000.dll" 和 "libmzgc209_000.dll"。要确信这一点, 察看 ":version" 命令的输出,注意 "Compilation" 信息中的 -DDYNAMIC_MZSCH_DLL= "内容" 和 -DDYNAMIC_MZGC_DLL="内容"。
vim:tw=78:ts=8:sts=4:ft=help:norl:
Generated by vim2html on 2008年 03月 27日 星期四 17:04:45 CST