![如何使 zsh “正确”功能记住我的拼写更正决定](https://linux22.com/image/62230/%E5%A6%82%E4%BD%95%E4%BD%BF%20zsh%20%E2%80%9C%E6%AD%A3%E7%A1%AE%E2%80%9D%E5%8A%9F%E8%83%BD%E8%AE%B0%E4%BD%8F%E6%88%91%E7%9A%84%E6%8B%BC%E5%86%99%E6%9B%B4%E6%AD%A3%E5%86%B3%E5%AE%9A.png)
我已经启用了更正(我不会称之为自动改正特别是因为这个问题)在 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 函数。