让文本活起来:ad编辑器执行文本与外部命令集成的完整指南 让文本活起来ad编辑器执行文本与外部命令集成的完整指南【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad如果你已经厌倦了编辑器只能编辑文本的刻板印象那么 ad 编辑器an adaptable text editor绝对值得一试。这是一款用 Rust 编写的开源文本编辑器它把 vim 的模式编辑、kakoune 的文本导航与 Plan 9 Acme 的文本即程序哲学融合在一起——在 ad 编辑器中任何文本都可以被执行而不仅仅是被编辑。本指南将带你完整掌握 ad 编辑器执行文本与外部命令集成的全部方法从基础的执行操作到复杂的结构化替换一步步让编辑器真正活起来。ad 编辑器是什么文本即命令的哲学传统编辑器中文本只是静态的数据。而在 ad 编辑器中文字是可执行的你选中一段文字它既可以是一段 shell 命令也可以是一个编辑脚本甚至可以是调用外部程序的参数。这一设计理念来自 Plan 9 的 Acme 编辑器——把集成式开发环境变成正在集成的开发环境让外部工具随时可以参与编辑过程。ad 编辑器内置了精简版的 sam 编辑语言结构正则表达式核心实现位于src/exec/mod.rs所有命令的实际执行由src/exec/runner.rs中的SystemRunner完成。理解了文本可执行这个核心你就掌握了 ad 编辑器最强大的能力。快速上手两条路径执行任意文本在 ad 编辑器中执行文本非常简单有两种方式鼠标中键点击选中的文本立即执行把光标放在选区上按下键同样触发执行。执行的内容会被当作 shell 命令运行比如选中ls -la后按编辑器就会运行这条命令并把结果展示出来。这比切到终端、输入命令、再切回来要流畅得多。命令输出去哪里自动生成的输出缓冲区执行命令后输出并不会散落到各处而是进入一个自动生成的输出缓冲区默认命名为$dir/output$dir是当前工作目录。这意味着多条命令的输出可以累积查看输出缓冲区本身也是一个普通缓冲区可以继续编辑、再次执行你甚至可以对输出内容执行新的命令形成命令流水线。例如在文档 docs/tour/executing 中展示的示例执行ls ../../后目录列表会完整呈现在输出缓冲区中。在编辑器里运行外部命令的完整方法直接运行外部命令最简单的用法把命令当作文本执行。例如执行date会在输出缓冲区得到当前时间。这里的前缀表示读取命令输出是 ad 编辑器外部命令集成的核心操作之一。用 Edit 脚本串联编辑与执行ad 编辑器通过Edit命令提供 sam 风格的结构正则表达式编辑能力。例如执行Edit , s/mouse/clicky thing/g会把整个缓冲区中的mouse全部替换为clicky thing。而,表示整个文件s是替换动作。你可以在输出缓冲区中执行这样的 Edit 脚本也可以把它作为普通文本选中后执行。结构化替换让外部命令改写文本更高级的玩法来自文档 docs/demos/exec/run-external-commands 中的示例用一个 Edit 脚本找出 Markdown 文件中所有代码块并调用外部命令获取内容Edit , x/\n*?\n/ { n/file\n(.*)\n/ { p/\n:: FILE\n/; $head -n 5 {1}; }; n/url\n(.*)\n/ { p/\n:: URL\n/; $curl -s {1}; }; }这段脚本能扫描文档中的file和url代码块分别用head和curl读取文件头部与网页内容再通过p打印到输出缓冲区——一个纯文本驱动的文档生成器就诞生了。让外部命令与文本深度协作的四个动作在 Edit 脚本中有四个动作专门用于调用外部命令源码见src/exec/mod.rs的 gather_actions 部分动作含义示例$运行命令把输出写入输出缓冲区, x/foo/ $/cmd/把匹配文本作为输入喂给命令输出进缓冲区, x/foo/ /process/运行命令用其输出来替换匹配文本, x/foo/ /cmd/|把匹配文本通过管道传给命令结果替换原文, x/foo/ |/upper/其中和|是改写文本的利器比如, x/\b\w\b/ |/tr a-z A-Z/可以把所有单词转为大写,后跟x表示对每个匹配分别处理。文档 docs/demos/exec/edit-with-external-commands 展示了用head -n 5 {1}把 README 文件头部内容直接插入文档的完整例子。模板变量在命令中使用文件名与行列号外部命令不仅接收匹配文本还能通过模板变量感知上下文。Edit 脚本的模板中支持三个内置变量{FILENAME}当前缓冲区的文件名{ROW}匹配所在的行号{COL}匹配所在的列号此外{0}表示完整匹配{1}、{2}表示第 1、2 个捕获组。例如执行, x/(\w)/ /process {1}/时每个单词都会作为参数传给process命令。这意味着外部命令能够知道自己处理的是文件中的哪一行哪一列——为批量处理、代码分析类工具提供了极大便利。更进一步通过 9p 文件系统接口与 ad 集成除了在编辑器内部执行命令ad 编辑器还把整个编辑器状态暴露为一个 9p 虚拟文件系统fsys 模块。也就是说任何能读写文件的外部程序都能控制 ad 编辑器这与 Acme 的一切皆文件哲学一脉相承。官方提供了辅助脚本库data/lib/ad.sh包含adCtl写控制消息、adEdit执行 Edit 脚本、bufRead/bufWrite读写缓冲区内容等现成函数如果用 Rust 开发可以参考crates/ad_client客户端 crate只要能读写文件或用 fuse 挂载你就能把任意外部工具接入编辑器。例如用一行脚本向编辑器发送命令echo Edit , s/foo/bar/g | ad -9p write ad/ctl这为自动化编辑、CI 集成、自定义工具链打开了无限可能。如何安装 ad 编辑器ad 编辑器目前推荐从源码编译安装git clone https://gitcode.com/gh_mirrors/ad5/ad cd ad cargo install --path . cargo xtask setup-dotfiles安装完成后启动 ad 编辑器运行:help即可查看内置帮助。想了解更完整的特性导览可以阅读文档 docs/tour/index 中从 intro 到 helper-examples 的系列章节。写在最后ad 编辑器真正的魅力在于它打破了编辑器与终端的边界文本既是内容也是程序既是输入也是输出。无论是快速执行一条 shell 命令还是用结构正则表达式批量调用外部工具改写文档ad 编辑器都能让文本活起来。现在就把它克隆下来选中一段文字按下开启你的文本执行之旅吧【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考