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.


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  

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.