如何使 zsh “正确”功能记住我的拼写更正决定

如何使 zsh “正确”功能记住我的拼写更正决定

我已经启用了更正(我不会称之为自动改正特别是因为这个问题)在 zsh 中通过setopt correct在我的.zshrc.

现在,当我dtae在终端中输入时,我得到:

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

此时我希望 zsh 记住我的决定。因此,下次我输入时,dtae它应该自动更正为date[1]。然而,这并没有发生,zsh 再次询问我该怎么做:

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

[1] 当然,除非当时存在实际的dtae命令或别名。

更新:

我设法修改 zsh 源代码( file utils.c、 function spckword)来创建一个自定义文件,其中包含通过调用 zsh 的“正确”功能自动创建的别名:

原来的:

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

修改的:

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

执行后dtae,将以下行添加到文件中~/.zsh_correct_aliases

alias dtae='date'

但是,我不知道如何~/.zsh_correct_aliases就地获取新修改的文​​件。

答案1

您可以将代码基于定义的内置别名这里

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

(未测试)

并添加source ~/.zsh_correct_aliases到你的.zshrc


编辑:使用源进行测试:

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

它给:

$ 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  

答案2

您可以定义一个来源 ~/.zsh_ Correct_aliases 的 precmd 函数。

相关内容