-
Notifications
You must be signed in to change notification settings - Fork 33
Description
This isn't actually a issue, it's more like an informative notice. All workarounds presented in the README.md has one or other drawback, but the one showed bellow adresses this issue flawless (or I think so).
The strategy is to remap the c, d and y keys to user defined widgets, thus removing its original bindings vi-delete, vi-change and vi-yank.
These widgets will then read the next character pressed and if its an s, it will call the surround widget, otherwise it will call the vi widget with the proper numeric-argument. One special attention must be given to repeated key commands, like cc, dd and yy, so it won't call our widget recursively.
Here's the code:
function change-hack() {
read -k 1 option
if [[ $option == 's' ]]; then
zle -U Tcs
elif [[ $option == 'c' ]]; then
zle vi-change-whole-line
else
zle -U ${NUMERIC}Tvc$option
fi
}
function delete-hack() {
read -k 1 option
if [[ $option == 's' ]]; then
zle -U Tds
elif [[ $option == 'd' ]]; then
zle kill-whole-line
else
zle -U ${NUMERIC}Tvd$option
fi
}
function yank-hack() {
read -k 1 option
if [[ $option == 's' ]]; then
zle -U Tys
elif [[ $option == 'y' ]]; then
zle vi-yank-whole-line
else
zle -U ${NUMERIC}Tvy$option
fi
}
zle -N change-hack
zle -N delete-hack
zle -N yank-hack
autoload -Uz surround
zle -N delete-surround surround
zle -N change-surround surround
zle -N add-surround surround
bindkey -M vicmd 'Tcs' change-surround
bindkey -M vicmd 'Tds' delete-surround
bindkey -M vicmd 'Tys' add-surround
bindkey -M vicmd 'Tvd' vi-delete
bindkey -M vicmd 'Tvc' vi-change
bindkey -M vicmd 'Tvy' vi-yank
bindkey -M vicmd 'c' change-hack
bindkey -M vicmd 'd' delete-hack
bindkey -M vicmd 'y' yank-hack
bindkey -M visual S add-surroundThis workaround has two advantages over the others:
- The value of
KEYTIMEOUTdoesn't interfere on its working; - You can press the first key and wait as much as desired to press the second key.
The only drawback is the ugly hack it is itself.
Note, however, that I came up with this yesterday night, so it wasn't tested throughout. Pls, let me know if something doesn't work.