zshを「正しい」機能にする方法は、スペル修正の決定を覚えています

zshを「正しい」機能にする方法は、スペル修正の決定を覚えています

修正機能を有効にしました(電話をかけません)自動修正特にこの問題のため)setopt correct私の.zshrc

端末に入力するとdtae、次の結果が表示されます。

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

この時点でzshが私の決定を覚えていることを願っています。したがって、次の入力時に自動的に[1]dtaeに変更する必要があります。dateしかし、これは起こらず、zshは私に何をすべきかを尋ねました。

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

[1] もちろん、dtae当時実際のコマンドやエイリアスが存在しない限り。

修正する:

zshの「正しい」機能を呼び出して、自動的に生成されたエイリアスを含むカスタムファイルを生成するようにzshソースコード(file utils.c、function)を修正しました。spckword

オリジナル:

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関数を定義できます。

関連情報