Zshの管理にoh-my-zshとAntigenを使用しています。
誤って間違った/失敗したコマンドをZshに入力することがあり、 zsh-autosuggestionsプラグイン がこれらのコマンドをスローすると非常に煩わしくなります。
たとえば、gut status
ではなくgit status
と入力したとします。
ここで、正しいコマンドをもう一度入力しようとすると、g
と入力すると、自動暗示プラグインはgut status
をスローします。これは、最近の履歴で最も近いものです。しかし、それは失敗したコマンドです!
私がやりたいのは、これらの失敗したコマンドが私の履歴を「汚染」しないようにして、自動暗示プラグインがそれらを提案しないようにすることです。
私はこれを検索しましたが、履歴からエントリを除外するのに最も近いのは、HIST_IGNORE_SPACEを設定する方法、または特定のコマンドを無視する方法、またはコマンドを入力した後に手動で削除する方法です。 this および this を参照してください。しかし、@ Adaephon 52が指摘したように、これは行われますafter証書が実行されます。
私が今考えているのは、失敗したコマンドがZshに入力されるたびにトリガーされる関数を作成して、履歴から最新のエントリを削除することです。ただし、この種のトリガーが存在するかどうか、またはそれを実行する方法を知るには、Zshに精通していません。
この問題に関心のある人にとって、受け入れられた解決策は、失敗したコマンドが履歴ファイルに保存されないという意味で機能します。 fc -l
またはhistory
はこれを確認します。
ただし、zsh-autosuggestionsプラグインは独自のlocal種類のキャッシュを実行しているようです(または他のメカニズムを使用して提案を生成している)ので、失敗したコマンドを提案しますが、onlyセッションが終了していない場合。ユーザーがシェルの新しいインスタンスを開始したとき、おそらくプラグインがキャッシュされた履歴をロードする必要があるとき、失敗したコマンドを提案しなくなりました(もちろん、もう一度入力しない限り)。
提案されたソリューションは技術的に正しいです。私は(誤って)Zshが失敗したコマンドを保存するのを止める答えだけが必要であり、受け入れられたソリューションがそれを行うように質問を組み立てました(限られた方法ではありますが、ソリューションのリンクを参照してください)。詳細)。
シェルスクリプトに精通していて(私はそうではありません)、十分な意欲を持っている人は誰でも zsh-autosuggestionsスクリプト を確認できます。
Bart Schaeferは次のアプローチを提案しましたzshユーザーに関する同じ質問にメーリングリスト:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
この関数は、コマンドラインが履歴に書き込まれる前に実行されます。 1が返される場合、現在のコマンドラインは履歴ファイルにもローカル履歴スタックにも追加されません。ただし、コマンドがコマンドが見つかりませんエラーをトリガーするかどうかのチェックは、単純なケースのみを対象としています。例えば。この行は履歴にあります:
echo foo; echooo bar
しかし、それはあなたの例ではうまくいきます
gut status
間違ったコマンドがUP-ARROW
に表示されますが(修正できるように!)、履歴スタックにはないことに注意してください。 fc -l
で確認してください。
組み込みのfc
コマンドは、履歴の編集をサポートします。入力を間違えた場合(例:前のコマンドでは、次のように入力できます。
$ fc -e nano -1
nano
をお好みのエディターのコマンドに置き換えることができます。また、zsh構成でEDITOR
変数(パラメーター)を設定することもできます。 ( 参照SOページ )を参照)
ファイル(fcによってシステムの一時フォルダーに作成されたファイル)を保存する必要があります。その後、行が編集されます。 Enter
で実行するか、Ctrl+C
を押して編集を終了します。
詳細については、zshのドキュメントを参照してください。 Zsh:編集履歴
$ fc -W; nano "$HISTFILE"; fc -R
...必要に応じて再びnanoを置き換えます
キャッシュを含む履歴を書き出すだけで、エディターでファイルを開きます。
zshは3種類の履歴を知っていることに注意してください。
履歴ファイルが共有されていて( SHARE_HISTORY
)、問題のユーザーで複数のzshシェルを開いている場合は、より適切であることに注意してください。最初にそれらのシェルでfc -W
コマンドを実行します。編集が終了したら、fc -R
を実行します。そうしないと、これらのシェル内に入力されたコマンドが保存されず、HISTFILE
の手動編集が認識されます。