
高级玩法为ad编辑器编写自定义plumbing rules规则【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad想不想让你的 ad 编辑器an adaptable text editor学会看懂文本自定义 plumbing rules 规则就是答案ad 编辑器借鉴了 Plan 9 acme 的 plumber 机制通过一套纯文本规则就能让编辑器自动识别网址、图片、代码文件甚至 git 提交并调用对应程序打开。本文将从零开始手把手教你编写属于自己的 plumbing rules 规则让你彻底告别手动打开文件的繁琐操作。什么是plumbing rules一文看懂ad编辑器的智能加载机制在介绍怎么编写plumbing rules 规则之前先聊聊它解决了什么问题。在 ad 编辑器中加载Load是一项非常核心的交互把光标放在一段文本上按回车或者用鼠标右键点击文本编辑器就会尝试读懂这段文本的含义。文本是一个网址→ 用浏览器打开文本是一个图片路径→ 用图片查看器打开文本是文件:行号:列号→ 跳转到编辑器对应位置这一系列智能判断全部由plumbing rules 规则驱动。它本质上是规则 动作的匹配引擎规则描述什么样的文本该被处理动作描述处理方式。规则按顺序从上到下匹配第一条命中的规则生效如果没有任何规则命中就按默认方式加载文本。完整的解析逻辑实现可以参考 src/plumb.rs。plumbing rules规则文件在哪里默认规则与自定义规则ad 编辑器出厂自带一套默认的plumbing rules 规则存放在仓库的 data/plumbing.rules 中内容包括网址跳转浏览器、图片交给查看器、PDF 打开、man 手册查询等常用规则。而你自己编写的自定义规则存放在~/.ad/plumbing.rulesad 启动时会自动加载这个文件加载逻辑见 src/plumb.rs 中的try_load如果文件不存在也没有关系编辑器会安静地使用默认规则。想参考官方规则文件的写法克隆仓库即可git clone https://gitcode.com/gh_mirrors/ad5/ad克隆后打开data/plumbing.rules这就是最好的学习模板。另外data/syntax/plumbing-rules.toml 提供了规则文件的语法高亮配合 ad 的 tree-sitter 能力编辑规则时一目了然。如何编写自定义plumbing rules规则语法速查表一份plumbing rules 规则文件由若干规则块组成块与块之间用空行分隔以#开头的行是注释。每条规则块由**匹配模式patterns和动作actions**两部分构成规则中不允许只有模式而没有动作反之亦然。匹配模式Patterns定义什么文本会被处理语法作用示例data matches 正则用正则匹配消息文本捕获组存入$1~$9data matches (.):([0-9]):([0-9])data from 命令把文本交给 shell 命令用命令输出替换文本data from git -C $wdir show $0data narrows 正则把文本收缩到包含光标的匹配片段data narrows [0-9]arg isfile 路径判断路径是否为文件是则存入$filearg isfile $0arg isdir 路径判断路径是否为目录是则存入$dirarg isdir $1attr add kv ...给消息附加属性attr add actionshowdataattr delete 键删除已有属性attr delete actionsrc/dst/wdir is 值判断消息来源/目标/工作目录是否等于指定值dst is editdata set 值重写消息文本data set $1:$2动作Actions定义如何处理匹配到的文本语法作用示例plumb to edit把消息交给 ad 编辑器加载plumb to editplumb start 命令启动外部程序命令中的变量会先替换plumb start xdg-open $0规则中的内置变量规则中可以引用这些变量$0正则整体匹配、$1~$9正则捕获组、$src、$dst、$wdir工作目录、$data消息文本以及由arg isfile/arg isdir设置的$file、$dir。你甚至可以在文件开头自定义变量例如默认规则里的addrelem ...、addr ...规则块中会自动展开。从零开始写第一条plumbing rules规则光看语法还不够我们直接上手写一条自定义plumbing rules 规则。假设你经常在文本中看到commit-abc123这样的 git 提交记录希望 ad 能直接帮你查看提交内容那么只需在~/.ad/plumbing.rules中追加data matches commit-([a-f0-9]{7,40}) data from git -C $wdir show $1 attr add actionshowdata filename/git/$1 plumb to edit保存后重启 ad把光标放在任何形如commit-abc123的文本上按回车编辑器就会自动执行git show把提交内容显示在新缓冲区里——这正是 Plan 9 acme 精神在 ad 中的完美延续。上述规则块中前三条是匹配模式识别提交、拉取内容、附加属性最后一条是动作交给编辑区展示。如果你希望匹配到文本时直接调用外部程序而非在编辑器内展示可以把动作换成plumb start比如用浏览器打开匹配到的网址data matches https?://[a-zA-Z0-9./\-_] plumb start xdg-open $0实战案例用自定义plumbing rules规则提升效率掌握了基本语法我们再来看几个提升效率的plumbing rules 规则案例它们都源自默认规则文件的经典写法。案例一快速跳转到文件:行号:列号当你在日志或编译错误中看到src/main.rs:42:17这样的文本时下面这条规则会自动定位到对应文件的那一行那一列data matches (.):([0-9]):([0-9]):? arg isfile $1 data set $file attr add addr$2:$3 plumb to edit注意这里的巧妙之处先用arg isfile确认路径真实存在再用data set把文本重写为文件路径最后通过addr属性告诉编辑器跳到指定行列。这就是plumbing rules 规则支持文本重写的威力。案例二查看图片和 PDF想一键预览图片默认规则里已经写好了data matches ([a-zA-Z¡-0-9_\-./])\.(jpe?g|JPE?G|gif|GIF|tiff?|TIFF?|ppm|bit|png|PNG) arg isfile $0 plumb to edit plumb start xdg-open $0这段规则先确认文本是存在的图片文件然后在 ad 内展示的同时调用xdg-open用系统默认看图工具打开。PDF 的规则大同小异只是匹配\.pdf并调用zathura。案例三在编辑器内查询 man 手册在代码里看到read(2)这样的函数引用这条规则会调用man命令并把手册内容加载到编辑器中data matches ([a-zA-Z¡-0-9_\-./])\(([1-8])\) data from man $2 $1 attr add actionshowdata filename/man/$1($2) plumb to editdata from在这里派上了大用场——它让规则的匹配对象从静态文本变成了动态内容相当于给编辑器加了一个内置的命令执行器。调试plumbing rules规则的小技巧写完自定义plumbing rules 规则后如何验证它是否生效确认加载路径自定义规则文件必须放在~/.ad/plumbing.rules如果该路径下还有其他配置注意 ad 会读取这个文件的全部内容。用 plumb 命令测试ad 内置了plumb命令见 src/editor/built_in_commands.rs可以在命令面板中执行plumb 文本把任意文本当作被加载的消息跑一遍规则用来测试非常方便。留意匹配顺序规则按文件中的顺序自上而下匹配第一条命中的生效。如果你的规则被更早的规则截胡试着把新规则往前放。善用测试用例仓库的 data/plumbing_tests/rules 目录里有大量合法的、非法的规则示例遇到规则报错时对照检查一下能快速定位语法问题。总结自定义 plumbing rules 规则是 ad 编辑器最值得玩味的高级特性之一它把识别文本 决定行为的主动权完全交还给了用户让你可以按自己的习惯定义编辑器的行为。从网址跳转到 git 提交查看从文件定位到 man 查询只需要一个纯文本规则文件就能实现。官方文档 docs/tour/loading 还介绍了文本加载的两种触发方式配合 docs/9p.md 阅读你能更深入地理解这套设计背后的哲学。现在就动手为你的 ad 编辑器写第一条 plumbing rules 规则吧【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考