Wie man die zsh-Funktionalität „korrekt“ macht, merkt sich meine Entscheidungen zur Rechtschreibkorrektur

24

Ich habe die Korrektur (ich würde sie wegen dieses Problems nicht als Autokorrektur bezeichnen ) in zsh aktiviert, indem setopt correctich sie in my aktiviere .zshrc.

Wenn ich jetzt dtaeein Terminal eintippe, erhalte ich:

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

An dieser Stelle möchte ich, dass sich zsh an meine Entscheidung erinnert. Wenn ich das nächste Mal tippe dtae, sollte es automatisch auf date[1] korrigiert werden . Dies geschieht jedoch nicht, und zsh fragt mich erneut, was ich tun soll:

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

[1] Es sei denn natürlich, zu diesem Zeitpunkt existiert ein tatsächlicher dtaeBefehl oder Alias.

Aktualisieren:

Ich habe es geschafft, den zsh-Quellcode (Datei utils.c, Funktion spckword) so zu ändern , dass eine benutzerdefinierte Datei erstellt wird, die die Aliase enthält, die beim Aufrufen der "richtigen" Funktionalität von zsh automatisch erstellt werden:

Original:

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

geändert:

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

Bei der Ausführung dtaewird die folgende Zeile zur Datei hinzugefügt ~/.zsh_correct_aliases:

alias dtae='date'

Ich weiß jedoch nicht, wie ich die neu geänderte ~/.zsh_correct_aliasesDatei direkt importieren soll.

shrx
quelle
1
Möchten Sie, dass es nur für die Lebensdauer des Shell-Prozesses oder für die in Dateien gespeicherten Informationen gespeichert wird? Sollte diese gespeicherte Korrektur sofort für alle derzeit ausgeführten Shell-Instanzen verfügbar sein? Möchten Sie, dass die gespeicherte Korrektur entfernt wird, wenn dtaeSpawns vorhanden sind oder nur vorübergehend deaktiviert werden?
Stéphane Chazelas
1
@ StéphaneChazelas 1) In einer einzigen Datei gespeichert wäre am besten. 2) Es wäre ein Plus, aber nicht unbedingt notwendig. 3) dtaeWurde entfernt, bis vorhanden, dann wiederhergestellt, wenn dtaenicht mehr definiert ist.
shrx
3
Es wäre wahrscheinlich sinnvoller, dort eine dedizierte zsh-Hook-Funktion aufzurufen (wie z. B. eine, command_not_found_handleraber zur Analysezeit statt zur Laufzeit) und dann die Logik in zsh-Code zu implementieren.
Stéphane Chazelas
7
Ich glaube nicht, dass dies eine gute Übung ist. Ich finde, es ist viel effizienter zu lernen, wie man richtig schreibt.
Peschke,
2
Ich bin nur neugierig, zumindest für diese spezielle Verwendung, warum nicht einfach den Code dazu bringen, die Aliase an das Ende von .zshrc anzuhängen, oder das selbe irgendwie zu tun, indem .zsh_correct_aliases in .zshrc cating. Verschleiert das mit etwas Hashing, Obscurity / Variablen oder besser, wie es für die Sicherheit benötigt wird
olaf atchmi

Antworten:

2

Sie können Ihren Code auf den hier definierten integrierten Alias ​​stützen

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

(nicht getestet)

Und füge source ~/.zsh_correct_aliasesdir .zshrc hinzu


EDIT : getestet mit Quelle:

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

Es gibt:

$ 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
quelle
0

Sie könnten eine Precmd-Funktion definieren, die ~ / .zsh_correct_aliases liefert.

William Hay
quelle