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


24

我已经启用校正(我不会把它自动更正在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
您是否只想在Shell进程的生命周期内记住它,还是将信息存储在文件中?记住的更正是否应该立即可用于所有当前正在运行的Shell实例?您是否希望在dtae生成或暂时禁用时记住的更正删除?
斯特凡Chazelas

1
@StéphaneChazelas1)最好存储在单个文件中。2)这将是一个加号,但并非绝对必要。3)删除直到dtae存在,如果/ dtae不再定义,则将其恢复。
shrx

3
在那儿调用一个专用的zsh钩子函数可能更有意义(例如一个a,command_not_found_handler但在解析时而不是在运行时),然后在zsh代码中实现逻辑。
斯特凡Chazelas

7
我认为这不算是一种好习惯...我觉得学习正确的打字方法效率更高。
Peschke

2
我只是很好奇,至少对于这种特定用途,为什么不只是将代码添加别名到.zshrc的末尾,还是以某种方式做到这一点,而是将.zsh_correct_aliases加入到.zshrc中。使用安全性所需的一些散列,模糊性/变量或更好的方法来
掩盖这种情况

Answers:


2

您可以将代码基于此处定义的内置别名

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  

0

您可以定义一个源于〜/ .zsh_correct_aliases的precmd函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.