Estou usando o shell zsh
e estou tentando instalar alguns atalhos de teclado para usar chaves semelhantes às que eu usaria em um buffer Vim, quando um menu de conclusão estiver aberto.
Portanto, dentro do mapa de teclado menuselect
, vinculei as chaves j
e k
aos zle
widgets down-line-or-history
e up-line-or-history
, adicionando as seguintes linhas dentro de ~/.zshrc
:
bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history
down-line-or-history
e up-line-or-history
são descritos em man zshzle
da seguinte forma:
down-line-or-history (^N ESC-[B) (j) (ESC-[B)
Move down a line in the buffer, or if already at the bottom line, move to the next event in the his‐
tory list.
up-line-or-history (^P ESC-[A) (k) (ESC-[A)
Move up a line in the buffer, or if already at the top line, move to the previous event in the history
list.
Agora, gostaria de vincular C-d
e C-u
aos mesmos widgets, mas repetindo-os um número arbitrário de vezes, por exemplo, 5
.
Primeiro, tentei este código simples:
some-widget() {
zle backward-char -n 5
}
zle -N some-widget
bindkey '^D' some-widget
Ele liga C-d
ao widget zle backward-char
, mas o repete 5
times.
Depois, tentei reescrever o código, movendo a ligação de chave do mapa de teclado padrão para o mapa de teclado menuselect
:
some-widget() {
zle backward-char -n 5
}
zle -N some-widget
bindkey -M menuselect '^D' some-widget
Mas não funciona como eu esperava, porque quando eu bato C-d
enquanto um menu de conclusão está aberto, zle
parece executar o widget padrão ligado a C-d
, que é delete-char-or-list
:
delete-char-or-list (^D) (unbound) (unbound)
Delete the character under the cursor. If the cursor is at the end of the line, list possible comple‐
tions for the current word.
Ele sai do menu de conclusão atual e lista possíveis conclusões para a palavra atual, em vez de mover o cursor para trás 5
times.
Se tivesse funcionado como eu esperava, provavelmente teria acabado usando este código final:
fast-down-line-or-history() {
zle down-line-or-history -n 5
}
zle -N fast-down-line-or-history
bindkey -M menuselect '^D' fast-down-line-or-history
fast-up-line-or-history() {
zle up-line-or-history -n 5
}
zle -N fast-up-line-or-history
bindkey -M menuselect '^U' fast-up-line-or-history
Mas, como isso não acontece, preciso descobrir como repetir um widget zle
quando um menu de conclusão estiver aberto.
Como modificar o código anterior, para que down-line-or-history
seja repetido 5
vezes ao atingir C-d
enquanto o menu de conclusão estiver aberto?