通过开源鸿蒙终端工具Termony完成Vim命令行工具构建过程深度解读

本文记录使用命令 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 - 只读模式启动 vim
  • rvim - 受限模式启动 vim(不能执行 shell 命令)
  • rview - 受限只读模式启动 vim
  • vimdiff - 文件差异比较工具
  • vimtutor - Vim 交互式教程
3. 主要功能
  • 语法高亮:支持多种编程语言的语法高亮
  • 代码折叠:支持代码块的折叠和展开
  • 多文件编辑:支持标签页、窗口分割等功能
  • 宏录制:可以录制和回放编辑操作
  • 搜索替换:强大的正则表达式搜索和替换功能

🚀 构建入口与环境

  • 📝 执行命令OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh
  • 🔧 入口脚本create-hnp.sh
    • 检查必需的环境变量 OHOS_ARCHOHOS_ABI
    • 导出 LC_CTYPETOOL_HOMEOHOS_SDK_HOME
    • 执行 make -C build-hnp
  • 📦 顶层构建build-hnp/Makefile
    • PKGS 变量定义需要构建的包列表(包含 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 库(宽字符版本)
  • 🔨 构建流程
    1. 下载源码包
    2. 解包并应用补丁
    3. 配置交叉编译环境
    4. 编译并安装
    5. 使用 llvm-strip 剥离符号
    6. 复制到 ../sysroot
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 通过 PKG_CONFIG_LIBDIR 指向 sysroot.pc 目录,确保依赖发现
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 GitHub Releases 下载 v9.1.1436.tar.gz
    • 完成解包并进入 temp/vim-9.1.1436 目录
    • 下载规则支持多镜像回退:wgetcurl,自动尝试备用镜像
  • 🔧 补丁应用
    • 应用 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 二进制文件
    • 创建软链接:exviewrviewrvimvimdiff
    • 安装运行时文件到 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 -> vimview -> vimrview -> vimrvim -> vimvimdiff -> 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 - 保存并退出(普通模式)

移动光标

  • h j k l - 左、下、上、右
  • 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= 错误
  • 🔎 原因:传入的架构不在支持列表中
  • ✅ 解决方案
    • 确保使用支持的架构:aarch64x86_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
    • 使用代理或镜像站点
    • 构建系统会自动尝试备用下载方法

🔄 重建与扩展

  • 🔧 重建单包

    bash 复制代码
    make -C build-hnp rebuild-vim  # 触发子包重新编译并刷新 .stamp
  • 🧹 清理

    bash 复制代码
    make -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 构建的深度解读与实践记录。

相关推荐
claider1 天前
Vim User Manual 阅读笔记 User_03.txt move around
笔记·编辑器·vim
火山引擎开发者社区2 天前
当 veDB 遇上 AI:云原生数据库的智能诊断创新,覆盖重保/应急全场景
vim
Eternity∞3 天前
基于Linux系统vim编译器情况下的C语言学习
linux·c语言·开发语言·学习·vim
LingRannn3 天前
【vim 中如何替换】
编辑器·vim·excel
坚果派·白晓明5 天前
面向新手的鸿蒙跨平台开发技术选型指南
开源鸿蒙·鸿蒙跨平台应用开发·鸿蒙跨平台应用
坚果派·白晓明5 天前
Windows 11 OpenHarmony版React Native开发环境搭建完整指南
react native·开源鸿蒙·rnoh
lixzest5 天前
Vim 快捷键速查表
linux·编辑器·vim
fakerth6 天前
【OpenHarmony】升级服务组件(UpdateService)
操作系统·openharmony
fakerth6 天前
【OpenHarmony】Updater 升级包安装组件
操作系统·openharmony
鸿蒙小白龙8 天前
OpenHarmony轻量系统智能模块开发实战指南
arm开发·openharmony·liteos