通过开源鸿蒙终端工具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 构建的深度解读与实践记录。

相关推荐
Hi_kenyon3 小时前
使用vim来完全控制你的VSCode(一)
vscode·编辑器·vim
坚果派·白晓明6 小时前
通过开源鸿蒙终端工具Termony完成Coremark 命令行工具构建过程深度解读
openharmony·命令行工具·开源鸿蒙·开源软件termony
坚果派·白晓明6 小时前
通过开源鸿蒙终端工具Termony完成Ncurses 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
A懿轩A16 小时前
【2025版 OpenHarmony】GitCode 口袋工具 v1.0.1 更新发布:Flutter + HarmonyOS 封装导航栏进行跳转
flutter·harmonyos·openharmony·gitcode·开源鸿蒙
q***062919 小时前
Node.js使用教程
node.js·编辑器·vim
A懿轩A1 天前
【2025最新】Flutter 编译开发 鸿蒙HarmonyOS 6 项目教程(Windows)
windows·flutter·华为·openharmony·开源鸿蒙
坚果派·白晓明2 天前
通过开源鸿蒙终端工具Termony完成Bash命令行工具构建过程深度解读
openharmony·命令行工具·开源鸿蒙
深兰科技2 天前
智融无界·浦绘未来|深兰科技受邀出席“2025浦东新区产业智能化创新发展年度活动”,陈海波发表主旨演讲
人工智能·jupyter·vim·intellij-idea·postman·visual studio·深兰科技
A懿轩A3 天前
【OpenHarmony】跨平台开发鸿蒙Harmony项目框架选择建议
华为·鸿蒙·openharmony·开源鸿蒙