Comment faire en sorte que la fonctionnalité zsh «correcte» se souvienne de mes décisions de correction orthographique

24

J'ai activé la correction (je n'appellerais pas cela la correction automatique en raison de ce problème) dans zsh en activant setopt correctdans mon .zshrc.

Maintenant, quand je tape dtaedans un terminal, j'obtiens:

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

À ce stade, je voudrais que zsh se souvienne de ma décision. Donc, la prochaine fois que je tape, dtaeil devrait automatiquement se corriger en date[1]. Cependant, cela ne se produit pas, et zsh me demande à nouveau quoi faire:

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

[1] Sauf, bien sûr, s'il existe à ce moment-là une dtaecommande ou un alias réel .

Mise à jour:

J'ai réussi à modifier le code source zsh (fichier utils.c, fonction spckword) pour créer un fichier personnalisé contenant les alias créés automatiquement avec l'invocation de la fonctionnalité "correcte" de zsh:

original:

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

modifié:

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);
}

Lors de l'exécution dtae, la ligne suivante est ajoutée au fichier ~/.zsh_correct_aliases:

alias dtae='date'

Cependant, je ne sais pas comment trouver le ~/.zsh_correct_aliasesfichier nouvellement modifié sur place.

shrx
la source
1
Voulez-vous qu'il ne soit mémorisé que pour la durée de vie du processus shell ou pour les informations stockées dans des fichiers. Cette correction mémorisée doit-elle être immédiatement disponible pour toutes les instances de shell en cours d'exécution? Souhaitez-vous que la correction mémorisée soit supprimée lors de son dtaeapparition ou simplement désactivée temporairement?
Stéphane Chazelas
1
@ StéphaneChazelas 1) Stocké dans un seul fichier serait le mieux. 2) Ce serait un plus, mais pas strictement nécessaire. 3) Supprimé jusqu'à ce qu'il dtaeexiste, puis rétabli si / quand dtaen'est plus défini.
shrx
3
Il serait probablement plus judicieux d'y appeler une fonction de crochet zsh dédiée (comme un command_not_found_handlermais au moment de l'analyse au lieu de l'exécution), puis d'implémenter la logique dans le code zsh.
Stéphane Chazelas
7
Je ne pense pas que cela soit considéré comme une bonne pratique ... Je pense qu'il est beaucoup plus efficace d'apprendre à taper correctement.
Peschke
2
Je suis juste curieux, pour cette utilisation spécifique au moins, pourquoi ne pas simplement ajouter les alias à la fin de .zshrc, ou faire de même d'une manière ou d'une autre, mais en plaçant .zsh_correct_aliases dans .zshrc. Obscurcir cela avec du hachage, de l'obscurité / des variables, ou mieux, au besoin pour la sécurité
olaf atchmi

Réponses:

2

Vous pouvez baser votre code sur l'alias intégré défini ici

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

(pas testé)

Et ajoutez source ~/.zsh_correct_aliasesà vous .zshrc


EDIT : testé avec la source:

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);

Il donne:

$ 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  
Tristan Gouge
la source
0

Vous pouvez définir une fonction precmd qui source ~ / .zsh_correct_aliases.

William Hay
la source