
問題
私は oh-my-zsh と Antigen を使用して Zsh を管理しています。
時々、Zshに間違ったコマンドや失敗したコマンドを入力してしまうことがあります。zsh-autosuggestions プラグインこれらのコマンドを表示します。
たとえば、
gut status
ではなく と入力したとしますgit status
。
ここで、もう一度正しいコマンドを入力しようとすると、 と入力するとg
、自動提案プラグインは、これが最近の履歴で最も近い一致であると表示しますgut status
。しかし、これは失敗したコマンドです。
私がやりたいことは、これらの失敗したコマンドが私の履歴を「汚染」しないようにすることですそのため、自動提案プラグインはそれらを提案しません。
私がしたこと
これについて調べたところ、履歴からエントリを除外するのに最も近いのは、HIST_IGNORE_SPACEを設定するか、特定のコマンドを無視するか、入力後に手動でコマンドを削除する方法です。これそしてこれしかし、@Adaephon 52が指摘したように、これは後行為は完了しました。
私が検討していること
私が今考えているのは、失敗したコマンドが Zsh に入力されるたびにトリガーされ、履歴から最新のエントリを削除する関数を作成することです。ただし、私は Zsh に十分精通していないため、このようなトリガーが存在するかどうか、またそれをどのように実行すればよいかはわかりません。
承認された解決策に関する注記
この問題に関心のある人にとって、受け入れられている解決策は、失敗したコマンドが履歴ファイルに保存されないという意味で機能します。fc -l
またはhistory
これを確認します。
しかし、zsh-autosuggestionsプラグインは独自の地元キャッシュのような機能(または他のメカニズムを使用して提案を生成している)があるため、失敗したコマンドも提案されますが、セッションが終了していない場合のみユーザーがシェルの新しいインスタンスを開始すると、プラグインはキャッシュされた履歴を読み込む必要があると思われるため、失敗したコマンドは提案されなくなります (もちろん、再度入力しない限り)。
提案された解決策は技術的には正しいです。なぜなら、私は(誤って)質問の枠組みの中で、Zsh が失敗したコマンドを保存しないようにする回答のみを要求するようにしたからです。受け入れられた解決策はそれを実行します(ただし、限定的な方法です。詳細については、解決策のリンクを参照してください)。
シェルスクリプトに精通していて(私は知りませんが)、やる気のある人は、zsh-autosuggestions スクリプト。
答え1
バート・シェーファー以下のアプローチを提案した同じ質問に対してzsh ユーザーメーリングリスト:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
この関数は、コマンドラインが履歴に書き込まれる前に実行されます。1を返した場合、現在のコマンドラインは履歴ファイルにもローカル履歴スタックにも追加されません。ただし、コマンドがトリガーされるかどうかのチェックは、コマンドが見つかりませんエラーは単純なケースのみをカバーします。たとえば、次の行が履歴に表示されます。
echo foo; echooo bar
しかし、あなたの例ではうまく機能します
gut status
間違ったコマンドは に表示されますがUP-ARROW
(修正できます)、履歴スタックには含まれていないので、 で確認してくださいfc -l
。
この基本関数の拡張として、コマンドラインで環境変数を設定することが考えられます。たとえば、 のようにDEBUG=1 ./some_prog
。ここで、関数はコマンドラインの単語に等号が含まれているかどうかを確認し、含まれている場合は次の単語が有効なコマンドかどうかを確認します。
zshaddhistory() {
local j=1
while ([[ ${${(z)1}[$j]} == *=* ]]) {
((j++))
}
whence ${${(z)1}[$j]} >| /dev/null || return 1
}
答え2
組み込みfc
コマンドは履歴の編集をサポートします。たとえば、前のコマンドを誤って入力した場合は、次のように入力できます。
$ fc -e nano -1
nano
お好みのエディタのコマンドに置き換えることができます。また、 EDITOR
zsh 設定で変数 (パラメータ) を設定することもできます。(参照SOページを参照)
ファイルを保存する必要があります (fc によってシステムの一時フォルダーに作成されたファイル)。その後、編集された行が完成します。Enter
それを実行するか、 を押してCtrl+C
編集を終了できます。
詳細については、zsh のドキュメントを参照してください。Zsh: 編集履歴
履歴全体を編集したい場合
$ fc -W; nano "$HISTFILE"; fc -R
...必要に応じてnanoを置き換えてください
キャッシュを含む履歴を書き出し、ファイルをエディターで開くだけです。
その点に注意してください翻訳3 種類の歴史を知っています:
- 内部: ログイン後に入力したコマンド
- 地元: アクティブなシェル内で利用可能なもの - [HISTFILE + 内部]
- "グローバル": それは状況によりますが、HISTFILEに設定されているファイルだとしましょう
履歴ファイルが共有された場合(SHARE_HISTORY
) で、問題のユーザーで複数の zsh シェルを開いている場合は、fc -W
まずそれらのシェルで コマンドを実行したほうがよいでしょう。編集が完了したら を実行しますfc -R
。そうしないと、それらのシェルで入力したコマンドは保存されず、 の手動編集が認識されませんHISTFILE
。
答え3
omz がどのように実行するかはわかりませんが、bash と通常の zsh の両方でスペースをプレフィックスとして付けると、.history から除外され、それ以降は自動補完/提案からも除外されます。
つまり
<space>ll -ahZ /home/%USER