if_ole

if_ole.txt 适用于 Vim 9.2 版本。 最近更新: 2023年2月 VIM 参考手册 by Paul Moore 译者: Dasn Vim 的 OLE 接口 ole-interface 1. 激活 OLE 功能 ole-activation 2. 方法 ole-methods 3. "normal" 命令 ole-normal 4. 注册 ole-registration 5. 与微软的 Visual Studio 集成 MSVisualStudio {仅当编译时加入 +ole 特性才有效。参见 src/if_ole.INSTALL} 一个替代方案是使用 客户机服务器 模式进行通信 clientserver

1. 激活 OLE 功能 ole-activation

Vim 可以作为 OLE 服务器运行,从而能被任意的 OLE 客户端访问,例如: 我们可以用 Visual Basic,Python,或者 Perl 与 Vim 通信。Vim 的程序名 (在 OLE 中称为 "ProgID") 是 "Vim.Application"。 因此,要启动 Vim 实例 (或者要与已启动的实例通信),应该使用类似于下面的代码: [Visual Basic] Dim Vim As Object Set Vim = CreateObject("Vim.Application") [Python] from win32com.client.dynamic import Dispatch vim = Dispatch('Vim.Application') [Perl] use Win32::OLE; $vim = new Win32::OLE 'Vim.Application'; [C#] // 在项目中加入 Vim 的引用。 // 选择 COM 标签页。 // 选择 "Vim Ole Interface 1.1 Type Library" Vim.Vim vimobj = new Vim.Vim(); Vim 不支持作为 "隐藏" OLE 服务器运行,这一点 Vim 不像其它一些 OLE 服务器。Vim 的 OLE 客户端启动时,会立即启动 Vim 程序实例并使之可见。简单断开 OLE 连接也不 会自动关闭 Vim 实例,为此需要显式地执行退出命令 (如 :qa!:wqa ) 才可以。

2. 方法 ole-methods

Vim 为客户端提供了四种方法。 ole-sendkeys SendKeys(keys) 执行一系列键击。 本函数接受一个参数,代表键击字符串。通过此函数发送这些键击相当于用户在 Vim 里 直接敲击键盘。可用的 <..> 记法来输入特殊键,和在映射右手边里使用的格式一样 (参 考 :map 特殊键的表达方式译者)。备注: 不支持 Ex 模式下的 "normal" 命令 - 见下 面 ole-normal 。 例子: (Visual Basic 语法) Vim.SendKeys "ihello<Esc>" Vim.SendKeys "ma1GV4jy`a" 此例假设 Vim 正处于普通模式,要强制进入普通模式,可以在字符序列前加入 CTRL-\ CTRL-N: Vim.SendKeys "<C-\><C-N>ihello<Esc>" (译者注: 下面是 Perl 语法: $vim->SendKeys("<C-\\><C-N>ihello<Esc>"); 备注: 在 Perl 语法里,特殊字符前需要加 "\"。) CTRL-\ CTRL-N 可使 Vim 从插入模式或命令行模式返回普通模式。 备注: 该命令在 Vim 命令尚未输入完成 (执行到一半) 时无法工作。 ole-eval Eval(expr) 计算表达式的值。 本函数接受一个参数 expr,代表要在 Vim 普通格式下执行的表达式 (参考 expression )。返回包含表达式计算结果的字符串。如果返回类型为 List ,会通过连 接列表项并插入换行符以转化为字符串。 例子: (Visual Basic 语法) Line20 = Vim.Eval("getline(20)") Twelve = Vim.Eval("6 + 6") ' 注意,这是一个字符串。 Font = Vim.Eval("&guifont") ole-setforeground SetForeground() 让 Vim 窗口转入前台工作。 本函数不接受参数,也没有返回值。 例子: (Visual Basic 语法) Vim.SetForeground ole-gethwnd GetHwnd() 返回 Vim 窗口的句柄。 本函数不接受参数,并返回 Vim 主窗口的句柄。可用该句柄控制 Vim 窗口、或者跟踪窗 口的 z-深度,等等。 例子: (Visual Basic 语法) Vim_Hwnd = Vim.GetHwnd

3. "normal" 命令 ole-normal

因为 Vim 是通过 Ex 模式下的 :normal 命令来实现对 OLE 命令的处理,所以 Vim 不能 通过 OLE 执行 :normal 命令。此类尝试肯定达不到想要的结果。可能无害,也可能不可 预测。 现在没有办法能捕获这种错误,用户在使用时需要注意有这么一个限制。

4. 注册 ole-registration E243

在 Vim 能作为 OLE 服务器运行之前,必须先向系统注册。为此,可在运行 Vim 时加上 参数 "-register"。 -register gvim -register 运行 OLE 版本的 gvim 时,如果尚未注册 Vim OLE 服务器,会弹出一个对话框供用户选 择是否注册,选择 "Yes" 注册。 有时候注册可能失败,这可能是因为注册表不可写。如果是这个原因,需要以管理员身份 运行 gvim。 一旦注册,Vim 的路径就会被存储到注册表里。在移动、删除或升级 Vim 之前,应该使 用 "-unregister" 清除这些注册信息。 -unregister gvim -unregister 系统会使用最先注册的 Vim 执行 OLE 命令。如果已有 Vim 在运行,会使用该 Vim 实 例。如果有 (多个) Vim 会话正在运行,但不希望它们响应 OLE 命令,可以使用非 OLE 版本的 Vim,并将其放到别的目录里运行。此时不应把 OLE 版本的 Vim 放在正常搜索路 径中,以确保键入 "gvim" 时启动的是非 OLE 版本。 -silent 如果不想让 Vim 在注册时弹出对话框,可以在前面加 "-silent" 参数: gvim -silent -register gvim -silent -unregister

5. 与微软的 Visual Studio 集成 MSVisualStudio

9.0.0698 补丁从 Vim 中删除了旧有的 "VisVim" 集成。 在 Visual Studio .Net 里使用 Vim .Net Studio 提供了外部编辑器支持。可按以下步骤进行: 在 .Net Studio 里,选择菜单 Tools->External Tools... 加入 Title - Vim Command - c:\vim\vim63\gvim.exe Arguments - --servername VS_NET --remote-silent "+call cursor($(CurLine), $(CurCol))" $(ItemPath) Init Dir - 空 现在,在 .Net 里打开文件时,就可以在 .Net 菜单里选择: Tools->Vim 就可以 Vim 里打开文件。 可以把该外部命令作为图标加入,放在任何位置上。也可以把它设为缺省编辑器。 如果有其他进一步的改进,请到 Vim 邮件列表上发帖,以告知我们。 --servername VS_NET 会建立 vim 的新实例,名为 VS_NET。此时,如果从 VS 里打开多个文件,它们会使用同 一个 Vim 实例。此时可以运行多个 Vim 实例,但可以控制在哪个实例里编辑 VS 文件。 --remote-silent "+call cursor(10, 27)" - 把光标放在第 10 行第 27 列 Vim 里 :h --remote-silent 可以了解详情 [.Net 的评注由 Dave Fishburn 和 Brian Sturk 提供]

vim:tw=78:ts=8:noet:ft=help:norl: