成功在鸿蒙PC上移植了neovim
·
现在的使用效果如下


演示视频:鸿蒙pc | neovim移植版已经成功切换到luajit了
已经完整把 Neovim 移植到了 HarmonyOS PC(鸿蒙PC),移植使用独立的依赖构建系统 harmonyos-deps 编译所有必要的依赖库。
核心特性
- 完整依赖构建 - Lua、libuv、lpeg、libiconv、luv、lua_compat53 等
- HarmonyOS适配 - 特定补丁和兼容性修复
- 静态链接方案 - 绕过 HarmonyOS 动态加载限制
- 自动化工具 - 补丁生成、构建脚本、环境配置
LuaJit 支持
- Lua 版本: LuaJIT 2.1.ROLLING(禁用JIT版本)
- 特点: 使用LuaJIT,性能最佳,保持Lua 5.1 API兼容性
- 适用场景: 生产环境,需要最高性能和稳定性
- 注意: 在HarmonyOS上JIT编译被禁用(
mmap(PROT_EXEC)失败),但仍提供其他优化 - 状态: 稳定可用
兼容性测试结果:所有Lua 5.1 API在Lua 5.4中可用,第三方插件无需修改即可工作。并成功安装了lualine.nvim插件, 演示视频:鸿蒙pc | neovim移植版已经成功切换到luajit了
技术实现细节
静态链接方案
由于 HarmonyOS 对动态加载的限制,本项目采用完全静态链接方案:
- 所有 Lua 模块预编译并嵌入二进制
- 依赖库编译为静态库(
.a文件) - 使用静态 Lua 解释器进行代码生成
HarmonyOS 特定适配
- TTY 权限修复:修改 libuv 跳过文件描述符复制,避免 SELinux 权限问题
- MessagePack 兼容性:实现动态数据大小检测,解决
sizeof()计算错误 - Lua 环境初始化:使用
preload_minimal.lua确保模块加载顺序正确
LuaJIT 在 HarmonyOS 上的实现
主分支使用 LuaJIT 2.1.ROLLING,但在 HarmonyOS 上 JIT 编译被禁用:
技术细节:
- JIT 禁用: 由于 HarmonyOS 上
mmap(PROT_EXEC)失败,构建时使用-DLUAJIT_DISABLE_JIT - 性能影响: 虽然 JIT 被禁用,但 LuaJIT 仍提供比标准 Lua 5.1 更好的性能
- API 兼容性: 完全兼容 Lua 5.1 API,所有 Lua 5.1 插件可用
- 构建配置: 通过修改
src/nvim/CMakeLists.txt确保优先使用 LuaJIT
已知问题和解决方案
| 问题 | 症状 | 解决方案 |
|---|---|---|
| TTY 权限被拒绝 | uv_tty_set_mode 返回 UV_EACCES |
修改 libuv 跳过 fd 复制 |
| MessagePack 解析失败 | unpack() 返回 "trailing data" 错误 |
实现动态数据大小检测 |
| Lua 模块加载失败 | vim.g、vim.F 等字段为 nil |
使用静态解释器和预加载机制 |
| 帮助文档生成失败 | "Operation not permitted" 错误 | 手动生成或跳过此步骤 |
| 二进制文件执行失败 | "Operation not permitted" 错误 | 使用 binary-sign-tool 手动签名 |
| ShaDa文件写入错误 | E137: ShaDa file is not writable |
禁用ShaDa功能或清理临时文件 |
| LuaJIT JIT编译失败 | mmap(PROT_EXEC) 失败 |
构建时禁用JIT(-DLUAJIT_DISABLE_JIT) |
详细构建说明
环境要求
- 操作系统: HarmonyOS HongMeng Kernel 1.11.0 或更高版本
- IDE: CodeArts IDE
- 架构: aarch64 (ARM64)
- 编译器: BiSheng Clang 15.0.4(鸿蒙官方编译器, CodeArts IDE自带)
- 构建工具:
- CMake ≥ 3.16
- Ninja 构建系统
- Git、Curl、Tar 等基础工具
构建过程说明
-
依赖构建 (
harmonyos-deps/build-deps-harmonyos.sh)- 下载所有依赖源码
- 应用 HarmonyOS 特定补丁
- 编译为静态库(避免动态加载限制)
- 安装到
harmonyos-deps/build/目录
-
Neovim构建 (
build-ohos-with-log.sh)- 检测 HarmonyOS 系统并设置编译选项
- 使用静态 Lua 解释器进行代码生成
- 链接所有依赖静态库
- 生成签名的可执行文件
手动签名说明(可选)
如果构建过程中自动签名失败,或需要在CodeArts IDE中手动签名,可以使用以下命令:
# 手动签名二进制文件(自签名)
binary-sign-tool sign -inFile build/bin/nvim -outFile build/bin/nvim -selfSign 1
# 验证签名
binary-sign-tool verify -inFile build/bin/nvim
CodeArts IDE中手动签名步骤:
- 在CodeArts IDE中打开终端
- 导航到项目目录:
cd /path/to/neovim-harmonyos - 执行签名命令
- 签名后即可在本机执行已签名的二进制命令
注意事项:
- 自签名仅用于开发和测试环境
- 生产环境建议使用正式签名证书
- 签名失败可能导致"Operation not permitted"错误
运行说明
项目提供 run-nvim.sh 脚本自动配置环境变量:
推荐使用脚本运行:
# 使用脚本运行(推荐)- 已正确配置环境变量和终端兼容性
./run-nvim.sh
备用运行方式:
如果直接运行遇到终端控制问题(如光标无法控制),建议使用以下方式:
# 使用sh方式运行(解决zsh终端检测问题)
sh -c './build/bin/nvim'
# 或手动设置环境变量后使用sh方式
export VIMRUNTIME=$(pwd)/runtime
export LUA_PATH="$(pwd)/runtime/lua/?.lua;$(pwd)/runtime/lua/?/init.lua;;"
export LUA_CPATH=";;"
sh -c './build/bin/nvim'
终端兼容性说明:
- 在HarmonyOS上,zsh的终端检测可能与Neovim不完全兼容
- 使用
sh方式可以避免终端检测问题 run-nvim.sh脚本已处理这些兼容性问题
构建产物:
build/bin/nvim- HarmonyOS 版本的 Neovim 二进制文件harmonyos-deps/build/- 所有依赖库和头文件logs/- 构建日志文件run-nvim.sh- 运行脚本(已包含环境配置)
更多推荐



所有评论(0)