Kakoune是一位(相当)年轻的模态代码编辑,它已经成熟了很长时间,而且是一款上好的红酒。它将多选、可操作性和互动性作为其独特特点的核心。它为用户提供了高效而舒适的文本编辑体验--但这不是本文要讨论的问题。
写这篇文章的时候,Kakoune已经8岁了,它已经经历了几次迭代,消除了这里的依赖,优化了那里的核心功能,甚至分解了整个代码库!正如任何长期用户都会告诉你的那样,很容易将所有的好东西都视为理所当然。
所以就是这样了。我暂停几分钟,在本文中列出Kakoune项目在几个方面做得很好的几件事。有些是技术性的,但其余的应该很容易适应其他项目(无论它们是不是代码编辑器),并且足够通用,可以无缝采用。
那么为什么这篇文章的标题提到了偷窃呢?继续读下去,这是第一项。
如果东西不属于任何人,如果你把它据为己有,那就是偷窃吗?如果它平等地属于每个人呢?
幸运的是,我们不需要解决这个问题:卡库恩是一个公共领域的项目。这意味着任何人都可以自由地使用编辑器的源代码做任何他们想做的事情,不会有任何问题。
用户可以修改代码(修复错误、添加新功能或调整已有的功能等)。并发布它(或编译的二进制文件),而不用担心属性。
它在一定程度上减轻了维护人员对整个项目的责任,任何人都可以根据自己的喜好重新标记或大量修改。
用户不喜欢为工具付费,当它们是免费和开源的时候,我会争辩说,如果它们不限制用户对代码的使用,它们最终会变得更有用(经过几次迭代,随着时间的推移)。
我不赞成废除许可证,我认为如果专门的工具在公共领域,对每个人来说都会更有效率。事实上,Kakoune项目是根据非许可条款获得许可的,以避免与不承认公有领域模式的司法管辖区发生冲突。
至于上面的小谜语,这是一个很难回答的问题,近乎哲学,但既然我们谈论的是复制数据,我们就可以很容易地打破这个悖论:复制不是偷窃。
新来者喜欢称赞Kakoune拥有干净的代码库,易于导航和修改。这是有充分理由的!代码是用C++编写的,使用尽可能少的花哨来保持代码的优雅,可以(合理地)用旧的编译器版本编译,但更重要的是更方便。
说到便利性,卡库恩有一些有趣的资产可以让您的项目受益:
基本上遵循ECMA语法的正则表达式引擎-此实现允许项目删除Boost::regexas依赖项(regex.hh)。
字符串类型的包装器(例如,String视图)和相关实用程序:JOIN、WRAP、SPLIT、QUOTE、PAD等(string.hh·string_utils.hh)。
GO的DEFER语句的实现,一旦执行流离开当前作用域(GO规范·utils.hh)就运行代码
上述代码片段并不完全是即兴的,因为它们仍然耦合到为编辑器定义的自定义类型,但是对于其他C++项目来说应该可以毫无困难地进行适配。
最初是一个复活节彩蛋,精明的用户通过阅读处理终端客户端用户界面的代码来发现,Clippy角色已经成为一个吉祥物,现在可以开箱即用了。然而,尽管不可否认的是,对微软Office助手的怀念激发了人们对Clippy本身的长期兴趣,但这枚复活节彩蛋的恶名给它的一个更大的功能蒙上了一层阴影:自动信息弹出窗口。
自动信息窗口是编辑器提供的一般交互级别的重要组成部分,因为每当用户在正常模式下按下Akey或在命令提示符中键入函数名时,都会弹出该窗口。它的目的是向用户提供即时反馈,传达用户可用的使用信息或可能的选项。每次我使用一个终端程序,它允许我输入命令,但从来不会询问它们采用了什么参数,我真的希望更多的人能从卡库恩窃取这些命令!
编辑器提出的另一个与命令提示符相关的改进是模糊匹配:用户不需要按顺序键入组成所需命令名称的字母,这有助于更快地完成选择,并增加可发现性。
Kakoune中的所有命令名称都是以它们所属的功能组的名称开头的单词。以下示例如下:
要确定哪些命令与缓冲区交互,请键入:Buffer将返回候选命令,如BUFFER-NEXT、LINT-BUFFER、FORMAT-BUFFER…。
要调用lint-buffer命令,键入:lb<;tab>;将在提示符中插入整个命令名称。
使用Kakoune一次,你会希望你的浏览器在接下来的日子里都能在你的历史记录/书签中启用模糊匹配。但你可能会想:有一些单独的工具可以处理模糊匹配,比如fzf、ctrlp或fzy,如果用户更愿意使用它们来打开文件,比如文件呢?问得好!往下读,这就是我想让你偷窃的下一个维度。
UNIX哲学指出,工具应该专注于做一件事,并且把它做好。其含义是,实现太多无关功能的工具最终会给用户带来平淡无奇的体验,因为它们只允许对其行为进行这么多的粒度控制,而且它们的维护人员过于分散,无法改进/修复它们。
如果我们把这一点重新放到文本编辑的上下文中,编辑们只需要担心这一点--文本编辑。Kakoune出色地完成了作为UNIX公民的工作,但它也更进一步:它允许其他工具通过shell脚本与其交互。
还记得上面生成第三方模糊匹配程序的情况吗?不涉及细节,在Kakoune中,您可以通过派生一个新的终端(或窗格/选项卡)来实现这一点,该终端将运行程序,其输出将由编辑器解释。用户可以自由运行他们想要的任何程序,任何他们喜欢的终端或多路复用器。
这个概念也不局限于终端程序,尽管它们可能是Kakoune用户直觉上想要与之交互的工具类型,因为编辑器本身就是一个编辑器。例如,是否要使用图形界面编辑文件?尝试以下内容:
如果这听起来没有什么特别之处,那就意味着它很有意义。不幸的是,UNIX系统上的文本编辑器领域多年来已经变成了一个群岛,在这个群岛中,每个编辑器都以成为一个孤岛为目标。作业管理、外壳、终端仿真、窗口多路复用…。文本编辑器已经变成了封闭的生态系统(或集成开发环境),它们提供许多与编辑无关的功能(有时看起来像纸板一样),新来者必须接受这些功能,否则就会被冷落。
所以这里有一个想法,如果适用于他们的项目,每个人都不应该为偷窃感到内疚:不要重新发明轮子,我们已经有足够糟糕的模仿了-相反,努力让你的工具更容易与其他人交互!
如果您有任何意见或问题,请随时访问官方IRC频道:#kakoune@FreeNode。