现在的使用效果如下

img

img

演示视频:鸿蒙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 特定适配

  1. TTY 权限修复:修改 libuv 跳过文件描述符复制,避免 SELinux 权限问题
  2. MessagePack 兼容性:实现动态数据大小检测,解决 sizeof() 计算错误
  3. 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.gvim.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 等基础工具

构建过程说明

  1. 依赖构建 (harmonyos-deps/build-deps-harmonyos.sh)

    • 下载所有依赖源码
    • 应用 HarmonyOS 特定补丁
    • 编译为静态库(避免动态加载限制)
    • 安装到 harmonyos-deps/build/ 目录
  2. 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中手动签名步骤

  1. 在CodeArts IDE中打开终端
  2. 导航到项目目录:cd /path/to/neovim-harmonyos
  3. 执行签名命令
  4. 签名后即可在本机执行已签名的二进制命令

注意事项

  • 自签名仅用于开发和测试环境
  • 生产环境建议使用正式签名证书
  • 签名失败可能导致"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 - 运行脚本(已包含环境配置)

移植仓库地址: https://gitcode.com/ystyle/neovim-harmonyos

Logo

赋能鸿蒙PC开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐