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
ファイルをインプレースで入手する方法がわかりません。
定義済みの組み込みエイリアスに基づいてコードを作成できます 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
〜/ .zsh_correct_aliasesをソースとするprecmd関数を定義できます。