ad编辑器入门:如何像老手一样玩转文本选择与dot选区机制
【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad
ad 编辑器(an adaptable text editor)是一款用 Rust 编写的模态文本编辑器,融合了 vim 的模式编辑、kakoune 的选区操作与 Plan9 系 sam/acme 的dot 选区机制。本文将从零开始,带你理解 ad 编辑器中"一切编辑操作都以 dot 为核心"的设计哲学,并快速掌握文本选择与选区操纵的核心技巧,让你像老手一样高效编辑。无论你是 vim 用户还是初次接触模态编辑器的新手,这篇文章都能帮你快速上手 ad 编辑器的文本选择机制。
什么是 dot 选区机制:ad 编辑器的核心概念
在 ad 编辑器中,每个缓冲区(Buffer)都维护着一个dot,它表示"当前选中的文本"。dot 的概念来自 Rob Pike 的 sam 编辑器:在编辑语言中,dot 用.表示,绝大多数编辑命令都是通过"设置 dot、扩展 dot、操纵 dot"来完成的。
从源码上看,dot 只分为两种形态(见 src/dot/mod.rs):
- Cur(光标):只指向单个字符位置,相当于 vim 里的普通光标;
- Range(范围):由两个光标(start 与 end)围成的闭区间,即真正的选区。
dot 还有一个重要的属性:活跃光标(active cursor)。扩展选区时,操作只作用在活跃端,另一端保持不动,这正是 kakoune 风格选区操作的基础。理解这一点,你就掌握了 ad 文本选择的底层逻辑。
快速上手:设置 dot 的基础移动快捷键
在 NORMAL 模式下,移动光标本质上就是"重新设置 dot"。这些操作集中在 src/mode/normal.rs 的键位表中,vim 用户会感到非常熟悉:
| 快捷键 | 作用 |
|---|---|
hjkl | 左 / 下 / 上 / 右移动一个字符 |
w/b | 移动到下一个 / 上一个单词 |
x/X | 选中当前整行 / 整段 |
% | 选中整个缓冲区 |
gg/ge | 跳到缓冲区开头 / 结尾 |
Ctrl-h/Ctrl-l | 跳到行首 / 行尾 |
{/} | 移动到段落开头 / 结尾 |
注意w和b的实现很巧妙:它们先扩展选区再折叠成光标(DotExtendForward+DotCollapseLast),这正是"以选区方式思考移动"的体现。
像老手一样扩展选区:从光标到选区
设置好起始位置后,下一步就是扩展 dot,把单个光标拉成真正的选区。ad 用大写字母和 Alt 组合键来区分"移动"与"扩展":
| 快捷键 | 作用 |
|---|---|
H/L | 向左 / 右扩展一个字符 |
J/K | 向下 / 上扩展一行 |
W/B | 向前 / 后扩展一个单词 |
Alt-h/Alt-l | 扩展到行首 / 行尾 |
Alt-j/Alt-k | 向下 / 上扩展一行 |
Alt-{/Alt-} | 扩展到段落开头 / 结尾 |
这套设计(大写扩展、小写移动)比 vim 的v+ 移动组合更直接:先移动定位,再扩展选择,逻辑非常清晰。
文本对象选择:一条命令选中括号、引号内容
ad 同样支持 vim 风格的文本对象(TextObject),实现位于 src/dot/text_object.rs。最常用的是通过Alt-i加配对符号,一键选中成对定界符内部的内容:
Alt-i (/Alt-i ):选中括号()内部Alt-i [/Alt-i ]:选中方括号[]内部Alt-i {/Alt-i }:选中花括号{}内部Alt-i "/Alt-i ':选中引号内部Alt-i /:选中斜杠//定界符内部
例如光标停留在某个函数调用处,按Alt-i (,ad 会自动寻找最近的括号对并选中其中全部内容,随后可直接删除、复制或修改,无需手动数括号层级。
操纵 dot 的三大王牌操作
选区建立后,ad 提供三个高频"选区操纵"动作,配合;键附近的键位非常好记:
;翻转活跃光标:让扩展方向从选区尾部切到头部,反向继续扩展;,折叠选区到起点:把选区收成起点处的单个光标;Alt-,折叠选区到终点:收成终点处的光标。
配合*展开 dot和@执行 dot(把选中文本当作命令执行,源自 acme 的经典玩法),选区就不再只是"要编辑的文本",而成了可以操作的对象。
选区编辑:delete、yank、paste 一条龙
选好文本之后,ad 对选区的基本操作与 vim 一致:
| 快捷键 | 作用 |
|---|---|
d | 删除当前选区 |
c | 删除选区并进入 INSERT 模式 |
y | 复制(yank)选区 |
p | 粘贴 |
u/U | 撤销 / 重做 |
这里体现了 dot 机制的精髓:任何时刻你看到的反色高亮区域,就是下一个编辑命令的作用目标,所见即所选,所选即所改。
地址语法:用命令精确控制 dot 选区
如果你想更"程序员"地操控 dot,ad 继承了 sam/acme 的地址语法(见 docs/address-syntax.md 与 src/exec/addr.rs),可以在命令行中直接用表达式定位选区:
| 地址 | 含义 |
|---|---|
. | 当前 dot |
0/$ | 缓冲区开头 / 结尾 |
5 | 第 5 行 |
+3/-2 | 向后 / 向前移动若干行 |
#10 | 第 10 个字符 |
+/foo/ | 向前搜索正则foo |
-/foo/ | 向后搜索正则foo |
后缀+(行尾)、-(行首)、-+或+-(整行)可以对地址做二次精修,例如5-+表示"选中第 5 行整行"。
复合地址:一次选中大范围文本
更强大的能力来自复合地址——用逗号把两个简单地址连起来,就能框选任意区域:
5,:从第 5 行到文件末尾;,10:从文件开头到第 10 行;5,20:从第 5 行到第 20 行;/fn main/,/^}/:从fn main到第一个^},一键选中整个函数体。
在 COMMAND 模式(按:进入)中直接输入这些地址即可改变当前 dot,之后d、y、c等操作会立刻作用于新选区,适合做跨行、跨段的批量编辑。
上手练习:三个小场景快速建立肌肉记忆
- 选中并删除一个单词:光标移到词首 →
W扩展一个词 →d删除; - 重构括号内参数:
Alt-i (选中参数 →c修改 →Esc回到 NORMAL; - 整体框选一个函数:
:+/fn/,/^}/设置选区 →y复制到别处粘贴。
结语
ad 编辑器的 dot 选区机制,把"光标、选区、编辑命令"统一成了同一个抽象,配合 vim 风格的移动、kakoune 式的扩展和 sam 风格的地址语法,构成了一个既熟悉又新鲜的高效编辑体验。建议你从移动和扩展快捷键开始,逐步尝试文本对象与地址命令,很快就能体会到"选区即对象"的流畅感。想深入了解,可以阅读项目内的 docs/tour 文档和内置的:help,祝你在 ad 编辑器里玩得开心!
【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考