ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从任何语言控制ad编辑器:9p协议与ad.sh脚本库实战教程

从任何语言控制ad编辑器:9p协议与ad.sh脚本库实战教程 从任何语言控制ad编辑器9p协议与ad.sh脚本库实战教程【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad前言为什么你需要学会控制ad编辑器adan adaptable text editor是一款真正可适应的文本编辑器——它不仅是一个编辑器更是一台可以通过 9p 文件协议对外暴露完整接口的文件服务器。无论你是写 shell 脚本、Python、Rust 还是任何其他语言都可以像读写普通文件一样从外部程序读取缓冲区内容、移动光标、执行命令甚至监控编辑事件。本教程将带你掌握 9p 协议控制 ad 编辑器的最快路径并详解官方 ad.sh 脚本库中的核心函数。上图是 ad 编辑器实际运行界面左侧是键位映射配置缓冲区右侧是 Rust 源码缓冲区深色主题下语法高亮清晰。什么是ad编辑器的9p文件系统接口9p 是贝尔实验室 Plan 9 系统提出的网络文件协议它的核心思想是一切皆文件。ad 借鉴了 Plan 9 的 acme 编辑器设计通过 src/fsys/mod.rs 模块实现了一个 acme 风格的虚拟文件系统。编辑器运行时会在$HOME/.ad/mnt/下挂载一个 9p 文件系统源码中的 MOUNT_DIR 常量目录结构如下$HOME/.ad/mnt/ ctl # 控制文件向编辑器发送命令 minibuffer # 通过迷你缓冲区进行选择/输入 scratch # 读写 scratch 缓冲区 log # 只读事件日志 buffers/ current # 当前聚焦缓冲区 id index # 所有打开缓冲区的列表 [n]/ # 每个缓冲区的专属目录 filename # 缓冲区文件名 dot # 当前选中文本dot addr # dot 的地址 body # 缓冲区全文 event # 输入事件拦截文件这个设计让 ad 不再是一个黑盒应用而是变成了一台可编程的文本处理服务。最快上手用 ad -9p 命令行直接探索ad 自身内置了一个轻量级 9p 客户端见 src/client.rs使用-9p参数即可在终端里直接操作文件系统这是学习 9p 协议控制 ad 编辑器最快的入门方式。三条必学的探索命令# 列出挂载点根目录 ad -9p ls ad # 查看 1 号缓冲区的目录内容 ad -9p ls ad/buffers/1 # 读取 1 号缓冲区的 dot当前选中文本 ad -9p read ad/buffers/1/dot支持的子命令包括ls、lsl详细列表、read、write、new、mkdir、rm等完整定义见 src/client.rs。比如向 ctl 文件写入内容即可让编辑器执行命令# 让 ad 执行内部命令例如打开文件 echo open README.md | ad -9p write ad/ctl更彻底的方案挂载成普通目录如果你安装了fusermount和9pfuse只需在 data/config.toml 中将auto-mount设为truead 的文件系统就会被挂载成普通目录。之后你可以用任何语言、任何文件操作 API 直接读写 ad完全不用关心 9p 协议细节——这就是从任何语言控制 ad 编辑器的最通用方案。ad.sh官方脚本库快速配置方法项目自带的 data/lib/ad.sh 脚本库把常用的 9p 操作封装成了一个个小函数让你在 shell 脚本里几行代码就能控制 ad 编辑器。使用前只需在脚本开头 source 它#!/usr/bin/env bash source $HOME/.config/ad/ad.sh # 或者你项目中的 data/lib/ad.sh 路径提示ad.sh顶部会加载~/.profile并依赖环境变量AD_PID判断脚本是否由 ad 内部启动对应requireAd函数。核心函数速查表函数作用底层操作adCtl 命令向编辑器发送控制命令写入ad/ctladEdit 命令在当前缓冲区执行 Edit 脚本封装adCtl Edit ...adIndex读取所有打开的缓冲区列表读取ad/buffers/indexadError 信息在状态栏显示错误并退出封装echorequireAd非 ad 环境时安全退出检查AD_PIDcurrentBufferId获取当前聚焦缓冲区 id读取ad/buffers/currentfocusBuffer 3聚焦指定缓冲区写入ad/buffers/currentclearBuffer 3清空缓冲区内容写入xaddrxdotmarkClean 3将缓冲区标记为已保存发送mark-cleancurToBof/curToEof光标移到文件首/尾写入缓冲区addrbufRead 3 body读取缓冲区内容读取ad/buffers/3/bodybufWrite 3 body写入缓冲区内容写入ad/buffers/3/bodyminibufferPrompt弹迷你缓冲区提问读写ad/minibufferminibufferSelect迷你缓冲区下拉选择配合ctl提示文本adLog跟随读取事件日志流读取ad/log实战示例一读取并修改缓冲区source data/lib/ad.sh # 获取当前缓冲区 id BID$(currentBufferId) # 读取该缓冲区全文 bufRead $BID body # 在缓冲区开头插入一行 { echo // generated by ad.sh; cat /dev/stdin; } | bufWrite $BID body实战示例二迷你缓冲区交互选择迷你缓冲区相当于一个小的命令面板可以用它向用户提问source data/lib/ad.sh # 给用户展示三个选项返回用户选择的行内容 choice$(printf python\nrust\ngo | minibufferSelect 选择一种语言:) # 弹出普通输入框 name$(minibufferPrompt 你的名字是?) adEdit echo 你好, $name实战示例三从编辑器内部运行脚本把下面的脚本保存为hello.sh然后在 ad 内部通过,执行ad 的,命令会运行外部程序参见 docs/tour/executing#!/usr/bin/env bash source data/lib/ad.sh requireAd # 非 ad 环境直接报错退出 adCtl echo 正在准备编辑环境... BID$(currentBufferId) bufWrite $BID body # $(date): 脚本已接管本缓冲区 markClean $BID adCtl echo 完成无需 shell用 ad_client 在 Rust 中控制如果你在用 Rust 开发官方还提供了更高层的客户端 cratecrates/ad_client/。它基于 ninep crate 封装了缓冲区读写、事件过滤等能力。最简示例见 crates/ad_client/examples/demo.rsuse ad_client::sync::Client; fn main() - std::io::Result() { let client Client::new()?; client.echo(hello, world!)?; // 在 ad 中回显消息 client.open(README.md)?; // 打开文件 Ok(()) }它同时提供同步sync与异步tokio两种 API并内置了EventData等事件模型适合构建实时同步、自动化测试等复杂工具。进阶玩法订阅事件日志与拦截输入9p 接口不只是单向命令还能反向监听。通过adLog读取ad/log可以实时获得缓冲区打开、关闭、聚焦、保存等事件流日志行的解析规则见 crates/ad_client/src/lib.rs。每个缓冲区目录下的event文件甚至允许你拦截用户的输入事件实现自动补全、输入过滤等高级功能。常见问题排查连接失败提示找不到 socket确认 ad 已启动且 9p 服务正常检查$HOME/.ad/mnt是否存在。requireAd报错need to be run from inside of ad该脚本必须在 ad 编辑器内部执行按,不能在普通终端运行。想监听缓冲区变化优先使用adLog跟随日志而不是轮询body文件。结语通过 9p 文件协议ad 把编辑器的全部能力开放成了一个可编程的文件系统而 ad.sh 脚本库则把这套能力浓缩成了十几个易用的 shell 函数。从读取缓冲区、移动光标到迷你缓冲区交互、事件订阅你完全可以用自己最熟悉的语言驱动 ad 完成复杂的文本自动化任务。现在就 clone 项目源码打开 data/lib/ad.sh 和 docs/9p.md亲手写出你的第一个控制脚本吧【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表