Dance
受 Kakoune 启发的按键绑定、模式、菜单和脚本,适用于 Visual Studio Code。
嗯?
Dance 为 Visual Studio Code 提供了受 Kakoune 启发的命令和按键绑定, 以及自定义模式和脚本的支持。
新增的按键绑定(主要)与 Kakoune 兼容,但其目的是作为 Visual Studio Code 的补充,而非在其之上的模拟层。
为什么选择 VS Code,而不是直接使用 Kakoune?
- Kakoune 是一个高效且轻量级的编辑器,生态系统非常小。VS Code 是一个完整的 IDE,拥有庞大的生态系统和许多现有扩展。
- Kakoune 仅支持 Unix。
为什么选择 Kakoune 的按键绑定,而不是 Vim 的?
为什么只是“受”Kakoune“启发”?
- 与 VSCodeVim 试图模拟 Vim 不同,Dance 的唯一目标是
提供原生的 VS Code 命令 和
受 Kakoune 启发的 按键绑定。
- 某些功能旨在模仿 Kakoune 的行为(例如,将位置视为字符的坐标, 而不是像 VS Code 那样视为字符之间的光标),但这些功能是可选的。
- Kakoune、Vim 和 VS Code 都是功能完备的文本编辑器;因此,它们 具有重叠的功能。例如,VSCodeVim 提供了自己的 多光标和命令引擎,以让现有的 Vim 用户感到更熟悉, 而 Dance 则完全将多光标模式和编辑器命令交给 VS Code 处理。
用户指南
对于大多数 [命令],其用法与 Kakoune 相同。但是, 进行了以下更改:
自定义模式
所有模式都是自定义的。默认情况下,定义了 normal 和 insert 模式,
并且提供了许多受 Kakoune 启发的按键绑定。不过,
可以创建更多模式。这些模式通过 dance.modes 进行配置。
关于此功能的一个示例(它既创建了一个新模式,又为其添加了按键绑定), 请参阅 wiki 中的 "Extend select mode"。
选择行为
Dance 默认使用与 VS Code 相同的光标式选择。这意味着 选择锚定在两个光标之间(即字符之间的位置), 并且可以为空。
如果您更喜欢类似 Kakoune 的基于字符的选择,请在您希望使用基于字符的选择的模式的配置中设置
"selectionBehavior": "character"。该模式旨在与块状光标配合使用,因此您的配置通常如下所示:
"dance.modes": {
"insert": {
// ...
},
"normal": {
"cursorStyle": "block",
"selectionBehavior": "character",
// ...
}
},
如果启用了此选项,Dance 将在内部将选区视为两个字符之间的包含范围,并隐含每个选区至少包含一个字符。
脚本
Dance 暴露的大多数键绑定实际上是通过依次执行多个 Dance 命令来实现的。例如,dance.modes.set.normal 实际上是带有参数 { mode: "normal" } 的 dance.modes.set 的封装。
接受输入的命令,如 dance.modes.set,在未提供参数时会提示用户输入一个值。
除了拥有许多设置的命令外,Dance 还暴露了
dance.run 命令,该命令用于运行 JavaScript 代码。该代码可以访问
Dance API,并能执行比 Dance 命令具有更多控制的操作。Dance 命令在 dance.selections 命名空间中
以相同的方式同时操作所有选区,而 dance.run 可用于
单独操作选区。它还可以用于同时运行多个命令。
最后,Dance API 由 Dance 导出。其他 VS Code 扩展可以
指定它们依赖于 Dance(通过
extensionDependencies 属性),
然后通过调用
activate:
const { api } = await vscode.extensions.getExtension("gregoire.dance")
.activate();
管道
管道不再接受 shell 命令,而是接受“表达式”,这些表达式为:
-
#<shell command>:将每个选区传入 shell 命令(shell 遵循terminal.integrated.automationProfile.<os>配置)。 -
/<pattern>[/<replacement>[/<flags>]:一个 RegExp 字面量,如 JavaScript 中定义。 请注意添加了replacement,用于添加或替换文本的命令。 -
<JS expression>:一个 JavaScript 表达式,其中以下变量 可用:$:当前选区的文本。$$:所有选区文本的数组。i:当前选区的索引。n:$$中的选区数量。
根据表达式的结果,其插入方式不同:
string:直接插入。number:以其字符串表示形式插入。boolean:作为true或false插入。null:作为null插入。undefined:作为空字符串插入。object:作为 JSON 插入。- 其他任何类型:导致错误。
示例
/(\d+),(\d+)/$1.$2/g将12,34替换为12.34。i + 1将1,1,1,1,1替换为1,2,3,4,5,假设每个选区 位于不同的数字上。
状态栏
Dance 提供多个状态栏段(左对齐),暴露与 Kakoune 默认模式行类似的信息。其中大多数默认隐藏,仅在上下文中显示:
- 当前模式:点击切换到其他模式
- 宏录制状态:点击停止录制
- 当前计数前缀:点击重置为 0
- 当前寄存器:点击取消设置
- dance 错误:点击复制最后一个错误的完整描述
Dance 视图
Dance 还提供 自定义视图 ,用于列出所有寄存器及其内容。
其他更改
从 Kakoune 进行了一些更改,主要出于个人偏好,并 为了使扩展更好地与 VS Code 集成。
- 默认 yank 寄存器
"映射到系统剪贴板。 RegExps 提供给 Dance 命令的参数支持使用(?i)语法附加额外标志(但仅限在模式开头)。- 寄存器可以具有任意名称。如果寄存器名称以单个空格字符开头, 则它将是当前文档的局部寄存器。
- 当使用默认配置时(也就是说,这些设置可以
修改):
- 光标不是块状,而是线状:Dance 专注于选区,使用 线状光标而非块状光标可以明确显示是零个还是 一个字符被选中。此外,线状光标是 VS Code 的默认设置。
- 更改模式也会将
editor.lineNumbers配置 值更改为on(在insert模式下),以及在普通模式下更改为relative。
故障排除
- Dance 使用内置的 VS Code 键位绑定,因此不会覆盖
type命令。但是,它有时需要访问type命令,例如在对话框和寄存器选择中。因此,它与始终覆盖type命令的扩展不兼容,例如 VSCodeVim;因此必须禁用这些扩展。 - 如果你在 Linux 上且键位绑定未按预期工作(例如,
swapescape未被遵守),请查看 VS Code 关于 排查 Linux 键位绑定问题的指南。 简而言之:在 VS Code 设置中添加"keyboard.dispatch": "keyCode"很可能 会修复此问题。
Helix
Dance 还支持 Helix 键位绑定,因为它们
与 Kakoune 的非常相似。所有键位绑定的源代码都在 src 中共享,
其中 Helix 扩展 定义了具有不同内置键位绑定集合的新模式(helix/normal,
...)。
Helix 扩展可在 VS Code 市场 中获取。
贡献
参见 CONTRIBUTING.md。