Como tornar a funcionalidade "correta" do zsh lembrar minhas decisões de correção ortográfica

24

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

Agora, quando digito dtaeum terminal, recebo:

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

Neste ponto, eu gostaria que o zsh se lembrasse da minha decisão. Então, da próxima vez que eu digitar, dtaeele 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 exista um dtaecomando ou apelido real .

Atualizar:

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

Na execução dtae, a seguinte linha é adicionada ao arquivo ~/.zsh_correct_aliases:

alias dtae='date'

No entanto, não sei como obter o ~/.zsh_correct_aliasesarquivo recém-modificado no local.

shrx
fonte
11
Deseja que ele seja lembrado apenas pelo tempo de vida do processo do shell ou pelas informações armazenadas nos arquivos. Essa correção lembrada deve estar imediatamente disponível para todas as instâncias de shell atualmente em execução? Deseja que a correção lembrada seja removida quando dtaesurgir ou apenas desativada temporariamente?
Stéphane Chazelas
11
@ StéphaneChazelas 1) Armazenado em um único arquivo seria o melhor. 2) Seria uma vantagem, mas não estritamente necessário. 3) Removido até dtaeexistir, depois restabelecido se / quando dtaenão estiver mais definido.
shrx 31/03
3
Provavelmente faria mais sentido chamar uma função de gancho zsh dedicada (como uma command_not_found_handlermas em tempo de análise em vez de tempo de execução) e, em seguida, implementar a lógica no código zsh.
Stéphane Chazelas
7
Não acho que isso seja considerado uma boa prática ... Sinto que é muito mais eficiente aprender a digitar corretamente.
Peschke
2
Estou curioso, pelo menos para esse uso específico, por que o código não adiciona os alias ao final de .zshrc ou de alguma forma faz o mesmo, mas cita .zsh_correct_aliases em .zshrc. Obscursing que com algumas hashing, obscuridade / variáveis, ou melhor, conforme necessário para a segurança
olaf atchmi

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_aliasesa você .zshrc


EDIT : testado com 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  
Tristan Gouge
fonte
0

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

William Hay
fonte