*if_mzsch.txt*  For Vim version 7.3.  最近更新: 2010年6月


		  VIM 参考手册	  by Bram Moolenaar
				译者: Willis
				http://vimcdoc.sf.net


Vim 的 MzScheme 接口	    				*mzscheme* *MzScheme*

1. 命令	    				|mzscheme-commands|
2. 示例	    				|mzscheme-examples|
3. 线程	    				|mzscheme-threads|
4. MzScheme 对 Vim 的访问		|mzscheme-vim|
5. mzeval() Vim 函数                    |mzscheme-mzeval|
6. 动态调入	    			|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 无此功能}

这些命令基本上做同样的一件事 - 执行一段 MzScheme 代码。执行期间，"当前行范围"
设为给定的行范围。

:mzscheme 执行的代码来自命令行。
:mzfile 执行的代码来自给定文件的内容。

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))
<
下面的例子都使用此命名方案。

							*mzscheme-sandbox*
在沙盘 |sandbox| 里执行时，对一些文件系统和 Vim 接口的过程的访问受到限制。

==============================================================================
2. 示例	    						*mzscheme-examples*
>
	:mzscheme (display "Hello")
	:mz (display (string-append "Using MzScheme version " (version)))
	:mzscheme (require (prefix vim- vimext)) ; 用于 MzScheme < 4.x
	:mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x
	:mzscheme (vim-set-buff-line 10 "This is line #10")
<
内含脚本的使用: >
	function! <SID>SetFirstLine()
	    :mz << EOF
	    (display "!!!")
	    (require (prefix vim- vimext))
	    ; 更新的版本 (require (prefix-in vim- 'vimext))
	    (vim-set-buff-line 1 "This is line #1")
	    (vim-beep)
	    EOF
	endfunction

	nmap <F9> :call <SID>SetFirstLine() <CR>
<
文件执行: >
	:mzfile supascript.scm
<
Vim 例外处理: >
	:mz << EOF
	(require (prefix vim- vimext))
	; 更新的版本 (require (prefix-in vim- 'vimext))
	(with-handlers
	  ([exn:vim? (lambda (e) (display (exn-message e)))])
	  (vim-eval "nonsense-string"))
	EOF
<
vimext 模块自动实例化 (可以放在 |vimrc| 里): >
    function! MzRequire()
	:redir => l:mzversion
	:mz (version)
	:redir END
	if strpart(l:mzversion, 1, 1) < "4"
	    " MzScheme 版本号 < 4.x:
	    :mz (require (prefix vim- vimext))
	else
	    " 更新的版本:
	    :mz (require (prefix-in vim- 'vimext))
	endif
    endfunction

    if has("mzscheme")
	silent call MzRequire()
    endif
<
==============================================================================
3. 线程	    						*mzscheme-threads*

MzScheme 接口支持线程。它们和操作系统的线程相互独立，因此调度是必要的。
'mzquantum' 选项决定 Vim 应每隔多久轮询可用的 MzScheme 线程。
备注
Vim 控制台版本的线程调度不如 GUI 版本的可靠。

==============================================================================
4. MzScheme 对 Vim 的访问				*mzscheme-vim*

							*mzscheme-vimext*
'vimext' 模块提供对 MzScheme 接口定义的例程的访问。

通用
------
    (command {command-string})	    执行 Vim ":Ex" 风格的命令。
    (eval {expr-string})	    计算 vim 表达式，返回相应的 MzScheme 对
                                    象: |List| 返回 Scheme 列表，|Dictionary|
				    返回 哈希表。
				    注意 这和 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|。

缓冲区							 *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)			    得到当前缓冲区。使用其它的 MzScheme 接口历
				    程来修改当前缓冲区。
    (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)。

窗口							    *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. mzeval() Vim 函数					    *mzscheme-mzeval*

使用 |mzeval()| 函数可以提供另一方向的接口，它计算 MzScheme 表达式并把结果赋给
Vim。

==============================================================================
6. 动态调入					    *mzscheme-dynamic* *E815*

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:
