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の「正しい」機能の呼び出しで自動的に作成されたエイリアスを含むカスタムファイルを作成するために、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
シェルプロセスの存続期間だけ記憶するか、その情報をファイルに保存しますか。その記憶された修正は、現在実行中のすべてのシェルインスタンスですぐに利用可能になりますか?dtaeスポーンが存在するか、一時的に無効になったときに、記憶された修正を削除しますか?
ステファンシャゼル

1
@StéphaneChazelas1)単一のファイルに保存するのが最適です。2)プラスになりますが、厳密には必要ありません。3)dtae存在するまで削除され、その後、dtae定義されていない場合は復元されます。
shrx

3
専用のzshフック関数を呼び出して(command_not_found_handler実行時ではなく解析時のように)、zshコードでロジックを実装する方がおそらく理にかなっています。
ステファンシャゼル

7
これは良い習慣だとは思わない...正しくタイプする方法を学ぶ方がはるかに効率的だと思う。
ペシュケ

2
少なくともこの特定の用途については、コードにエイリアスを.zshrcの最後に追加させるのではなく、どうにかして.zsh_correct_aliasesを.zshrcに追加するのではないのか、私は興味があります。セキュリティのため、必要に応じて、いくつかのハッシュと、曖昧/変数、またはより良いことObscursing
atchmiオラフ

回答:


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  

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.