现在的使用效果如下

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.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 等基础工具

构建过程说明

  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开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐