-
Notifications
You must be signed in to change notification settings - Fork 77
Behavior choice: Helix keymap #338
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
41851a8 to
cc565bc
Compare
cc565bc to
a5c3e7d
Compare
|
Hey there, and thanks for the PR! I haven't looked at everything, but I overall agree with the idea! I don't want to let the perfect be the enemy of the good, but one desire that I had when thinking about letting users switch between Kakoune/Dance/Helix keybindings is supporting multiple keymaps (e.g. non-QWERTY, macOS). Given the large number of keybindings in Dance I would have preferred to change the user's Anyway, it is still good to have a "library" of Helix-specific keybindings; even if the way these keybindings are chosen changes in the future, such a change would be easy to automate following this change. But for now I think I would prefer marking the "behavior" setting as "experimental". I'm also wondering if there might be an overlap between custom modes and behaviors (e.g. maybe instead of behaviors, we could have
This is a good point, I will think about it as well. |
|
I... actually didn't think of generating a new extension with just keybinding and settings. I'll explore that idea, it feels like it'd be a better way to organize and avoid bloating the package.json further. I'm not a fan of editing The more I think about it, the more I think just having 'namespaced' helix modes and keeping the current kakoune modes as default is probably the least likely to break anything, and also the most simple to handle. Makes it a bit harder to show it as 'experimental' though, since you'd just change the default mode. |
6c0c8bd to
1916ec6
Compare
|
Okay, so, turns out making a basic extension with a bunch of keybinds and setting overrides was pretty easy ! It seems to work pretty well, with a couple caveats :
Apart from that, I like it a lot better as a starting point. It's a bit barebones and missing some helix behaviors, but it's probably a better idea to defer those to separate PRs. |
1916ec6 to
7baaa30
Compare
Remove category field from package.json
71
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks a lot! Sorry again for the delay.
I haven't looked at everything though I did skim over the files (and left a few comments, though they're primarily nits / code style).
Seeing the helix: select commands inline like that while knowing that they won't "bloat" the extension is pretty cool!
I think I'm mostly worried about code duplication; I think that I'd like to get to a point where Dance is Dance "Core" + Dance "Kakoune" (or Dance "Helix"), so we would benefit from reusing the same code/assets/package.json build machinery for all extensions.
package.build.ts
Outdated
|
|
||
| const modeNamePattern = { | ||
| pattern: /^[a-zA-Z]\w*$/.source, | ||
| pattern: /^[a-zA-Z]\w*\/?\w*$/.source, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| pattern: /^[a-zA-Z]\w*\/?\w*$/.source, | |
| pattern: /^[a-zA-Z]\w*(\/\w+)$/.source, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wait, doesn't that regex force having a slash somewhere ? I think a ? is missing after the group maybe ?
| ].sort((a, b) => a.command.localeCompare(b.command)); | ||
| } | ||
|
|
||
| export function generateIgnoredKeybinds( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: spelling
| export function generateIgnoredKeybinds( | |
| export function generateIgnoredKeybindings( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you also add a documentation string? By looking at the source code I can fairly easily know what it does, but the name itself isn't enough to understand what is returned.
extensions/helix/package.build.ts
Outdated
| "": { | ||
| hiddenSelectionsIndicatorsDecoration: { | ||
| after: { | ||
| color: "$list.warningForeground", | ||
| }, | ||
| backgroundColor: "$inputValidation.warningBackground", | ||
| borderColor: "$inputValidation.warningBorder", | ||
| borderStyle: "solid", | ||
| borderWidth: "1px", | ||
| isWholeLine: true, | ||
| }, | ||
| }, | ||
| "input": { | ||
| cursorStyle: "underline-thin", | ||
| }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If these two entries are omitted does Dance stop working normally?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From quick testing, it doesn't, I just copy pasted the base settings because I wasn't sure what to with those.
415cac9 to
438baf3
Compare
438baf3 to
10e50a9
Compare
Yah, no worries, there's no hurry, and this thing's become a sizeable PR 😅. I'll have to think about how to deduplicate the package generating code, I'm not sure exactly which part would benefit from abstracting yet. |
If you'd like I can take care of this; we could submit your PR soon (either to
For me, it would include all the Dance commands and API, but none of the keybindings. That way you would install the "Kakoune keybindings" or "Helix keybindings", both of which would depend on "Dance Core", and you would only get the keybindings you need. With this model, I guess we would create a new extension "Dance Core", and migrate the current extension to be "Dance with Kakoune keybindings".
"Dance Core" (the extension) would be different from |
I'd be okay with that, if that works for you ! It'll also allow me to submit the couple other helix-related PRs I'm working on :)
Ah I see, that makes a lot more sense when thinking of it this way. Might make sense to rename the 'core' category to avoid confusion in that case, but that's a small issue. |
71
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I again did not much time to review until now.
I tried it out and it's nice! I opened a PR in Strackeror#1 to work on reusing some of the logic.
src/commands/misc.ts
Outdated
| * | Add the digit 9 to the counter | `9` (core: normal), `NumPad9` (core: normal) | `[".updateCount", { addDigits: 9 }]` | | ||
| * | Title | Keybinding | Command | | ||
| * | ------------------------------ | -------------------------------------------------------------------------------------------- | ------------------------------------ | | ||
| * | Add the digit 0 to the counter | `0` (core: normal), `NumPad0` (core: normal), `0` (helix: select), `NumPad0` (helix: select) | `[".updateCount", { addDigits: 0 }]` | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does (core: normal, helix: select) not work? I don't remember if I implemented this, but I can see several keybindings in your PR (and even from before your PR) which could benefit from such a syntax.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As of right now it doesn't (I would have felt like quite an idiot if it did !). But it actually sounds like a good idea, so I'll see if I can implement that, it would help make things less verbose !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I did it. It's separated by ; instead of , because otherwise the regex would conflict with the one for tags, but it seems to work quite well
It's not consistent, but vscode sometimes gives me errors about the semver for the helix package not being valid, and indeed it seems leading zeroes are not valid semver, so switching to a tag to mark the prerelease
|
hey guys, where's this sitting? any way an excited bystander can help get this over the line? :) |
|
@cloudhan Unfortunately the extension doesn't currently build. I proposed a solution in Strackeror#2 but as pointed out by the author of this PR, it would be better to have different files rather than symlinks. I will tackle it when I get some time, but it may not happen for a while (so, PRs welcome). Edit: I submitted Strackeror#4 to fix this. |
|
@71 On Windows 11, the only problem I encountered is EDIT: not yet, seem vsce is dispatch in a wrong folder, aka, not from dir where package.json is located, but from the project root. |
|
Here is some build artifact on Windows |
04a891c to
257713d
Compare
And: - Update LICENSE to ~2025. - Add purple Dance logo for Helix.
|
Thank you all again for bearing with me here, especially @Strackeror! Sorry again for the delay. We now have a strong base to build on, so future changes should be far simpler to merge. |
|
I've been using Dance with a custom helix-like set of keybindings for more than a year now, and I just wanted to thank everybody involved in getting this PR merged! The quality of this extension is exceptionally high, and by integrating helix bindings, I hope it will see additional adoption. Thanks maintaining it. Really amazing work! 🫶 |
|
Awesome stuff guys, thanks heaps :) |
|
Awesome, thanks! Let's refine and add the missing functionality with focused PRs that can be merged quickly :) |
|
Ayyy, it's done ! Glad this is getting out there, more improvements coming soon :) |
|
hey all, is there any documentation showing how to use these? I'm on pre-release and can't seem to find any settings for enabling helix mode |
|
Hi @lukepighetti, the Helix keybindings haven't been released to the VSCode Marketplace yet, so your best bet is to build from source assuming you have NodeJS installed: This produces a VSIX file, which automatically enables Helix keybindings once installed in VSCode. I've built a copy from the master branch at commit 4e3d259 if you'd like the extension without building it yourself: dance-helix-keybindings-0.1.0.vsix.zip |
|
WHOA Insane work guys. Thank you for making this possible |
|
Hey all, First, appreciate you packaging the extension @ongyx. Although in general, Secondly, I'm trying to publish the extension to the store but have hit a few issues while making sure it works. Notably, after loading the Helix extension the normal Dance modes disappeared, but that doesn't happen all the time. That is, Edit: It looks like it is intended for
Footnotes
|
|
Yup, that's why I included the build instructions above, it's unfortunate that VSIX builds aren't reproducible or I would've included a file hash. I was going to mention the overriding part, but you beat me to it :) As for the solutions you described, option 2 is ideal because you can just de-activate the Helix extension to get the Dance keybinds back. It already works with the current build (the default mode changes too), but the user has to do this manually as the VSCode API doesn't have a way to de-activate extensions programmatically yet. Alternatively (adding on to the overwrite idea):
|
|
Is this usable? I can't get it to switch between |
|
It should work once you've installed the VSIX extension, it automatically overrides your default Dance mode. |
|
I'm also having issues - when pressing I could've sworn this was the case a couple weeks ago when I tried it & it worked properly I don't have any custom keybindings for those keys. The only dance-related bindings i have are around the |
|
I see that same error, @merlindru. It was working earlier this week. |
|
@merlinaudio @tshort Extremely late response, but please see #338 (comment). TL;DR: unlike what I expected, VS Code doesn't merge contributed settings, and instead seems to pick one of them arbitrarily. For now, I'll try to fix it quickly by doing the merge manually in Dance, but I'm also working on having separate extensions for Kakoune and Helix based on one "core" extension in #391. Edit: this should be fixed by #392. Could someone test and report if it works? |
|
is there any reason why this isn't available on the VSCode extension marketplace, or did I miss something? |
|
@lukepighetti The bug I described in #338 (comment) was too big to submit to the marketplace IMO. Once I submit the fix I'll upload it there. |
|
After a long time, the extension is now available in the marketplace! |
|
yay! where's the best place to leave feedback for this? and how do we enable the helix bindings? |
In the Dance repo, in issues or discussions.
Install the Helix keymap and it should set the default mode to |
Hey there !
So I've been maintaining a personal use fork of dance with helix keybindings for a while now, but I've been seeing some of the keybinds making their way into the original codebase (with plans for more in #323), so I thought I'd just go ahead and try to remake it in a way that could fit into the main project.
So, here is a draft for a 'behavior' choice, where a user could choose which base keymap to use from a single setting. This is currently just the basic normal and select mode keymaps, without any of the helix menus, but it's a good starting point to show how it would look like in practice.
Currently the handling in the commands file is pretty naive, with a lot of duplication for the select mode. And I'm not sure on the backward compatibility when adding a new condition to a lot of keybindings like that, so I'm very open to discussion.