面向 aspiring 高级用户的 Kakoune 详细介绍

Lobsters Hottest 工具

摘要

本文全面介绍了 Kakoune 这一模态文本编辑器,详细阐述了其设计理念、逆向语法,以及多光标选择和服务器-客户端架构等独特功能。

<p><a href="https://lobste.rs/s/gyiahc/detailed_introduction_kakoune_for">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/05/13 10:14

# kakoune 是一款文本编辑器 来源: https://ficd.sh/blog/kakoune-is-a-text-editor/ ## 介绍 欢迎!本文的目标是帮助你全面理解 **Kakoune** (https://kakoune.org/) 文本编辑器:它*是什么*、*如何*工作,以及*为什么*采用这样的设计。虽然这不完全是教程,但我们会逐步构建这些概念,并提供大量具体的使用示例和演示视频以补充讨论。 这篇文章篇幅较长,且信息密度高。建议将其视为一个长期的学习资源,循序渐进地阅读,而不是一次性读完。我希望这篇文章对新用户和现有的 Kakoune 爱好者都能有所帮助。如果你对本帖有任何问题或意见,请随时**联系我** (https://ficd.sh/contact)。 --- 本文是在没有 AI 辅助的情况下撰写的。如果你对一个更具“人性”的互联网感兴趣,请考虑订阅我的 **RSS 源** (https://ficd.sh/rss.xml) 以获取未来文章的更新通知。 目录: - [什么是 kakoune?](https://ficd.sh/blog/kakoune-is-a-text-editor/#what-is-kakoune) - [超越 Vim](https://ficd.sh/blog/kakoune-is-a-text-editor/#beyond-vim) - [所谓“主语 : 谓语”顺序到底是什么意思?](https://ficd.sh/blog/kakoune-is-a-text-editor/#what-does-subject-verb-order-even-mean) - [kakoune 的倒置语法](https://ficd.sh/blog/kakoune-is-a-text-editor/#kakounes-inverted-grammar) - [正交性与原子编辑](https://ficd.sh/blog/kakoune-is-a-text-editor/#orthogonality-and-atomic-edits) - [深入探索按键与命令](https://ficd.sh/blog/kakoune-is-a-text-editor/#a-deeper-dive-into-keys-commands) - [执行按键](https://ficd.sh/blog/kakoune-is-a-text-editor/#executing-keys) - [评估命令](https://ficd.sh/blog/kakoune-is-a-text-editor/#evaluating-commands) - [命令即按键](https://ficd.sh/blog/kakoune-is-a-text-editor/#commands-are-keys) - [多选](https://ficd.sh/blog/kakoune-is-a-text-editor/#multiple-selections) - [寄存器与标记](https://ficd.sh/blog/kakoune-is-a-text-editor/#registers-marks) - [迭代式学习](https://ficd.sh/blog/kakoune-is-a-text-editor/#iterative-learning) - [服务器-客户端编辑器](https://ficd.sh/blog/kakoune-is-a-text-editor/#a-server-client-editor) - [使用管道编辑](https://ficd.sh/blog/kakoune-is-a-text-editor/#editing-with-pipes) - [命令展开](https://ficd.sh/blog/kakoune-is-a-text-editor/#command-expansions) - [编写插件](https://ficd.sh/blog/kakoune-is-a-text-editor/#writing-plugins) - [Shell 展开](https://ficd.sh/blog/kakoune-is-a-text-editor/#shell-expansions) - [结论](https://ficd.sh/blog/kakoune-is-a-text-editor/#conclusion) - [致谢](https://ficd.sh/blog/kakoune-is-a-text-editor/#acknowledgments) - [进一步阅读](https://ficd.sh/blog/kakoune-is-a-text-editor/#further-reading) - [自动生成演示视频](https://ficd.sh/blog/kakoune-is-a-text-editor/#automatically-generating-demo-videos) ## 什么是 kakoune? Kakoune (https://kakoune.org/)(*法语: [kakun]*) 是一款由法国程序员 Maxime Coste<sup>1</sup> (https://ficd.sh/blog/kakoune-is-a-text-editor/#fn:wiki)(更广为人知的名字是 **mawww** (https://github.com/mawww))于 2011 年创建的模态基于屏幕的文本编辑器。它最初是 Vim 的 C++ 重写版本,随后演变成一个具有强烈身份特征和独特设计目标的项目。 以下是 Kakoune 最有趣特性的非详尽概述<sup>2</sup> (https://ficd.sh/blog/kakoune-is-a-text-editor/#fn:kakorg): - **多选和多光标编辑是一等公民**(正则表达式过滤、分割、对齐等)。 - **交互性和实验性是核心设计原则**。 - **具有强大编辑原语的正交设计**(选区旋转、缩进层级、大小写操作……)。 - **客户端/服务器架构**,其中会话窗口由你的终端或窗口管理器管理(tmux, i3, niri……)。 - **高度可扩展**,拥有易于学习的钩子(hook)和宏系统(非官方称为“Kakscript”)。 - 高度关注**Unix 哲学**;Kakoune 不仅与标准 Unix 工具集成,还依赖于它们。 **关于 Helix 的备注** Kakoune (https://kakoune.org/) 一直是 **Helix** (https://github.com/helix-editor/helix) 编辑器的主要灵感来源。然而,Helix 在某些关键设计点上有所偏离,两者不能互换讨论。因此,Helix 不在本文讨论范围内。话虽如此,虽然本文大部分内容不适用于 Helix,但由于其与 Kakoune 共享的“DNA”,部分内容可能仍然适用,因此 Helix 用户可能仍会觉得本讨论有价值。 ## 超越 Vim 让我们将“Vim 运动(motions)”视为一种编辑语言。这个“核心”*不必*被 Vim 所包围;有许多编辑器(VS Code, JetBrains……)支持 Vim 运动。因此,在一个工具中学习 Vim 运动的用户可以迅速适应另一个支持它们的工具。 这一现象的一个副作用是,由于 Vim 的普及性,许多人开始将“类似 Vim 的绑定”视为键盘驱动的模态编辑的***标准***。换句话说,用户期望编辑器在很大程度上与他们现有的“Vim 绑定肌肉记忆”兼容。有些人不会考虑那些要求他们改变操作方式的编辑器。 我认为这很遗憾,因为我相信 Vim 流行是有原因的,但*我们肯定可以做得更好*。没有任何设计是免于迭代和改进的。Kakoune 以一种创新的方式做到了这一点:**倒置主语-谓语顺序**。 ## 所谓“主语 : 谓语”顺序到底是什么意思? 当人们说他们期望“Vim 绑定”时,他们真正的意思并不是特定的按键……当然,我们习惯了用 `hjkl` 进行移动,但我们可以同样快速地适应其他按键。最重要的是 Vim 的**模态文本编辑语法**。它区分*插入模式*(常规打字)和*普通模式*:在普通模式中,*按键*组成*单词*,进而构成*句子*,以*谓语*后接*主语*的形式描述文本编辑。 这种结构紧密镜像了英语,因此我们推理起来感觉自然。例如,我们可能会将“删除这个词”表达为 `dw`:`d` 代表“删除”作为谓语,`w` 代表“直到下一个词的开头”作为主语。关于 Vim 文本编辑语言的优秀文章*数不胜数* (https://stackoverflow.com/a/1220118) (https://takac.github.io/2013/01/30/vim-grammar/) (https://learnvim.irian.to/basics/vim_grammar)。然而,让我简要挑战一下“谓语 : 主语”对于文本编辑的直观性。 --- 你经常遇到以下情况吗?你正在编辑句子中间的部分,现在你想从光标处删除到某个特定的词。你确切知道要删除多远;因为你可以清楚地用眼睛看到目标。挑战在于:如何将这个信息分享给编辑器? 最佳的(类似 Vim 的)命令将是 `dw`,其中 `` 是一个数字键,代表你想删除的词数。但是,你怎么知道这个数字是多少呢?对于 2-3 个词来说很简单,但对于像 13 这样的数字呢?当然,你可以*数*出来,但这会花费很长时间并打断你的思路。另一种选择是猜。但遗憾的是,你对走了多远的第一(也是唯一)视觉反馈是在编辑*应用之后*。所以,如果你差了几个词,你将不得不撤销并重做整个操作,使用不同的计数。 值得庆幸的是,Vim 有一个简单的解决方案:视觉模式(visual mode)!只需按 `v`,现在你可以使用 `w` 和其他运动键创建一个清晰可见的*选区*(主语),然后按另一个键执行*动作*(谓语)。通过在*执行*动作之前确切地看到你将操作什么,你可以大大减少误操作。 然而,Vim 的视觉模式并不是最符合人体工程学的。它有不同版本(按行、按块……),并且它是一个完全独立的模式,其中按键行为可能会以令人惊讶的方式不同。此外,当你最终按下“运算符”键时,编辑器通常会返回普通模式——所以如果你偏好视觉编辑,请准备好*频繁*按 `v`。 Vim 的视觉模式*倒置*了其普通模式中的谓语顺序。先主语,*后*谓语。选区*总是*在动作之前;因此,你会在*行动之前*看到你在操作什么。 我的一位朋友<sup>3</sup> (https://ficd.sh/blog/kakoune-is-a-text-editor/#fn:jd) 是这样说的: > Vim 包含视觉模式是一种勉强的承认,即谓语-主语顺序不足以覆盖所有情况——但没有调整方向并采用更好的语法,Vim 决定在现有模型之上附加支持,导致编辑复杂性飙升到天际。 ## kakoune 的倒置语法 幸运的是,对于全世界视觉模式的爱好者来说,有更好的解决方案。这正是 Kakoune 的编辑语言大放异彩的地方。想象一下,普通模式*就是*视觉模式。如果基于视觉选区的编辑不仅得到支持,而且整个编辑体验都围绕它进行优化,而不是被局限于一个棘手的子模式中,那会怎样? 你不需要想象,因为 Kakoune*就是*那种原生支持“主语-谓语”顺序的编辑器。 例如,`w` 不仅仅将光标向前移动到下一个词,它移动整个*选区*。`w` 的含义是“选择到下一个词的开始”;没有提到任何“光标”。看起来是这样的: (此处应有演示图) 当然,这真正闪耀的地方是*增量更新你的选区*。让我们回到之前选择例子。在 Kakoune 中,“shift”修饰符改变了许多按键的含义:不是*选择其他东西*,而是*扩展已选内容*。大多数移动按键(如 `w`, `b`, `h`, `j`, `k`, `l`)都有 shift 修饰的“扩展”版本。在下面的例子中,让我们使用 `W` 来增加我们的选区,一次一个词。 (此处应有演示图) 许多 Kakoune 按键还支持“计数(count)”,这是一种用数字修饰动作的方式。例如,按 `5w` 与按五次 `w` 效果相同。所以,如果我们知道需要选择多远,我们可以使用计数轻松选择,而无需不必要的重复按键。 最棒的部分是:如果我们选多了,不必撤销并重试。我们只需按 `B` 多次来减少选区。一旦我们对选区满意,我们可以按任何*操作*(即谓语)的键,例如按 `d` 表示“删除”。 (此处应有演示图) 有一点非常重要:与其说是“选区总是先出现”,不如说是“**总是存在选区**”。对选区进行操作的按键*总是*能工作,因为即使你的“光标”也只是单个字符的选区。虽然在 Kakoune 中编辑感觉像是“先做选区,再做动作”,但实际上并没有要求在选择键之后必须跟一个动作键。你可以花任意多的时间完善你的选区,最后再按 `d` 或 `y` 这样的键进行操作。 Kakoune 谓语顺序倒置的另一个好处是它减少了模式的总数。通过将 Vim 的视觉模式合并到普通模式中,我们可以消除一些心理开销并减少总按键次数(不再需要狂按按键来切换进出视觉模式)。 ## 正交性与原子编辑 Kakoune 语法倒置的另一个有趣后果是:**它完全消除了对运算符挂起模式(operator-pending mode)的需求**。 如果你不太熟悉 Vim,以下是快速总结: 说 `d2w` 完全是 Vim 普通模式下的命令并不完全准确。原因在于:单独的 `d` 实际上什么也做不了。你还没有指定*删除什么*!所以,当你按下第一个键(谓语)时,Vim 进入一种称为“运算符挂起”的模式,等待你的后续输入:*主语*!一旦你输入了 `2w`,Vim 就可以完成句子 `d2w` 并执行编辑。 在 Kakoune 中,运算符(谓语)总是知道要操作什么:选区,其中**至少必须存在一个**。这使得普通模式按键的行为是*原子*的。`d` 定义为“删除选区的内容”,并且给定相同的缓冲区状态(文本和选区),它将始终以相同的方式行为。 这一与 Vim 的关键差异使得将动作组合成编辑变得出奇地容易即兴发挥,因为任何按键都可以跟随任何按键。本质上,Kakoune 普通模式中只有两种主要类型的按键: - *改变选区*的按键(移动选区、扩展它、缩小它等)。 - *对选区进行操作*的按键(删除、复制、重复、替换等)。 这意味着编辑不会像 `d2w` 或 `cib` 那样分组为“句子”。在大多数情况下(除了计数、寄存器和将你就退出普通模式的按键外),一个按键就是一个步骤。由于这些步骤是增量的,你不仅可以看到每个步骤的视觉反馈,而且“逻辑编辑”(例如,删除这个词,复制那个句子)也可以用 `u` *部分*撤销。 ## 深入探索按键与命令 Kakoune 有两种接收指令的方式: 1. 执行按键 2. 评估命令 ### 执行按键 按键很简单。简单并不意味着易于学习——按键很多,[列在这里](https://github.com/mawww/kakoune/blob/master/doc/pages/keys.asciidoc)——而是指在书写表达上很简单:我们只需将按键串在一起。例如,序列 `hhW` 代表按两次 `h`,然后按 `W`(Shift + `w`)。 对于某些按键,如果需要,我们可以使用特殊符号: - 修饰键: - ``:`Alt + X` - ``:`Control + X` - ``:`Control + Alt + X` - 等等…… - 特殊键: - `, `: 转义的 `<` 和 `>` - ``: 转义(如上所见) - ``: 回车 - ``,``, 等等…… 某些按键可以以多种方式表示。例如,你可以显式地写 ``,或者在序列中直接放一个实际空格。在演示视频下方书写的按键序列中,我使用 `` 来表示字面上按下空格键。你可以忽略实际空格,它们只是为了让阅读更清晰,没有其他含义。 为什么这种“按键符号”很重要?因为它是**规范**的。除了作为一种更愉快的简写(一直写 `Alt + x` 比 `` 容易得多)之外,它还为我们提供了一种共同的语言来讨论和分享 Kakoune 编辑。此外,Kakoune 实际上可以解析这些字符串并通过 `execute-keys` 命令执行它们。 说到命令…… ### 评估命令 Kakoune 可以将*字符串*评估为一组*命令*。这样命令的序列通常被称为 **Kakscript**,尽管它官方上不是脚本语言。就像 shell 一样,其输入被分割成*单词*,然后被解释为带有参数的命令。它有类 shell 的引号,命令可以由换行符或分号分隔。 ```kakscript # 评论 # 顺便说一句 edit -existing src/main.c set-option buffer indentwidth 4 write src/main.c.bak ``` 就像 shell(哇!谁会猜到呢?)脚本一样,Kakoune 甚至可以读取并评估来自文件(惯例上使用 `.kak` 扩展名)的命令(Kakscript)。甚至有一个*名为* `evaluate-commands`(简写为 `eval`)的命令,你猜对了,它几乎与 shell 中的 `eval` 做同样的事情。如果你不熟悉,这意味着它接受其

相似文章

Kakoune的简易项目切换器

Lobsters Hottest

作者利用Kakoune终端编辑器的内置脚本实现了一个轻量级项目切换器,允许用户注册项目并通过模糊查找来切换。

Kuku: 开源

Product Hunt

Kuku 是一款开源工具,旨在作为本地第二大脑,管理各种 AI 交互。

文本文件作为用户界面

Lobsters Hottest

本文探讨了将文本编辑器作为命令行程序用户界面的概念,重点介绍了它如何利用编辑器的完整编辑功能,同时保持实现简单,并以crontab -e和自定义图片库工具为例。