Como fazer com que o comando zsh not store failed

7

Problema

Estou usando o oh-my-zsh e o Antigen para gerenciar meu Zsh.

Por vezes, introduzo acidentalmente um comando errado / falhado no Zsh e é muito irritante quando o plug-in zsh-autosuggestions lança esses comandos.

Por exemplo, digamos que eu digitei gut status em vez de git status .

Agora, enquanto tento digitar o comando correto novamente, depois de digitar g , o plug-in de auto-sugestão lançará gut status , já que é a correspondência mais próxima no histórico recente. Mas isso é um comando falhado!

O que eu quero fazer é evitar que esses comandos com falha "poluam" meu histórico , para que o plug-in de auto-sugestão não os sugira.

O que eu fiz

Eu procurei por isso e a correspondência mais próxima para manter as entradas do histórico é a configuração de HIST_IGNORE_SPACE, ou métodos para ignorar comandos específicos ou para excluir comandos manualmente após inseri-los. Veja this e isso . Mas como observou @Adaephon 52, isso ocorre depois que a ação é feita.

O que estou pensando em fazer

O que eu tenho em mente agora é escrever uma função que é acionada toda vez que um comando com falha é inserido no Zsh para excluir a última entrada do histórico. No entanto, não estou familiarizado o suficiente com o Zsh para saber se esse tipo de gatilho existe ou como fazê-lo.

Nota sobre a solução aceita

Para aqueles que estão interessados nesse problema, a solução aceita funciona no sentido de que os comandos com falha não são armazenados no arquivo de histórico. fc -l ou history confirma isso.

No entanto, parece que o plugin zsh-autosuggestions está fazendo seu próprio cache local de classificações (ou está gerando sugestões usando outro mecanismo), então ele ainda sugere os comandos com falha, mas somente se a sessão não terminar . Quando o usuário inicia uma nova instância do shell, quando presumivelmente o plug-in precisa carregar o histórico em cache, ele não sugere mais os comandos com falha (a menos que você os insira novamente, é claro).

A solução proposta é tecnicamente correta, pois eu (equivocadamente) emoldurei a minha questão de tal forma que ela requer apenas uma resposta que impeça o Zsh de armazenar os comandos com falha e a solução aceita faz isso (embora de maneira limitada; em solução para detalhes).

Qualquer um que esteja familiarizado com scripts de shell (não estou) e motivado o suficiente pode verificar o Script zsh-autosuggestions .

    
por lightalchemist 16.04.2015 / 10:05

2 respostas

8

Bart Schaefer propôs a seguinte abordagem para o mesmo pergunta na lista de discussão zsh users :

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

Esta função é executada antes da linha de comando ser gravada no histórico. Se ele retornar 1, a linha de comando atual não será anexada ao arquivo do histórico nem à pilha do histórico local. No entanto, a verificação se o comando acionará um erro comando não encontrado abrange apenas casos simples. Por exemplo. esta linha estará na história:

echo foo; echooo bar

Mas funciona bem para o seu exemplo

gut status

Por favor, esteja ciente de que o comando errado aparecerá em UP-ARROW (para que você possa corrigi-lo!), mas não está na pilha de histórico; verifique com fc -l .

    
por 16.04.2015 / 21:55
-2

não tenho certeza de como o omz o executa, mas no prefixo bash e regular do zsh com um espaço o mantém fora da história e, portanto, também fora do preenchimento automático / sugerir

ou seja,

<space>ll -ahZ  /home/%USER
    
por 16.04.2015 / 13:25