*netbeans.txt* For Vim version 6.4. 最近更新: 2006年2月VIM 参考手册 by Gordon Prieur
译者
: Willis http://vimcdoc.sf.net NetBeans ExternalEditor 集成特性 *netbeans* *netbeans-support* 1. 简介 |netbeans-intro| 2. NetBeans 键盘映射 |netbeans-keybindings| 3. 支持 NetBeans 的 Vim 配置 |netbeans-configure| 4. 下载 NetBeans |netbeans-download| 5. 为 Vim 准备 NetBeans |netbeans-preparation| 6. 取得外部编辑器模块 |obtaining-exted| 7. 设置 NetBeans 以运行 Vim |netbeans-setup| 8. 消息 |netbeans-messages| 9. 从 NetBeans 里运行 Vim |netbeans-run| 10. NetBeans 协议 |netbeans-protocol| 11. 已知问题 |netbeans-problems|{Vi 没有这些功能}
{only 只有编译时加入 |+netbeans_intg| 特性才有效}
1. 简介 *netbeans-intro*
NetBeans 是一个开源的集成开发环境,由 Sun Microsystems, Inc 和 netbeans.org 开 发团体共同开发。刚开始只是一个 Java IDE,在最近的发行版本中, NetBeans 已经有 C、C++、和 Fortran 的支持。 要知道更多的信息,访问 NetBeans 的主网站 http://www.netbeans.org,或者 NetBeans 外部编辑器站点 http://externaleditor.netbeans.org。 Sun Microsystems, Inc. 也以 Sun ONE Studio 的名字发行 NetBeans。访问 http://www.sun.com 可以了解更多关于 Sun ONE Studio 产品线的信息。 目前的 NetBeans 发行版本提供 Java 的完全支持和 C、C++ 以及 Fortran 的有限支 持。目前的 Sun ONE Studio 发行版本提供 Java、C、C++ 和 Fortran 的完全支持。 NetBeans 的接口也被 Agide, A-A-P 的 GUI IDE 所支持。 Agide 和 NetBeans 非常不同: - 基于 Python 而不是 Java,更小的内存需求,更快的启动。 - Agide 是一个支持多种工具协同工作的框架环境。 参见 A-A-P 的网站了解了解相关信息: http://www.A-A-P.org。
2. NetBeans 键盘映射 *netbeans-keybindings*
Vim 理解执行 NetBeans 命令的键盘映射。它们通常是功能键的组合。要执行某个 NetBeans 命令,用户必须按 Pause 键,再按 NetBeans 的键盘映射。比如,要编译 Java 文件,NetBeans 的键盘映射是 "F9"。所以,在 vim 里,按 "Pause F9" 起到编译 java 文件的功能。要切换当前行的断点状态,按 "Pause Shift F8"。 Pause 键是功能键 21。如果你没有可用的 Pause 键,而想用 F8 代替,用:
:map
<F8>
<F21>
外部编辑器模块动态地读取 NetBeans 的键盘映射,所以 vim 应该总能得到最新的键盘 映射,即使在 NetBeans 改变它们以后。
3. 支持 NetBeans 的 Vim 配置 *netbeans-configure*
要得到安装 vim 的更多帮助,请阅读 Vim 用户手册的 |usr_90.txt|。 在 Unix 上 不带参数的 configure 应该已经包含 NetBeans 接口,如果 configure 检查你的系统支 持所需的功能的话。 如果你不想要 NetBeans 接口,你可以在 Makefile 里去掉包含 "--disable-netbeans" 的一行的注释。 目前,只有 gvim 支持这种集成,因为 NetBeans 没有办法提供 vim 命令的终端模拟。 另外,支持的 GUI 只有 GTK、GNOME 和 Motif。 如果需要 Motif 支持,用户应该提供 XPM 库。参见 |workshop-xpm| 了解如何得到最新 版本的 XPM 的详情。 在 MS-Windows 上 Win32 的支持现在还处于实验阶段。 要使用 Win32 上的 XPM 标号,(例如使用 NetBeans 时),你需要自己编译 XPM,或者使 用预编译的库: http://iamphet.nm.ru/misc/ (MS Visual C++ 版本) 或 http://gnuwin32.sourceforge.net (MinGW 版本)。
4. 下载 NetBeans *netbeans-download*
NetBeans IDE 可以从 netbeans.org 下载。你可以下载发行版,源代码,或者用 CVS 得 到当前的源代码树。如果你选择下载源代码,遵照 netbeans.org 的指示来编译 NetBeans。 视乎你下载的 NetBeans 版本,你可能需要更多的工作: 下载所需的外部编辑器模块。这 是使 NetBeans 支持 gvim (或者 xemacs :-)) 的模块。如果你的 NetBeans 不带之,参 见 http://externaleditor.netbeans.org 了解如何下载该模块的详情。 关于 C、C++ 和 Fortran 的支持,你需要得到 cpp 模块。关于这个模块的信息,参见 http://cpp.netbeans.org。 你已可以从 Sun Microsystems, Inc 下载 30 天免费测试的 Sun ONE Studio。详情见 http://www.sun.com。
5. 为 Vim 准备 NetBeans *netbeans-preparation*
要使得 NetBeans 支持 vim,NetBeans 外部编辑器模块必须已经调入并且能使用。如果 你使用 Sun ONE Studio Enterprise Edition,那么这一模块应该已经能用了。如果你用 的是 NetBeans 发行版,你需要自己去找这个开源的模块。 你可以检查该模块是不是已经存在。打开 Tools->Options 对话框,找到 "Modules" 列 表 (IDE Configuration->System->Modules)。如果该列表包含 "External Editor",检 查一下它是不是被许可使用了 ("Enabled" 属性应该为 "True")。如果你的列表里没有这 一项,见下一节 |obtaining-exted|。
6. 取得外部编辑器模块 *obtaining-exted*
有两个方法可以取得外部编辑器模块。最简单的方式是使用 NetBeans 更新中心,下载并 安装该模块。不幸的是,有的版本的更新中心找不到这个模块。如果这样不行,你需要自 己下载源代码并编译该模块。我会试图使这个模块出现在 NetBeans 更新中心的,这样自 己编译就不需要了。也可查看 http://externaleditor.netbeans.org,看看有无取得的 方法。 要通过 CVS 下载外部编辑器的源码并自己编译,见 http://externaleditor.netbeans.org 和 http://www.netbeans.org。不幸的是,这个 方法并不是很简单。
7. 设置 NetBeans 以运行 Vim *netbeans-setup*
假设你已经根据 |netbeans-preparation| 调入和允许使用 NetBeans 外部编辑器模块, 你只需要检查一下 gvim 命令行已经为你的环境正确配置好了。 打开 Tools->Options 对话框,打开 Editing 种类,选择 External Editor。右边的窗 格应该包含 Properties 和 Expert 页。在 Properties 页里,确保 "Editor Type" 设 为 "Vim"。在 Expert 页里确保 "Vim Command" 是正确的。 如果你要改变 "Vim Command",要小心。必须提供有些命令选项,以便正确的建立连接。 你可以改变命令名字本身,但也就那么多了。如果你的 gvim 可以在 $PATH 里找到,那 么 VIM Command 就可以用 "gvim" 开始。如果你不想从 $PATH 里搜索 gvim,那么就提 供完整的路径名。这样,你就可以对 NetBeans 打开的任何源代码使用 gvim 编辑了。 如果有些文件在 gvim 里打开,有些 (有着不同后缀) 则使用缺省的 NetBeans 编辑器, 那你就需要检查 Expert 页的 MIME Type 属性。NetBeans 面向 MIME 类型,而外部编辑 器只会使用这个属性所指定的 MIME 类型。
8. 消息 *netbeans-messages*
以下这些消息是 NetBeans 特有的: *E463* Region is guarded, cannot modify NetBeans 定义了文本的保护区域,你不能编辑这个区域。 *E656* NetBeans dissallows writes of unmodified buffers NetBeans 不支持写入 NetBeans 打开的未修改的缓冲区。 *E657* Partial writes disallowed for NetBeans buffers NetBeans 不支持部分写入 NetBeans 打开的缓冲区。 *E658* NetBeans connection lost for this buffer NetBeans 不清楚这个文件的目前状态。与其冒着破坏文件的风险, NetBeans 关闭了这个文件的连接。Vim 自己要负责修改和保存文件的 改变,而 NetBeans 将不会知道这些改变。
9. 从 NetBeans 里运行 Vim *netbeans-run*
NetBeans 启动 Vim 时使用 |-nb| 参数。用三种形式可以使用,取决于如何指定连接所 需的信息。 -nb={fname}
从文件读取 -nb:{hostname}
:{addr}
:{password}
直接 -nb 从文件或者环境变量里读取 *E660* *E668* 为了安全的原因,最好的方法是把信息写到只有用户能读得文件里。文件名字可以通过 "-nb={fname}
" 的参数传递。或者,在不带的参数的 "-nb" 形式里,由环境变量 "__NETBEANS_CONINFO" 指定。文件里必须包含以下三行内容,顺序随意: host={hostname}
port={addr}
auth={password}
其他的行被忽略。Vim 的调用者须自己负责在不用的时候删除这个文件。{hostname}
指定 NetBeans 运行的机器名。如果不提供,则取环境变量 "__NETBEANS_HOST" 的值,如果还没有,缺省值是 "localhost"。{addr}
指定 NetBeans 所用的端口号。如果不提供,则取环境变量 "__NETBEANS_SOCKET" 的值,如果还没有,缺省值是 3219。{password}
指定连接到 NetBeans 所用的密码。如果不提供,则取环境变量 "__NETBEANS_VIM_PASSWORD" 的值,如果还没有,缺省值是 "changeme"。
10. NetBeans 协议 *netbeans-protocol*
NetBeans 和 Vim 的通信使用简单文本消息。该协议原先是为 NetBeans 的外部编辑器所 设计的 (见 http://externaleditor.netbeans.org)。后来它被扩展,使得 Agide (A-A-P 的 GUI IDE,见 http://www.a-a-p.org) 也能使用。该扩展被标为 "2.1 版本"。 该协议的 2.2 版本有若干小的改动,这些改动应该只影响 NetBeans 用户 (而不是 Agide 用户)。不过,一个修正的漏洞可能会引起混淆: netbeans_saved() 函数以前发送 一个 "save" 协议命令。在 2.1 版本和以前,它被不正确地解读为写操作已发生的通 知。实际上,它告诉 NetBeans 保存文件,所以多个写操作可能已经发生了。这个错误引 起了若干问题,而 2.2 已修正了这个错误。为了减少这个混淆再次发生的可能性, netbeans_saved() 已经被改名为 netbeans_save_buffer()。 目前,消息通过套接字传送。因为消息是简单的 UTF-8 文本,该协议也许可以用其它通 信机制完成。 10.1 消息类型 |nb-messages| 10.2 术语 |nb-terms| 10.3 命令 |nb-commands| 10.4 函数和应答 |nb-functions| 10.5 事件 |nb-events| 10.6 特殊消息 |nb-special| *E627* *E628* *E629* *E630* *E631* *E632* *E633* *E634* *E635* *E636* *E637* *E638* *E639* *E640* *E641* *E642* *E643* *E644* *E645* *E646* *E647* *E648* *E649* *E650* *E651* *E652* *E653* *E654* 这些错误发生意味着某个消息违反了协议。 10.1 消息类型 *nb-messages* 有四类消息:类型 方向 注释
命令 IDE -> 编辑器 不需要应答 函数 IDE -> 编辑器 编辑器必须应答 应答 编辑器 -> IDE 只用于函数的应答 事件 编辑器 -> IDE 不需要应答 每条消息是换行符终止的一行文本。参数以单个空格分隔。每个消息的第一项由消息的类 型决定:类型 第一项 示例
命令 bufID:name!seqno 11:showBalloon!123 "text" 函数 bufID:name/seqno 11:getLength/123 应答 seqno 123 5000 事件 bufID:name=123 11:keyCommand=123 "S-F2" 10.2 术语 *nb-terms* bufID 缓冲区号。每条消息可以指定一个特定的缓冲区,也可以不指定任何缓 冲区 (泛指)。泛指的消息使用为零的 bufID。注意
: 缓冲区号是 IDE 分配的。这不是 Vim 的缓冲区号。bufID 应该是从一开始顺序递增的 数字。 seqno IDE 用序列号标示命令和函数。应答需要指明相关联的函数的序列号。 事件可以使用为零的序列号 (也可以用最近一次收到的命令和函数的序 列号)。 string 双引号括起的参数。文本使用 UTF-8 编码。这也意味着 ASCII 字符可 以原封不动的使用。一些特殊字符用反斜杠的形式表示: \" 双引号 \n 换行 \r 回车 \t 制表 (可选,也可以直接表示) \\ 反斜杠 NUL 字节是不允许的! boolean 可取两个可能值的参数: T 真 F 假 number 十进制的参数。 optnum 参数,或为十进制数字,或为 "none" (没有引号)。 offset 数值参数,表示缓冲区的一个字节位置 (偏移量)。第一个字节的偏移 量为 0。行尾的字节计数决定于在文件里如何表示 (CR/LF 是两个字 节)。注意
一个多字节的字符的字节计数可能多于一。 lnum/col 参数,表示行号和列号。行号从一开始,列号以字节位置表示,从零开 始。注意
一个多字节的字符可能跨越多列。 pathname 字符串参数: 带完整路径的文件名。 10.3 命令 *nb-commands* actionMenuItem 没有实现。 actionSensitivity 没有实现。 addAnno serNum typeNum off len 在缓冲区里加上评注 (annotation)。 参数: serNum number 该评注的序列号,删除该评注时可以用到 typeNum number 用 defineAnnoType 定义的该缓冲区的评 注类型序列号 off number 评注所加的位置 len number 没有用到 在 2.1 版本中,"lnum/col" 可以用来代替 "off"。 balloonResult text 没有实现。 close 关闭缓冲区。这会使得我们失去当前的缓冲区。使用时要小心! create 建立一个没有名字的缓冲区。替换当前的缓冲区 (改变的时候,它是隐 藏的)。 这是 NetBeans 打开文件时使用的第一个命令。命令序列应该是: create setCaretListener (忽略) setModified (没有影响) setContentType (忽略) startDocumentListen setTitle setFullName defineAnnoType typeNum typeName tooltip glyphFile fg bg 定义该缓冲区的一种评注类型。 参数: typeNum number 序列号 (这里没有用到) typeName string 标识这个评注的名字 tooltip string 没有用到 glyphFile string 图标文件名 fg optnum 高亮行前景色 bg optnum 高亮行背景色 Vim 会定义评注所用的标号。 当 "fg" 和 "bg" 都是 "none" 的时候,不使用高亮行 (2.1 版本新出 现)。 当 "glyphFile" 为空时,不使用文本标号 (2.1 版本新出现)。 但 "glyphFile" 为一到两个字符长时,使用文本标号 (2.1 版本新出 现)。注意
: 评注会按顺序定义,而其序列号以后可以在 addAnno 里用到。 editFile pathname 设置缓冲区的名字为字符串参数 pathname,并编辑该参数指定的文 件。 这是通常 IDE 告诉编辑器编辑一个文件的方法。如果 IDE 要把文件内 容直接传递给编辑器,那么应该用这些命令: setFullName insert initDone 2.1 版本新出现。 enableBalloonEval 没有实现。 endAtomic 结束一个原子操作。"startAtomic" 和 "endAtomic" 之间的所有操作 可以一次全部撤销。不过,这还没有实现。如果需要,重画屏幕。 guard off len 标识缓冲区的一片区域为保护区域。这意味着那里不能被编辑。"off" 和 "len" 是两个数值,它们界定保护文本的范围。 initDone 标识这个缓冲区可用。这也隐含地意味着它成为当前缓冲区。激活 BufReadPost 自动事件。 moveAnnoToFront serNum 没有实现。 netbeansBuffer isNetbeansBuffer 如果 "isNetbeansBuffer" 为 "T",那么该缓冲区为 NetBeans 所 "拥 有"。2.2 版本新出现。 putBufferNumber pathname 把一个缓冲区号和 Vim 和以字符串参数 "pathname" 命名的 Vim 缓冲 区联系起来。它用于编辑器向 IDE 报告它要编辑另外一个文件,而 IDE 需要告诉编辑器它为这个文件分配的缓冲区号。同时,这个命令也 把缓冲区标为已初始化。 2.1 版本新出现。 raise 把编辑器带到前台。 2.1 版本新出现。 removeAnno serNum 删除以前这个缓冲区里放置的评注。"serNum" 是 addAnno 使用的相同 的数字。 save 如果缓冲区已修改,就保存之。接口的另一侧应该写入缓冲区,把缓冲 区标为已修改 ('setModified'),并复位缓冲区的 "changed" 标志位。 如果以下条件有一为真,则跳过写入的步骤: - 'write' 没有置位 - 缓冲区只读 - 缓冲区没有文件名 - 'buftype' 不允许写入 2.2 版本新出现。 setAsUser 没有实现。 setBufferNumber pathname 把一个缓冲区号和以字符串参数 "pathname" 命名的 Vim 缓冲区联系 起来。它用于编辑器向 IDE 报告它要编辑另外一个文件,而 IDE 需要 告诉编辑器它为这个文件分配的缓冲区号。它还有把这个缓冲区设为当 前缓冲区的副作用。 参见 "putBufferedBumber",它也许更有用。 setContentType 没有实现。 setDot off 使得缓冲区成为当前缓冲区,并设置光标到相应的位置。折叠会相应打 开,使得光标行可见。 2.1 版本里 "lnum/col" 可以用来替代 "off"。 setExitDelay seconds 设置退出延迟为 seconds 秒,second 为数值参数。 该延迟用于给 IDE 在真正退出之前处理某些事情的时间。缺省的延迟 是 2 秒。 2.1 版本新出现。 setFullName pathname 为缓冲区的文件名设为字符串参数 "pathname"。 在 IDE 想编辑 IDE 控制的文件时使用该命令。这使得该缓冲区成为当 前缓冲区,但不从该文件读。"insert" 命令可以用来随后设置它的内 容。 setLocAndSize 没有实现。 setMark 没有实现。 setModified modified 如果布尔参数 "modified" 为 "T",把缓冲区标为已修改,如果为 "F",则标为未修改。 setReadOnly 没有实现。 setStyle 没有实现。 setTitle name 把缓冲区的标题改为字符串参数 "name"。标题用于 NetBeans,而不是 Vim。 setVisible visible 如果布尔参数 "visible" 为 "T",转到这个缓冲区。 "F" 参数不做任何事。 showBalloon text 在鼠标当前位置显示一个气泡 (弹出窗口),显示文本 "text",一个字 符串表达式。气泡在鼠标移动若干像素点后自动消失。 2.1 版本新出现。 specialKeys 没有实现。 startAtomic 开始一个原子操作。屏幕不更新,直到遇到 "endAtomic" 为止。 startCaretListen 没有实现。 startDocumentListen 标识缓冲区,使之向 IDE 报告 "insert" 和 "remove" 事件。缺省就 是报告这些改变。 stopCaretListen 没有实现。 stopDocumentListen 标识缓冲区,使之停止向 IDE 报告改变。 和 startDocumentListen 相反。 unguard off len 和 "guard" 相反,撤销文本区域的保护。 version 没有实现。 10.4 函数和应答 *nb-functions* getDot 没有实现。 getCursor 返回当前缓冲区和光标位置。 应答是: seqno bufID lnum col off seqno = 该函数的序列号 bufID = 当前缓冲区的号码 (如果未知,返回 -1) lnum = 当前光标的行号 (第一行为 1) col = 当前光标的列号 (字节数,从 0 开始) off = 缓冲区当前光标的位移 (以字节数计算) 2.1 版本新出现。 getLength 返回缓冲区的字节计算的长度。 如果缓冲区有 5000 个字节,那么返回的可能是: 123 5000 TODO: 解释部分行的使用情况。 getMark 没有实现。 getModified 如果指定一个缓冲区: 返回 0 如果缓冲区没有改动,反之为 1。 如果没有指定缓冲区 (缓冲区号为 0): 返回有改动的缓冲区的数目。 如果结果为 0,那么 Vim 就可以安全退出了。 2.1 版本新出现。 getText 返回缓冲区的内容,以字符串形式表示。 考虑一个只有两行的缓冲区的例子,应答可能是: 123 "first line\nsecond line\n"注意
: 文档指出应该有位移和长度两个参数。但是这没有实现。 insert off text 在位置 "off" 之前插入文本 "text"。"text" 是字符串参数,"off" 是个数值。 可能的应答: 123 没有问题 123 !message 失败注意
回答里的消息不用引号括起。 remove off length 从位置 "off" 开始删除 "length" 长度字节的文本。两个参数都是数 值。 可能的应答: 123 没有问题 123 !message 失败注意
回答里的消息不用引号括起。 saveAndExit 完成关闭 Vim 等价的操作: ":confirm qall"。如果文件内容没有改 动,或者用户没有取消 Vim 退出的操作,不返回没有任何结果。IDE 认为成功的连接关闭代表成功的结果。如果用户取消该操作,尚存的修 改过的缓冲区被作为结果返回,Vim 也不会退出。 2.1 版本新出现。 10.5 事件 *nb-events* balloonEval off len type 鼠标在文本上短暂停留。如果 "len" 为零,没有选择区域,光标在 "off" 位置上。如果 "len" 非零,从 "off" 到 "off" + "len" 的区 域被选择。 只有在该缓冲区设置了 "enableBalloonEval" 以后才会发送。"type" 尚未有定义。 尚未实现。 balloonText text 如果设置了 'ballooneval',鼠标在某段文字上出现。"text" 是字符 串,鼠标下的文本。 2.1 版本新出现。 buttonRelease button lnum col 报告按了那个鼠标键,和释放时光标的位置。只有对 NetBeans 拥有的 缓冲区有效。如果鼠标键在释放时在状态行或者分隔行时,该事件不会 被发送。如果 col 小于 1,鼠标键释放的位置在前导的标号栏。 2.2 版本新出现。 fileClosed 没有实现。 fileModified 没有实现。 fileOpened pathname open modified 用户打开某个文件。 参数: pathname 字符串 文件名 open 布尔 总是 "T" modified 布尔 总是 "F" geometry cols rows x y 报告编辑器窗口的大小和位置。 参数: cols 数值 文本列数 rows 数值 文本行数 x 数值 光标像素点横坐标 y 数值 光标像素点纵坐标 Only works for Motif. insert off text Vim 里在 "off" 位置插入了文本 "text"。只有在允许的时候才发送。 见 "startDocumentListen"。 invokeAction 没有实现。 keyCommand keyName 报告按了某个特殊键,键名是 "keyName",是个字符串。 支持的键名: F1 功能键 1 F2 功能键 2 ... F12 功能键 12 ' ' 空格 (没有引号) ! 感叹号 ... 任何其他 ASCII 可显示字符 ~ 波浪号 X 不能识别的键 键名前面可能有 "C"、"S" 和/或 "M",分别代表 Control, Shift 和 Meta (Alt) 修饰符。如果有的话,修饰符和键名以连字符分隔。例如: "C-F2". ASCII 字符是 2.1 版本新出现的。 keyAtPos keyName lnum/col 类似于 "keyCommand",同时报告光标所在的行号和列号。 2.1 版本新出现。 killed 用户关闭了一个文件。只有对 IDE 已经编号的文件才有效。 newDotAndMark off off 报告光标在缓冲区的 "off" 字节位置。只有在 "keyCommand" 事件之 前发送。 quit 没有实现。 remove off len 从 "off" 位置开始长度为 "len" 的文本在 Vim 里被删除。只有在允 许的时候才发送。见 "startDocumentListen"。 revert 没有实现。 save 缓冲区被保存,现在已处于没有修改的状态。只有在允许的时候才发 送。见 "startDocumentListen"。 startupDone 编辑器完成启动工作,可以开始编辑文件。 2.1 版本新出现。 unmodified 缓冲区现在处于未修改状态。只有在允许的时候才发送。见 "startDocumentListen"。 version vers 报告接口实现的版本号。Vim 报告 "2.2" (包括引号)。 10.6 特殊消息 *nb-special* 这些消息不遵循以上说明的消息格式。它们仍由换行符终止。 ACCEPT 不用。 AUTH password 编辑器 -> IDE: 编辑器发送给 IDE 的第一个消息。它提供套接字 服务器所需的密码。该密码由 |-nb| 参数提供。不需要引号! DISCONNECT IDE -> 编辑器: 终止连接。编辑器将会退出。IDE 应该只有在没有未 保存的改变的时候才发出此消息。 DETACH IDE -> 编辑器: 终止连接,不退出编辑器。用于当 IDE 终止但不想关 闭编辑器的场合。2.1 版本新的特性。 REJECT 不用。
11. 已知问题 *netbeans-problems*
不可能有 NUL 字节。编辑器到 IDE 的转换使得它们成为 NL 字符。反之,IDE -> 编辑 器却不能插入它们。 vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on 2006年 07月 02日 星期日 22:43:25 UTC