Skip to content
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

zvm_bindkey doesn't seem to play nice with repeated multikey sequences #261

Open
3 tasks done
cohml opened this issue Jan 23, 2024 · 0 comments
Open
3 tasks done
Assignees
Labels
bug Something isn't working

Comments

@cohml
Copy link

cohml commented Jan 23, 2024

General information

  • Terminal program: iTerm.app 3.4.23 (xterm-256color)
  • Operating system: macOS 14.2.1 (23C71)
  • ZSH framework: oh-my-zsh master (f7b647e1)
  • ZSH version: zsh 5.9 (x86_64-apple-darwin23.0)
  • ZVM version: zsh-vi-mode 0.11.0

Basic examination

  • I have read through the README page
  • I have the latest version of zsh-vi-mode
  • I have tested with another terminal program

Problem description

Sorry for the poor issue title, I wasn't sure how to concisely describe the problem. Basically it's this:

Given two widgets A and B, zvm_bindkey doesn't work well when I try to bind one to e.g., ^x and another to ^x^x. No matter what I do, I can't seem to get both keybindings working simultaneously. Which one works also seems to depend on the order in which they were bound using zvm_bindkey.

Extra observations

Based on my own reading of the source code, the problem seems to stem in part from these lines. However because I don't understand the intent, I can't recommend a fix.

Reproduction steps

# define two arbitrary functionsfunction x_func() { echo hello from x }
❯ function xx_func() { echo hello from xx }
❯
❯ # register the functions as zsh widgets
❯ zle -N x_func
❯ zle -N xx_func
❯
❯ # note that the x key is unused for any keybindings
❯ bindkey -L | grep -i x
❯ 
❯ # bind using zvm_keybind (first x_func then xx_func)
❯ zvm_bindkey viins "^x" x_func
❯ zvm_bindkey viins "^x^x" xx_func
❯ 
❯ # observe the results
❯ bindkey -L | grep -i x
bindkey "^X" zvm_readkeys_handler  # <-- note that i didn't do this myself, and i suspect it's related to the issue reported here
bindkey "^X^X" xx_func
❯ 
❯ # now try to use the keybindings; note that ^x does nothing...
❯
❯ # ...meanwhile, ^x^x works as intended
❯ hello from xx
❯
❯ # now unbind both ^x and ^x^x for good measure
❯ bindkey -r -M viins "^x"
❯ bindkey -r -M viins "^x^x"
❯
❯ # sanity check that there are no "x" keybindings
❯ bindkey -L | grep -i x
❯
❯ # now re-bind, but this time in the opposite order (first xx_func then x_func)
❯ zvm_bindkey viins "^x^x" xx_func
❯ zvm_bindkey viins "^x" x_func
❯ 
❯ # observe the results
❯ bindkey -L | grep -i x
bindkey "^X" x_func  # <-- seems correct now, no avm_readkeys_handler here like there was before
bindkey "^X^X" xx_func
❯
❯ # note that now ^x works...
❯ hello from x
❯
❯ # ...meanwhile, ^x^x no longer does (instead, it just triggers the ^x keybinding)
❯ hello from x

As you can see, in no case am I able to get both keybindings working simultaneously.

Furthermore, using zvm_bindkey with bindings like ^x and ^x^x yields different results depending on the order in which things are bound

Finally, zvm_readkeys_handler also pops up, muddying the debugging waters. (ref. #260)

Expected behavior

Both keybindings should work, lol. The possibility for ambiguity (e.g., when I type ^x, do I want to execute ^x, or am I just not finished typing ^x^x?) should already be resolvable by the existence of the KEYTIMEOUT variable.

Moreover, ideally order shouldn't matter, though I understand there may be some constraints there.

@jeffreytse jeffreytse self-assigned this Jan 24, 2024
@jeffreytse jeffreytse added the bug Something isn't working label Jan 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants