web-dev-qa-db-ja.com

失敗したコマンドをZshに保存しないようにする方法

問題

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スクリプト を確認できます。

12
lightalchemist

Bart Schaeferは次のアプローチを提案しましたzshユーザーに関する同じ質問にメーリングリスト:

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

この関数は、コマンドラインが履歴に書き込まれる前に実行されます。 1が返される場合、現在のコマンドラインは履歴ファイルにもローカル履歴スタックにも追加されません。ただし、コマンドがコマンドが見つかりませんエラーをトリガーするかどうかのチェックは、単純なケースのみを対象としています。例えば。この行は履歴にあります:

echo foo; echooo bar

しかし、それはあなたの例ではうまくいきます

gut status

間違ったコマンドがUP-ARROWに表示されますが(修正できるように!)、履歴スタックにはないことに注意してください。 fc -lで確認してください。

12
mpy

組み込みのfcコマンドは、履歴の編集をサポートします。入力を間違えた場合(例:前のコマンドでは、次のように入力できます。

$ fc -e nano -1

nanoをお好みのエディターのコマンドに置き換えることができます。また、zsh構成でEDITOR変数(パラメーター)を設定することもできます。 ( 参照SOページを参照)

ファイル(fcによってシステムの一時フォルダーに作成されたファイル)を保存する必要があります。その後、行が編集されます。 Enterで実行するか、Ctrl+Cを押して編集を終了します。

詳細については、zshのドキュメントを参照してください。 Zsh:編集履歴


履歴全体を編集したい場合

$ fc -W; nano "$HISTFILE"; fc -R

...必要に応じて再びnanoを置き換えます

キャッシュを含む履歴を書き出すだけで、エディターでファイルを開きます。

zshは3種類の履歴を知っていることに注意してください。

  • 内部:ログイン以降に入力したコマンド
  • ローカル:アクティブなシェル内で使用可能なもの-[HISTFILE +内部]
  • "グローバル":依存しますが、HISTFILEに設定されたファイルだとしましょう

履歴ファイルが共有されていて( SHARE_HISTORY )、問題のユーザーで複数のzshシェルを開いている場合は、より適切であることに注意してください。最初にそれらのシェルでfc -Wコマンドを実行します。編集が終了したら、fc -Rを実行します。そうしないと、これらのシェル内に入力されたコマンドが保存されず、HISTFILEの手動編集が認識されます。

0
Geck0