Como repetir um widget zle um número arbitrário de vezes quando o menu de conclusão está aberto?

2

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?

    
por user852573 08.07.2017 / 16:53

0 respostas

Tags