Eu só posso responder por zsh
, onde isso pode ser feito, sim.
Primeiro, já existem alguns widgets para conclusão incremental . O primeiro é aparentemente o de Y. Fujii. Embora o seu site esteja em japonês, você pode descobrir facilmente sem falar esse idioma, como funciona e como usar isto. Auto-fu é uma extensão do script original.
Até agora, as referências. Em zsh
, o editor de linhas zsh ( zle
) é responsável pelo uso interativo da linha de comando. Além de muitas outras variáveis fornecidas para widgets (veja man zshzle
), estas são de interesse para você como você deseja capturar a linha de comando atual :
$BUFFER: The entire contents of the edit buffer.
$LBUFFER: The part of the buffer that lies to the left of the cursor position.
$RBUFFER: The part of the buffer that lies to the right of the cursor position.
Estas variáveis são graváveis, o que alterará a linha de comando atual!
Para capturar cada pressionamento de tecla, você pode modificar o widget self-insert
que é executado (por padrão) para cada pressionamento de tecla, exceto LF
ou CR
. Aqui está um exemplo, que não faz nada muito útil, mas acrescenta, para cada tecla, um ponto a $RBUFFER
- apenas para ilustrar como isso funciona:
function self-insert() {
RBUFFER+="."
# execute some other command, but ensure they don't produce any output.
zle .self-insert
}
zle -N self-insert
.self-insert
é o widget incorporado, por isso não corremos para um ciclo infinito.
Então, você pode começar do zero ou começar do script do Fujii e modificá-lo. Um dos benefícios deste último é que ele também faz algumas manipulações de excluir pressionamentos de teclas que negligenciei aqui.