Tenho uma função registrada no ZSH que pesquisa o conteúdo do arquivo sob o caminho atual para uma correspondência e então captura o nome do arquivo resultante. Isso é então vinculado a uma combinação de teclas. A vinculação de teclas, a pesquisa e o resultado funcionam bem (como se retornassem o valor desejado).
Quando estou usando a combinação de teclas, o valor é impresso na linha de shell atual, mas não é reconhecido como entrada real (ou seja, se eu pressionar enter, o valor é considerado vazio e nada é adicionado ao histórico do prompt). Como faço para exibir o resultado como se ele fosse digitado e um valor válido. Eu tentei echo
/ print
/ printf
(assumindo que o resultado seria o mesmo para cada um), mas também anexando BUFFER
e definindo CURSOR
.
Tenho certeza de que isso está bem documentado e não estou conseguindo encontrar exemplos por causa da falta de terminologia correta. Alguém pode me apontar a direção certa?
Imprimir no terminal não pode ajudar você. Isso exibe uma mensagem para o usuário (não estará no lugar certo na tela e confundirá o editor de linha porque altera a posição do cursor do terminal — use
zle -M
ouzle -R
em vez disso). Isso não é entrada para o shell.A variável mágica
BUFFER
contém a(s) linha(s) que o usuário está editando eCURSOR
contém a posição do cursor de entrada. Você pode alterar o buffer de entrada do usuário e a posição do cursor modificandoBUFFER
eCURSOR
. Então você estava no caminho certo. Para inserir algo no cursor, no entanto, há uma maneira mais fácil: basta anexar à variável mágicaLBUFFER
e o zsh fará o resto.LBUFFER
contém a entrada do usuário até o cursor, e modificá-la funciona intuitivamente.Aqui está um exemplo funcional do meu
.zshrc
de inserir a saída de um comando no buffer de entrada. Ele insere o nome do branch Git atual quando eu pressiono Alt+ v b.Note que este exemplo simples insere a saída do comando como está. Para um nome de arquivo, você provavelmente deve citá-lo caso ele tenha caracteres especiais. Por exemplo, se a saída do comando for
A Song.mp3
então o código simples acima apenas insereA Song.mp3
na linha de comando. Mas para torná-lo útil, ele deve inserir algo que seja um argumento válido para um comando. Use o sinalizador de expansão de parâmetroq-
ou para citar a saída do comando, se necessário.q+
Note que se você quiser fazer uma busca com base na palavra ao redor do cursor, o zsh tem funções auxiliares que poupam você de fazer sua própria análise de linha de comando, e elas também podem cuidar da injeção de novo texto. Em particular,
modify-current-argument
substitui a palavra shell ao redor do cursor por uma nova palavra shell de sua escolha, que ele cita se necessário. Aqui está uma prova de conceito que mostra como substituir a palavra em que o cursor está pelo arquivo mais recente que contém essa palavra.Normalmente eu encontrava minha resposta na próxima coisa que olhava.
Encontrei alguma inspiração em https://github.com/junegunn/fzf/blob/master/shell/key-bindings.zsh - em particular a
fzf-history-widget
função. Lá, ele define aLBUFFER
variável com a entrada do usuário (se não for um comando de histórico de revisão) e então chamazle reset-prompt
. Testei isso com minha abordagemBUFFER
+CURSOR
e isso também funciona, mas aLBUFFER
abordagem é mais concisa.