web-dev-qa-db-ja.com

zshの「正しい」機能に私のスペル修正の決定を記憶させる方法

setopt correct.zshrcを有効にすることにより、zshで修正を有効にしました(特にこの問題のため、autocorrectionとは呼びません)。

ここで、ターミナルで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の「正しい」機能の呼び出しで自動的に作成されたエイリアスを含むカスタムファイルを作成するために、zshソースコード(ファイルutils.c、関数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ファイルをインプレースで入手する方法がわかりません。

24
shrx

定義済みの組み込みエイリアスに基づいてコードを作成できます here

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

(未検証)

そしてsource ~/.zsh_correct_aliasesを.zshrcに追加します


[〜#〜] edit [〜#〜]:ソースでテスト:

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
Tristan Gouge

〜/ .zsh_correct_aliasesをソースとするprecmd関数を定義できます。

0
William Hay