Como fazer com que a funcionalidade zsh “correta” lembre minhas decisões de correção ortográfica

24

Eu habilitei a correção (eu não chamaria isso de autocorreção especificamente por causa desse problema) em zsh, ativando setopt correct em meu .zshrc .

Agora, quando digito dtae em um terminal, recebo:

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

Neste ponto, gostaria que o zsh lembrasse da minha decisão. Então, da próxima vez que eu digitar dtae , ele deve corrigir automaticamente para date [1]. No entanto, isso não acontece, e o zsh está novamente me perguntando o que fazer:

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

[1] A menos que, é claro, se nesse momento houver um comando% real dtae ou um apelido.

Atualização:

Eu consegui modificar o código-fonte zsh (arquivo utils.c , função spckword ) para criar um arquivo personalizado contendo os aliases criados automaticamente com a invocação da funcionalidade "correta" do zsh:

original:

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

modificado:

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

Ao executar dtae , a seguinte linha é adicionada ao arquivo ~/.zsh_correct_aliases :

alias dtae='date'

No entanto, não sei como obter o arquivo ~/.zsh_correct_aliases modificado no local.

    
por shrx 31.03.2015 / 11:43

2 respostas

2

Você pode basear seu código no alias interno definido aqui

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

(não testado)

E adicione source ~/.zsh_correct_aliases a você .zshrc

EDIT : testado com a 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  
    
por 08.01.2018 / 00:43
0

Você pode definir uma função precmd que origina ~ / .zsh_correct_aliases.

    
por 12.10.2017 / 14:44