本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Vim 9.1.1436 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。
📖 Vim 简介
Vim(Vi IMproved)是一个高度可配置的文本编辑器,是 Unix 系统上经典编辑器 vi 的增强版本。Vim 以其强大的功能、高效的编辑模式和广泛的定制能力而闻名,是程序员和系统管理员的首选编辑器之一。
🎯 Vim 的作用与重要性
Vim 是一个功能强大的文本编辑器,提供了:
- 模式编辑:普通模式、插入模式、可视模式、命令模式等多种编辑模式
- 高效编辑:强大的文本操作和导航功能,提高编辑效率
- 可扩展性:丰富的插件系统和脚本支持(Vimscript、Lua、Python 等)
- 跨平台:支持多种操作系统和终端环境
- 轻量级:资源占用少,适合在资源受限的环境中运行
🔧 Vim 核心特性
1. 编辑模式
- 普通模式(Normal Mode):默认模式,用于导航和文本操作
- 插入模式(Insert Mode):用于输入文本
- 可视模式(Visual Mode):用于选择文本
- 命令模式(Command Mode):用于执行命令和搜索
2. 命令与工具
vim- 主编辑器程序ex- 行编辑器(vim 的前身)view- 只读模式启动 vimrvim- 受限模式启动 vim(不能执行 shell 命令)rview- 受限只读模式启动 vimvimdiff- 文件差异比较工具vimtutor- Vim 交互式教程
3. 主要功能
- 语法高亮:支持多种编程语言的语法高亮
- 代码折叠:支持代码块的折叠和展开
- 多文件编辑:支持标签页、窗口分割等功能
- 宏录制:可以录制和回放编辑操作
- 搜索替换:强大的正则表达式搜索和替换功能
🚀 构建入口与环境
- 📝 执行命令 :
OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh - 🔧 入口脚本 :
create-hnp.sh- 检查必需的环境变量
OHOS_ARCH和OHOS_ABI - 导出
LC_CTYPE、TOOL_HOME、OHOS_SDK_HOME - 执行
make -C build-hnp
- 检查必需的环境变量
- 📦 顶层构建 :
build-hnp/MakefilePKGS变量定义需要构建的包列表(包含vim)- 通过
check-pkgs机制自动检测PKGS变化并触发重新构建 - 自动合并
external-hnp目录下的外部 HNP 包 base.hnp依赖所有包的.stamp和外部 HNP 包- 总目标
all: copy,打包base.hnp并拷贝到entry/hnp/$(OHOS_ABI)
⚙️ Vim 包的构建配置
- 📁 包目录 :
build-hnp/vim/Makefile- 继承通用规则:
include ../utils/Makefrag - 源地址:
SOURCE_URL = https://github.com/vim/vim/archive/refs/tags/v9.1.1436.tar.gz - 版本:
v9.1.1436
- 继承通用规则:
- 🔧 补丁应用 :
0001-fix-tcsetattr.diff- 修复终端属性设置相关问题0002-fix-viminfo-gid-check.diff- 修复 viminfo 的 GID 检查
- ⚙️ 配置参数 :
--prefix=$(PREFIX)安装前缀(默认PREFIX=/data/app/base.org/base_1.0)vim_cv_uname_output=Linux设置 uname 输出为 Linux--host aarch64-unknown-linux-musl交叉编译目标--with-tlib=tinfow使用 ncurses 的 tinfow 库(宽字符版本)
- 🔨 构建流程 :
- 下载源码包
- 解包并应用补丁
- 配置交叉编译环境
- 编译并安装
- 使用
llvm-strip剥离符号 - 复制到
../sysroot
- 🔧 通用工具链与路径 :
build-hnp/utils/MakefragCC/CXX/LD/AR/RANLIB/...均指向 OHOS SDK 的 LLVM 工具链- 通过
PKG_CONFIG_LIBDIR指向sysroot下.pc目录,确保依赖发现 - 下载支持多镜像回退:
wget→curl,主镜像失败时自动尝试备用镜像
📋 关键日志与过程节点
- 📥 下载与解包 :
- 从 GitHub Releases 下载
v9.1.1436.tar.gz - 完成解包并进入
temp/vim-9.1.1436目录 - 下载规则支持多镜像回退:
wget→curl,自动尝试备用镜像
- 从 GitHub Releases 下载
- 🔧 补丁应用 :
- 应用
0001-fix-tcsetattr.diff修复终端属性设置问题 - 应用
0002-fix-viminfo-gid-check.diff修复 viminfo GID 检查问题
- 应用
- ⚙️ 配置阶段 :
- 使用
aarch64-unknown-linux-ohos-clang作为交叉编译器 - 配置使用
tinfow库(ncurses 宽字符版本) - 设置
vim_cv_uname_output=Linux确保正确的系统检测
- 使用
- 🔨 编译与安装 :
- 编译生成
vim二进制文件 - 创建软链接:
ex、view、rview、rvim、vimdiff - 安装运行时文件到
share/vim/vim91 - 使用
llvm-strip剥离符号,减小文件大小
- 编译生成
- 📦 打包 :
- 合并外部 HNP 包(如果存在)
- 顶层执行
zip -r base.hnp sysroot并拷贝到entry/hnp/arm64-v8a/ - 所有 vim 工具和运行时文件已成功打包到
base.hnp
✅ 产物验证
📦 检查打包文件
bash
ls build-hnp/base.hnp # 应存在
ls entry/hnp/arm64-v8a/*.hnp # 应包含 base.hnp 与 base-public.hnp
🔍 检查二进制文件
bash
# 检查 vim 主程序
ls -lh build-hnp/sysroot/bin/vim
file build-hnp/sysroot/bin/vim
# 检查所有 vim 相关命令
ls -lh build-hnp/sysroot/bin/vim* build-hnp/sysroot/bin/ex build-hnp/sysroot/bin/view build-hnp/sysroot/bin/rview build-hnp/sysroot/bin/rvim build-hnp/sysroot/bin/vimdiff
# 验证软链接
test -L build-hnp/sysroot/bin/ex && echo "ex: OK" || echo "ex: MISSING"
test -L build-hnp/sysroot/bin/view && echo "view: OK" || echo "view: MISSING"
test -L build-hnp/sysroot/bin/rview && echo "rview: OK" || echo "rview: MISSING"
test -L build-hnp/sysroot/bin/rvim && echo "rvim: OK" || echo "rvim: MISSING"
test -L build-hnp/sysroot/bin/vimdiff && echo "vimdiff: OK" || echo "vimdiff: MISSING"

✅ 构建验证结果:
- ✅ vim 主程序已成功安装:
vim(3.3M) - ✅ 所有软链接已正确创建:
ex -> vim、view -> vim、rview -> vim、rvim -> vim、vimdiff -> vim - ✅ vimtutor 教程已安装:
vimtutor(4.8K)
📚 检查运行时文件
bash
# 检查 vim 运行时目录
ls -lh build-hnp/sysroot/share/vim/
# 检查 vim 版本目录
ls -lh build-hnp/sysroot/share/vim/vim91/ | head -20
# 检查语法文件
find build-hnp/sysroot/share/vim -name "*.vim" | head -10

✅ 构建验证结果:
- ✅ Vim 运行时文件已安装到
share/vim/vim91/ - ✅ 包含语法高亮、插件、帮助等文件
💻 终端中执行的示例命令
🔧 Vim 基本使用

1. 启动 Vim
bash
# 启动 vim 编辑文件
vim filename.txt
# 只读模式打开文件
view filename.txt
# 受限模式(不能执行 shell 命令)
rvim filename.txt
# 受限只读模式
rview filename.txt
# 启动 vim 教程
vimtutor

2. Vim 基本操作
进入插入模式:
i- 在光标前插入a- 在光标后插入o- 在当前行下方插入新行O- 在当前行上方插入新行
保存和退出:
:w- 保存文件:q- 退出(如果文件未修改):wq或:x- 保存并退出:q!- 强制退出,不保存ZZ- 保存并退出(普通模式)
移动光标:
hjkl- 左、下、上、右w- 移动到下一个单词开头b- 移动到上一个单词开头0- 移动到行首$- 移动到行尾gg- 移动到文件开头G- 移动到文件末尾:n- 跳转到第 n 行
删除文本:
x- 删除光标下的字符dd- 删除当前行dw- 删除到单词末尾d$- 删除到行尾d0- 删除到行首
复制和粘贴:
yy- 复制当前行yw- 复制到单词末尾p- 在光标后粘贴P- 在光标前粘贴
撤销和重做:
u- 撤销上一次操作Ctrl+r- 重做
3. 搜索和替换
bash
# 在 vim 中搜索
/pattern # 向前搜索
?pattern # 向后搜索
n # 查找下一个
N # 查找上一个
# 替换
:s/old/new/ # 替换当前行第一个匹配
:s/old/new/g # 替换当前行所有匹配
:%s/old/new/g # 替换整个文件所有匹配
:%s/old/new/gc # 替换整个文件,每次询问确认
4. 文件操作
bash
# 在 vim 中打开多个文件
vim file1.txt file2.txt
# 切换文件
:n # 下一个文件
:N # 上一个文件
:files # 列出所有打开的文件
# 分割窗口
:sp filename # 水平分割
:vsp filename # 垂直分割
Ctrl+w w # 切换窗口
Ctrl+w q # 关闭当前窗口
# 标签页
:tabnew file # 新建标签页
:tabnext # 下一个标签页
:tabprev # 上一个标签页
gt # 切换到下一个标签页
gT # 切换到上一个标签页
5. 使用 vimdiff 比较文件
bash
# 比较两个文件
vimdiff file1.txt file2.txt
# 或使用 vim 的 diff 模式
vim -d file1.txt file2.txt
# vimdiff 中的操作
]c # 跳转到下一个差异
[c # 跳转到上一个差异
do # 将另一个文件的更改应用到当前文件
dp # 将当前文件的更改应用到另一个文件
6. Vim 配置示例
创建 ~/.vimrc 配置文件:
vim
" 基本设置
set number " 显示行号
set relativenumber " 显示相对行号
set tabstop=4 " Tab 键宽度
set shiftwidth=4 " 自动缩进宽度
set expandtab " 使用空格代替 Tab
set autoindent " 自动缩进
set smartindent " 智能缩进
" 搜索设置
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
set ignorecase " 忽略大小写
set smartcase " 智能大小写
" 显示设置
set showcmd " 显示命令
set showmatch " 显示匹配的括号
set cursorline " 高亮当前行
syntax on " 语法高亮
" 文件设置
set encoding=utf-8 " 文件编码
set fileencoding=utf-8
set fileformat=unix " 文件格式
" 快捷键映射
map <F2> :w<CR> " F2 保存文件
map <F3> :q<CR> " F3 退出
7. 常用 Vim 命令组合
bash
# 删除多行
:5,10d # 删除第 5 到 10 行
# 复制多行
:5,10y # 复制第 5 到 10 行
# 移动多行
:5,10m15 # 将第 5 到 10 行移动到第 15 行后
# 缩进
:5,10> # 第 5 到 10 行向右缩进
:5,10< # 第 5 到 10 行向左缩进
# 执行外部命令
:!ls # 执行 ls 命令
:r !date # 插入当前日期
8. Vim 高级功能
bash
# 宏录制
qa # 开始录制宏到寄存器 a
... # 执行操作
q # 停止录制
@a # 执行宏 a
@@ # 重复执行上一个宏
# 可视模式
v # 字符可视模式
V # 行可视模式
Ctrl+v # 块可视模式
# 标记
ma # 设置标记 a
'a # 跳转到标记 a
:marks # 列出所有标记
🧪 功能验证脚本
bash
#!/bin/bash
# vim 工具验证脚本
VIM_BIN="build-hnp/sysroot/bin"
TOOLS=("vim" "ex" "view" "rview" "rvim" "vimdiff" "vimtutor")
echo "=== Vim 工具验证 ==="
for tool in "${TOOLS[@]}"; do
if [ -f "$VIM_BIN/$tool" ] || [ -L "$VIM_BIN/$tool" ]; then
echo "✓ $tool: 存在"
if [ -L "$VIM_BIN/$tool" ]; then
echo " 类型: 符号链接 -> $(readlink "$VIM_BIN/$tool")"
else
echo " 类型: 二进制文件"
file "$VIM_BIN/$tool" | head -1
fi
else
echo "✗ $tool: 缺失"
fi
done
echo ""
echo "=== 文件统计 ==="
echo "vim 主程序大小: $(ls -lh "$VIM_BIN/vim" | awk '{print $5}')"
echo "运行时文件目录: $(ls -d build-hnp/sysroot/share/vim/vim* 2>/dev/null | wc -l)"
🐛 常见问题与解决方案
❌ Unsupported OHOS_ARCH 错误
- 🔍 症状 :构建时出现
Unsupported OHOS_ARCH=错误 - 🔎 原因:传入的架构不在支持列表中
- ✅ 解决方案 :
- 确保使用支持的架构:
aarch64或x86_64 - 检查
build-hnp/Makefile中的架构定义
- 确保使用支持的架构:
❌ 终端行为异常
- 🔍 症状:vim 在终端中显示异常或功能不正常
- 🔎 原因 :
- 补丁未正确应用
- 终端
TERM环境变量设置不正确 - ncurses
tinfow库不兼容
- ✅ 解决方案 :
- 确保补丁正常应用(检查
build-hnp/vim/Makefile:7-8) - 设置正确的
TERM环境变量:export TERM=xterm-256color - 检查 ncurses 是否正确安装
- 确保补丁正常应用(检查
❌ 链接错误
- 🔍 症状:编译时出现链接错误
- 🔎 原因 :
--host参数与工具链不匹配tinfow库未正确链接
- ✅ 解决方案 :
- 核对
--host $(OHOS_ARCH)-unknown-linux-musl与工具链匹配 - 如果失败,可临时移除
--with-tlib=tinfow验证,然后再恢复 - 确保 ncurses 已正确构建并安装
- 核对
❌ 网络下载失败
- 🔍 症状 :下载
v9.1.1436.tar.gz失败 - 🔎 原因:GitHub 网络不可达或 DNS 解析失败
- ✅ 解决方案 :
- 手动下载源码包并放置到
build-hnp/vim/download/v9.1.1436.tar.gz - 使用代理或镜像站点
- 构建系统会自动尝试备用下载方法
- 手动下载源码包并放置到
🔄 重建与扩展
-
🔧 重建单包:
bashmake -C build-hnp rebuild-vim # 触发子包重新编译并刷新 .stamp -
🧹 清理:
bashmake -C build-hnp clean # 清理 sysroot、所有 .stamp 和 PKGS_MARKER -
📦 扩展:Vim 是文本编辑的基础工具,许多开发工作流都依赖它
-
🔄 自动重建机制:
- 修改
PKGS后,check-pkgs会自动检测变化并触发重新构建 - 新增外部 HNP 包到
external-hnp目录后,会自动合并到base.hnp
- 修改
💡 实践建议
- 🔧 补丁管理:确保补丁文件正确应用,特别是终端相关的补丁
- 🛡️ 依赖关系:Vim 依赖 ncurses(tinfow),确保先构建 ncurses
- 📦 配置优化:根据实际需求调整编译选项,减少不必要的功能以减小体积
- 🔗 运行时文件:确保 vim 运行时文件正确安装,包括语法高亮、插件等
📝 结论与建议
- ✅ 本次已在 aarch64 环境下完成 Vim 9.1.1436 的交叉编译与打包,所有工具和运行时文件已安装到
sysroot并纳入 HNP 包。 - 💡 为保证构建稳定 :
- 固定可靠的上游镜像,避免下载阶段随机失败(已实现自动回退机制)
- 对大型包启用构建缓存(可在
Makefrag中开启USE_CCACHE) - 补丁与交叉参数设置到位,确保终端功能正常
- 通过
tinfow库支持,vim 可以充分利用 ncurses 的宽字符和终端能力 - 利用
check-pkgs机制自动检测包列表变化,无需手动清理
📚 以上为 Vim 构建的深度解读与实践记录。