Cómo hacer que la funcionalidad zsh "correcta" recuerde mis decisiones de corrección de hechizos

24

He habilitado la corrección (no lo llamaría autocorrección específicamente debido a este problema) en zsh habilitando setopt correcten mi .zshrc.

Ahora, cuando escribo dtaeen una terminal, obtengo:

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

En este punto, me gustaría que zsh recuerde mi decisión. Entonces, la próxima vez que escriba dtae, debería corregirse automáticamente a date[1]. Sin embargo, esto no sucede, y zsh nuevamente me pregunta qué hacer:

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

[1] A menos, por supuesto, si en ese momento existe un dtaecomando o alias real .

Actualizar:

He logrado modificar el código fuente de zsh (archivo utils.c, función spckword) para crear un archivo personalizado que contiene los alias creados automáticamente con la invocación de la funcionalidad "correcta" de 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);
}

Al ejecutar dtae, la siguiente línea se agrega al archivo ~/.zsh_correct_aliases:

alias dtae='date'

Sin embargo, no sé cómo obtener el ~/.zsh_correct_aliasesarchivo recién modificado en el lugar.

shrx
fuente
1
¿Desea que se recuerde solo durante la vida útil del proceso de shell o esa información almacenada en archivos? ¿Debería esa corrección recordada estar disponible de inmediato para todas las instancias de shell actualmente en ejecución? ¿Desea eliminar la corrección recordada cuando se dtaegenera o simplemente deshabilitarla temporalmente?
Stéphane Chazelas
1
@ StéphaneChazelas 1) Lo mejor sería almacenarlo en un solo archivo. 2) Sería un plus, pero no estrictamente necesario. 3) Eliminado hasta que dtaeexista, luego restablecido si / cuando dtaeya no está definido.
shrx
3
Probablemente tendría más sentido llamar a una función de enlace zsh dedicada allí (como un command_not_found_handlerpero en tiempo de análisis en lugar de tiempo de ejecución), y luego implementar la lógica en el código zsh.
Stéphane Chazelas
77
No creo que esto se considere una buena práctica ... Siento que es mucho más eficiente aprender a escribir correctamente.
Peschke
2
Solo tengo curiosidad, al menos para este uso específico, ¿por qué no hacer que el código agregue los alias al final de .zshrc, o de alguna manera haga lo mismo, pero colocando .zsh_correct_aliases en .zshrc? Obscurecer eso con algo de hashing, oscuridad / variables, o mejor, según sea necesario para la seguridad
olaf atchmi

Respuestas:

2

Puede basar su código en el alias incorporado definido aquí

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

(no probado)

Y agregue source ~/.zsh_correct_aliasesa usted .zshrc


EDITAR : probado con fuente:

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

Da:

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

Podría definir una función precmd que genere ~ / .zsh_correct_aliases.

William Hay
fuente