71 / dance

Make your cursors dance with Kakoune-like modal editing in VS Code.
https://marketplace.visualstudio.com/items?itemName=gregoire.dance
ISC License
429 stars 55 forks source link
kakoune keybindings vscode vscode-extension

Dance

Kakoune-inspired key bindings, modes, menus and scripting for Visual Studio Code.

Huh?

Dance provides Kakoune-inspired commands and key bindings for Visual Studio Code, as well as support for custom modes and scripting.

Added key bindings are (mostly) compatible with Kakoune's, but are meant to be an addition to Visual Studio Code, rather than an emulation layer on top of it.

Why VS Code, and not Kakoune directly?

Why Kakoune's key bindings, and not Vim's?

Why is it merely 'inspired' by Kakoune?

User Guide

For most commands, the usage is the same as in Kakoune. However, the following changes have been made:

Custom modes

All modes are custom. By default, the normal and insert modes are defined, and many Kakoune-inspired keybindings are available. More modes can be created, though. These modes are configured with dance.modes.

For an example of this (which both creates a new mode and adds keybindings to it), see "Extend select mode" in the wiki.

Selection behaviors

Dance by default uses caret-based selections just like VS Code. This means a selection is anchored between two carets (i.e. positions between characters), and may be empty.

If you prefer character-based selections like Kakoune, please set "selectionBehavior": "character" in the configuration of the mode in which you wish to use character-based selections. This mode is designed to work with block-style cursors, so your configuration would typically look like:

"dance.modes": {
  "insert": {
    // ...
  },
  "normal": {
    "cursorStyle": "block",
    "selectionBehavior": "character",
    // ...
  }
},

If this is enabled, Dance will internally treat selections as inclusive ranges between two characters and imply that each selection contains at least one character.

Scripting

Most keybindings exposed by Dance are actually implemented by running several Dance commands in a row. For instance, dance.modes.set.normal is actually a wrapper around dance.modes.set with the argument { mode: "normal" }. Commands that take an input, like dance.modes.set, will prompt a user for a value if no argument is given.

Additionally to having commands with many settings, Dance also exposes the dance.run command, which runs JavaScript code. That code has access to the Dance API, and can perform operations with more control than Dance commands. Where Dance commands in the dance.selections namespace operate the same way on all selections at once, dance.run can be used to individually manipulate selections. It can also be used to run several commands at once.

Finally, the Dance API is exported by Dance. Other VS Code extensions can specify that they depend on Dance (with the extensionDependencies property), and then access the API by calling activate:

const { api } = await vscode.extensions.getExtension("gregoire.dance")
  .activate();

Pipes

Pipes no longer accept shell commands, but instead accept "expressions", those being:

Examples

Status bar

Dance provides several status bar segments (left-aligned) exposing info similar to Kakoune's default mode-line. Most of them are hidden by default and only shown contextually:

Dance view

Dance also provides a custom view which lists all registers and their contents.

Miscellaneous changes

A few changes were made from Kakoune, mostly out of personal preference, and to make the extension integrate better with VS Code.

Troubleshooting

Contributing

Bugs

There are unfortunately still bugs lurking around. If you find one, please ensure that it has not been reported yet and submit a test that does not pass and can be used to reliably reproduce the bug.

Features

If you'd like to add or improve a feature, please make sure that no similar feature has been requested in the issues and file a new issue for it. This will ensure that no two people work on the same feature at the same time, and will be a good place to ask for help in case you want to tackle this yourself.\ Since some features are not general enough, it may be requested of you to make a plugin that uses the Dance API or to simply use scripts in the meantime.

When contributing, please be mindful of the existing coding conventions and naming.

Your PR will be rebased on top of master in order to keep a clean commit history. Please avoid unnecessary commits (git commit --amend is your friend).

Misc.

Pre-release versions follow the pattern <major>.<minor>.<prev-patch><pre-release>, so for instance pre-release 1 of version 0.5.13 is 0.5.12001.