Come fare Zsh non memorizzare il command fallito

Problema

Sto utilizzando oh-my-zsh e Antigen per gestire la mia Zsh.

A volte accidero accidentalmente un command errato / fallito in Zsh ed è molto fastidioso quando il plugin zsh-autosuggestions genera questi comandi.

Per esempio, dico che ho digitato lo gut status piuttosto che git status .

Ora, mentre tento di digitare nuovamente il command corretto, una volta digitato g , il plugin di autosuggestione lancerà lo gut status quanto è la corrispondenza più vicina nella storia recente. Ma questo è un command fallito!

Quello che voglio fare è mantenere questi comandi falliti da "inquinare" la mia storia in modo che il plugin di autosuggestione non li suggerisca.

Cosa ho fatto

Ho cercato questo e la corrispondenza più vicina a mantenere le voci dalla cronologia è quella di impostare HIST_IGNORE_SPACE o methods per ignorare comandi specifici o per eliminare manualmente i comandi dopo l'inserimento. Vedi questo e questo . Ma come ha notato @Adaephon 52, questo avviene dopo che l'azione è stata fatta.

Quello che sto pensando di fare

Quello che ho in mente adesso è scrivere una function che viene triggersta each volta che un command fallito viene inserito in Zsh per eliminare l'ultima voce dalla cronologia. Tuttavia, non sono abbastanza familiare con Zsh per sapere se esiste questo tipo di trigger o come farlo.


Nota sulla soluzione accettata

Per coloro che sono interessati a questo problema, la soluzione accettata funziona nel senso che i comandi falliti non vengono memorizzati nel file di cronologia. fc -l o la history conferma questo.

Tuttavia, sembra che il plugin zsh-autosuggestions sta facendo la propria cache locale di vari tipi (o genera suggerimenti che utilizzano altri meccanismi), quindi suggerirà comunque i comandi falliti, ma solo se la session non finisce. Quando l'utente avvia una nuova istanza della shell, quando presumibilmente il plugin deve caricare la cache nella cache, non suggerisce più i comandi falliti (a less che non li inserisca di nuovo ovviamente).

La soluzione proposta è tecnicamente corretta poiché ho (erroneamente) inquadrato la mia domanda in modo tale che richiede solo una risposta che impedisca a Zsh di memorizzare i comandi falliti e la soluzione accettata lo fa (anche se in modo limitato; dettagli).

Chiunque abbia familiarità con lo script di shell (non lo so) e sufficientemente motivato può controllare lo script zsh-autosuggestions .

Bart Schaefer ha proposto il seguente approccio alla stessa domanda sulla mailing list degli utenti zsh :

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

Questa function viene eseguita prima che la row di command venga scritta nella cronologia. Se restituisce 1, la row di command corrente non viene aggiunta al file di cronologia né allo stack di cronologia locale. Tuttavia, il controllo se il command innesca un errore di command non trovato copre solo casi semplici. Ad esempio questa linea sarà sulla storia:

 echo foo; echooo bar 

Ma funziona bene per il tuo esempio

 gut status 

Si prega di notare che il command errato apparirà su UP-ARROW (in modo che tu possa correggerlo!), Ma non è nello stack della storia; controllare con fc -l .

non so come funziona omz, ma in entrambi i bash e il normale prefisso di zsh con uno spazio lo mantiene fuori di .history e quindi anche fuori del completamento automatico / suggerisce

vale a dire

 <space>ll -ahZ /home/%USER