【免费下载链接】eclim
Expose eclipse features inside of vim.
Eclim 是一款把 Eclipse 强大功能"搬进" Vim 的开源工具,而它的多语言支持完全靠插件实现——每一门语言(Java、Python、Web 等)都对应一个独立的 Eclim 插件。本教程将带你从零开始,分步完成一个Eclim 自定义插件的编写,让 Vim 也能拥有你常用语言的代码补全、校验与搜索能力。
💡 核心思路:Eclim 插件本质上是一个Eclipse 插件(bundle),通过
org.eclim.前缀被 Eclimd 守护进程自动发现并加载。
先搞懂:Eclim 插件的工作机制
在动手之前,先花 1 分钟理解整体架构(详见 doc/content/development/architecture.rst):
- Vim 端:你在 Vim 里输入的命令由
eclim.vim统一入口通过nailgun协议发送给 Eclimd 守护进程; - Eclimd 端:
Services根据命令名找到对应的Command实现并执行,结果以 JSON 返回; - 插件加载:Eclimd 启动时会扫描所有带
org.eclim.前缀的 Eclipse 插件包,找到其中的PluginResources并调用其initialize()方法,把消息、命令、配置注入 Eclim。
所以,编写插件的工作量主要集中在两块:Java 侧(实现 Eclipse API 调用)和Vim 侧(定义用户命令与设置)。
准备工作:克隆源码并认识目录结构
git clone https://gitcode.com/gh_mirrors/ec/eclim仓库按 bundle 组织,每个语言插件一个顶层目录,推荐参考实现最完整的 Python 插件 org.eclim.pydev/:
| 目录/文件 | 作用 |
|---|---|
| org.eclim.pydev/META-INF/MANIFEST.MF | 声明插件依赖的 bundle |
| org.eclim.pydev/java/org/eclim/plugin/pydev/PluginResources.java | 插件入口,注册 nature、项目管理器、偏好设置 |
| org.eclim.pydev/java/org/eclim/plugin/pydev/command/ | 各类命令实现(补全、搜索、校验等) |
| org.eclim.pydev/vim/eclim/ | Vim 侧的命令、ftplugin、syntax 文件 |
| org.eclim.pydev/build_pydev.gant | 插件构建脚本,声明 Eclipse 特性依赖 |
第 1 步:用 ant plugin.create 生成插件骨架
Eclim 内置了插件模板(位于 ant/template/org.eclim.${plugin}/),只需一条命令即可生成完整目录:
$ ant plugin.create系统会提示你输入插件名,命名需满足(见 ant/build.gant 中的plugin.create目标):
- 与将要集成的 Eclipse 插件名相关;
- 全小写、仅含字母数字、不能以数字开头;
- 不与已有 Eclim 插件重名。
生成后你会得到一个org.eclim.<插件名>/目录,包含开箱即用的骨架文件:
build_<插件名>.gant:构建脚本;META-INF/MANIFEST.MF:依赖清单;java/org/eclim/plugin/<插件名>/PluginResources.java:插件入口;plugin.properties:声明eclim.plugin.resources指向你的PluginResources类。
模板细节可参考 ant/template/org.eclim.${plugin}/build_${plugin}.gant 和 ant/template/org.eclim.${plugin}/plugin.properties。
第 2 步:在 build.gant 中声明 Eclipse 特性依赖
编辑生成的build_<插件名>.gant,把FIXME替换为你集成的 Eclipse 特性的准确 ID:
feature_mylang = 'org.eclipse.mylang.feature' # 例如 'org.eclipse.jdt'构建脚本会到你的 Eclipse 安装目录的features/(含dropins/)中查找该特性,找不到就无法构建。对照示例:JDT 插件填'org.eclipse.jdt'(见 org.eclim.jdt/build_jdt.gant),Python 插件填'org.python.pydev.feature'(见 org.eclim.pydev/build_pydev.gant)。
第 3 步:在 MANIFEST.MF 中配置 Bundle 依赖
META-INF/MANIFEST.MF决定 Eclipse 加载你的插件时类路径里有哪些类,你只需要维护Require-Bundle:一节,例如:
Require-Bundle: org.eclim, org.eclim.core, org.eclipse.core.resources, org.eclipse.core.runtime⚠️ 常见坑:运行时抛出ClassNotFoundException,九成是包含该类的 bundle 没有写进Require-Bundle。注意添加新 bundle 后需要重启 eclimd才能生效(自定义 classpath 容器会重新扫描各插件清单)。
第 4 步:在 PluginResources 中注册 Nature 与项目管理器
这是插件的"注册中心"。以 Python 插件为例,PluginResources.java 的initialize()方法做了三件关键的事:
// 1. 为 nature 注册一个简短别名,方便用户在 Vim 中创建项目 ProjectNatureFactory.addNature("python", PythonNature.PYTHON_NATURE_ID); // 2. 注册项目管理器,负责项目的创建/更新/刷新逻辑 ProjectManagement.addProjectManager( PythonNature.PYTHON_NATURE_ID, new PydevProjectManager()); // 3. (可选)注册可在 Vim 中配置的偏好设置 PreferenceFactory.addPreferences(...);其中Nature ID的找法:打开一个已有项目的.project文件,在<natures>段找到全限定名,再到目标 Eclipse 插件源码中搜索该常量(如 JDT 的JavaCore.NATURE_ID)。
项目管理器是最有挑战的部分:需要阅读目标 Eclipse 插件的项目创建向导源码,复刻创建项目时生成的文件(如 pydev 的.pydevproject,参考 PydevProjectManager.java)。官方文档也提醒这是第一次写插件最大的坎,必要时可提取 Eclipse 文档/源码辅助分析:
$ ant eclipse.doc # 提取 doc jar 到 Eclipse 主目录的 doc/ 下 $ ant eclipse.src # 提取 src jar 到 src/ 下第 5 步:编写 Vim 侧命令与设置(可选但推荐)
Java 命令写好后,要在 Vim 里"暴露"出来。以 Python 插件为例,org.eclim.pydev/vim/eclim/plugin/pydev.vim 定义了:PythonInterpreter等 Vim 命令,org.eclim.pydev/vim/eclim/plugin/settings_python.vim 则通过eclim#AddVimSetting注册了可配置项(如g:EclimPythonValidate)。
文件放置规则:
- 通用命令 → 插件的
vim/eclim/plugin/下; - 仅特定文件类型可用 →
vim/eclim/ftplugin/<类型>.vim下。
具体写法可参照官方命令开发指南 doc/content/development/commands.rst,核心就是:在autoload函数里拼好参数,调用eclim#Execute()发送命令并处理 JSON 响应。
构建、安装与测试
一切就绪后的完整流程:
- 构建:在项目根目录执行
ant build,你的插件会随其它 bundle 一起编译打包; - 安装到 Eclipse:按 doc/content/development/gettingstarted.rst 的说明将构建产物放入 Eclipse(或 dropins);
- 启动 Eclimd并在命令行直接测试新命令,例如:
$ eclim -pretty -command <你的命令名> -p <项目名> -f <文件>- 热加载技巧:开发命令时无需每次重启 Eclimd,执行
eclim -command reload即可重载插件 bundle(org.eclim.core除外); - 验证 Vim 端:重启 Vim,运行你定义的用户命令,看到输出即大功告成 🎉
常见问题速查
| 问题 | 排查方向 |
|---|---|
| 构建时找不到特性 | feature_<插件名>的 ID 与 Eclipse features 目录中的实际名称不符 |
运行时ClassNotFoundException | Require-Bundle缺少对应 bundle,改后重启 eclimd |
| 命令未注册/无法调用 | 检查plugin.properties的eclim.plugin.resources是否指向正确的PluginResources |
| 创建项目行为异常 | 对比 Eclipse GUI 创建的项目产物,完善ProjectManager |
延伸阅读
- 插件开发官方指南(本教程的权威出处):doc/content/development/plugins.rst
- 命令开发完整示例:doc/content/development/commands.rst
- Java 插件参考实现:org.eclim.jdt/、Web 插件:org.eclim.wst/
至此,你已经掌握了 Eclim 自定义插件的完整开发链路:生成骨架 → 声明特性依赖 → 配置 bundle → 注册 nature 与项目管理器 → 暴露 Vim 命令。把这套流程套用到你喜欢的任何拥有 Eclipse 插件的语言上,Vim 就能多一门"满血"支持的语言!
【免费下载链接】eclim
Expose eclipse features inside of vim.
相关推荐
JSON Canvas完全指南:三步构建你的无限画布空间数据
JSON Canvas完全指南:三步构建你的无限画布空间数据 你是否曾在整理复杂项目时感到信息碎片化?是否希望将散乱的想法、文档和链接组织成一个有机的整体?今天
文档GP2040-CE驱动系统详解:XInput、PS4、Switch等协议实现
GP2040 CE驱动系统详解:XInput、PS4、Switch等协议实现 GP2040 CE是一款专为Raspberry Pi Pico及其他RP2040开
嵌入式固件硬件开发终极Vim语法文件指南:从零开始自定义语言高亮的完整教程
终极Vim语法文件指南:从零开始自定义语言高亮的完整教程 Vim作为一款功能强大的文本编辑器,其语法高亮系统能够帮助开发者更清晰地阅读和编写代码。本指南将带你了
代码编辑器开发工具CLI桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考