Come fare in modo che la funzionalità "corretta" di zsh ricordi le mie decisioni di correzione degli incantesimi


24

Ho abilitato la correzione (non la chiamerei correzione automatica specificamente a causa di questo problema) in zsh abilitando setopt correctnel mio .zshrc.

Ora, quando scrivo dtaeun terminale, ottengo:

dtae        
zsh: correct 'dtae' to 'date' [nyae]? y
Tue Mar 31 11:39:31 CEST 2015

A questo punto vorrei che zsh ricordasse la mia decisione. Quindi la prossima volta che scrivo dtaedovrebbe automaticamente correggere su date[1]. Tuttavia, ciò non accade e zsh mi chiede di nuovo cosa fare:

dtae
zsh: correct 'dtae' to 'date' [nyae]?

[1] A meno che, ovviamente, se in quel momento esista un dtaecomando o un alias reale .

Aggiornare:

Sono riuscito a modificare il codice sorgente zsh (file utils.c, funzione spckword) per creare un file personalizzato contenente gli alias creati automaticamente con l'invocazione della funzionalità "corretta" di zsh:

originale:

if (x == 'y' || x == ' ' || x == '\t') 
{
    *s = dupstring(best);
    if (hist)
    hwrep(best);
}

modificata:

if (x == 'y' || x == ' ' || x == '\t')
{
    char *aliaspath = getenv("HOME");
    strcat(aliaspath, "/.zsh_correct_aliases");
    FILE *out = fopen(aliaspath, "ab+");
    fprintf(out, "alias %s=\'", *s);
    *s = dupstring(best);
    fprintf(out, "%s\'\n", *s);
    fclose(out);
    if (hist)
    hwrep(best);
}

Al momento dell'esecuzione dtae, la seguente riga viene aggiunta al file ~/.zsh_correct_aliases:

alias dtae='date'

Tuttavia, non so come ottenere il ~/.zsh_correct_aliasesfile appena modificato sul posto.


1
Vuoi che venga ricordato solo per la durata del processo della shell o per quelle informazioni archiviate nei file. Quella correzione ricordata dovrebbe essere immediatamente disponibile per tutte le istanze di shell attualmente in esecuzione? Vuoi che la correzione memorizzata venga rimossa quando viene dtaegenerata o semplicemente disabilitata temporaneamente?
Stéphane Chazelas,

1
@ StéphaneChazelas 1) Archiviato in un singolo file sarebbe il migliore. 2) Sarebbe un vantaggio, ma non strettamente necessario. 3) Rimosso fino a quando non dtaeesiste, quindi ripristinato se / quando dtaenon è più definito.
Shrx

3
Probabilmente avrebbe più senso chiamare lì una funzione hook zsh dedicata (come un command_not_found_handlerma al momento dell'analisi invece del runtime), e quindi implementare la logica nel codice zsh.
Stéphane Chazelas,

7
Non penso che questa sia considerata una buona pratica ... Penso che sia molto più efficiente imparare a digitare correttamente.
Peschke,

2
Sono solo curioso, almeno per questo uso specifico, perché non solo il codice aggiunge gli alias alla fine di .zshrc, o in qualche modo lo fa ma citando .zsh_correct_aliases in .zshrc. Oscurandolo con un po 'di hashing, oscurità / variabili, o meglio, secondo necessità per la sicurezza
olaf atchmi

Risposte:


2

È possibile basare il codice sull'alias integrato definito qui

HashTable ht = aliastab;
ht->addnode(ht, ztrdup(wrong_value),
            createaliasnode(ztrdup(right_value), 0));

(non testato)

E aggiungi source ~/.zsh_correct_aliasesa te .zshrc


EDIT : testato con fonte:

char *aliaspath = getenv("HOME");
strcat(aliaspath, "/.zsh_correct_aliases");

FILE *out = fopen(aliaspath, "ab+");
fprintf(out, "alias %s=\'", *s);

HashTable ht = aliastab;
ht->addnode(ht, ztrdup(*s),
    createaliasnode(ztrdup(best), 0));

*s = dupstring(best);
fprintf(out, "%s\'\n", *s);
fclose(out);
if (hist)
    hwrep(best);

Dà:

$ setopt correct 
$ dtea    
zsh: correct 'dtea' to 'date' [nyae]? y
lun. janv.  8 01:03:55 CET 2018  
$ alias  
dtea=date
$ dtea    
lun. janv.  8 01:07:42 CET 2018  

0

È possibile definire una funzione precmd che genera ~ / .zsh_correct_aliases.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.