Jak sprawić, by funkcja „poprawna” zsh pamiętała moje decyzje dotyczące korekty pisowni

24

Włączyłem korektę (nie nazwałbym tego autokorekcją konkretnie z powodu tego problemu) w zsh, włączając ją setopt correctw moim .zshrc.

Teraz, kiedy piszę dtaew terminalu, otrzymuję:

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

W tym miejscu chciałbym, aby zsh pamiętał moją decyzję. Następnym razem, gdy piszę dtae, powinien automatycznie skorygować na date[1]. Jednak tak się nie dzieje, a zsh ponownie pyta mnie, co mam zrobić:

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

[1] Oczywiście, chyba że w tym czasie istnieje rzeczywiste dtaepolecenie lub alias.

Aktualizacja:

Udało mi się zmodyfikować kod źródłowy zsh (plik utils.c, funkcja spckword), aby utworzyć niestandardowy plik zawierający aliasy utworzone automatycznie przy wywołaniu „poprawnej” funkcjonalności zsh:

oryginalny:

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

zmodyfikowano:

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

Po uruchomieniu dtaedo pliku dodaje się następujący wiersz ~/.zsh_correct_aliases:

alias dtae='date'

Nie wiem jednak, jak uzyskać dostęp do nowo zmodyfikowanego ~/.zsh_correct_aliasespliku w miejscu.

shrx
źródło
1
Czy chcesz, aby był zapamiętywany tylko przez cały czas trwania procesu powłoki, czy te informacje przechowywane w plikach. Czy ta zapamiętana poprawka powinna być natychmiast dostępna dla wszystkich aktualnie uruchomionych instancji powłoki? Czy chcesz, aby zapamiętana poprawka została usunięta po dtaepojawieniu się spawnu, czy tylko tymczasowo wyłączona?
Stéphane Chazelas
1
@ StéphaneChazelas 1) Najlepiej byłoby przechowywać w jednym pliku. 2) Byłby to plus, ale nie absolutnie konieczny. 3) Usunięty, dopóki nie dtaeistnieje, a następnie przywrócony, jeśli / kiedy dtaenie jest już zdefiniowany.
shrx
3
Prawdopodobnie sensowniej byłoby wywołać tam dedykowaną funkcję haka Zsh (jak command_not_found_handlerpodczas analizy zamiast w czasie wykonywania), a następnie zaimplementować logikę w kodzie Zsh.
Stéphane Chazelas
7
Nie uważam tego za dobrą praktykę ... Uważam, że nauka pisania na klawiaturze jest o wiele bardziej efektywna.
Peschke,
2
Jestem ciekawy, przynajmniej dla tego konkretnego zastosowania, dlaczego po prostu kod nie doda aliasów na końcu .zshrc, lub w jakiś sposób zrobi to samo, ale poprzez umieszczenie .zsh_correct_aliases w .zshrc. Przeszkadza to z pewnym haszowaniem, niejasnością / zmiennymi lub lepiej, jeśli jest to potrzebne dla bezpieczeństwa
olaf atchmi

Odpowiedzi:

2

Możesz oprzeć swój kod na wbudowanym tu zdefiniowanym aliasie

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

(nie testowany)

I dodaj source ~/.zsh_correct_aliasesdo ciebie .zshrc


EDYCJA : testowane ze źródłem:

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

To daje:

$ 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
źródło
0

Możesz zdefiniować funkcję precmd, która pobiera ~ / .zsh_correct_aliases.

William Hay
źródło