ITADN
71/dance
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

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 的?

  • 你更喜欢 Vim、Emacs 还是 Kakoune 的按键绑定,纯属 个人偏好。我个人更喜欢 Kakoune 的
  • Vim 的按键绑定对 VS Code 用户来说已经可用

为什么只是“受”Kakoune“启发”?

  • VSCodeVim 试图模拟 Vim 不同,Dance 的唯一目标是 提供原生的 VS Code 命令 和 受 Kakoune 启发的 按键绑定
    • 某些功能旨在模仿 Kakoune 的行为(例如,将位置视为字符的坐标, 而不是像 VS Code 那样视为字符之间的光标),但这些功能是可选的。
  • Kakoune、Vim 和 VS Code 都是功能完备的文本编辑器;因此,它们 具有重叠的功能。例如,VSCodeVim 提供了自己的 多光标和命令引擎,以让现有的 Vim 用户感到更熟悉, 而 Dance 则完全将多光标模式和编辑器命令交给 VS Code 处理。

用户指南

对于大多数 [命令],其用法与 Kakoune 相同。但是, 进行了以下更改:

自定义模式

所有模式都是自定义的。默认情况下,定义了 normalinsert 模式, 并且提供了许多受 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:作为 truefalse 插入。
    • null:作为 null 插入。
    • undefined:作为空字符串插入。
    • object:作为 JSON 插入。
    • 其他任何类型:导致错误。

示例

  • /(\d+),(\d+)/$1.$2/g12,34 替换为 12.34
  • i + 11,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