zsh履歴から最後のコマンド(またはボーナス用の現在のコマンド)を削除する方法

zsh履歴から最後のコマンド(またはボーナス用の現在のコマンド)を削除する方法

もちろんこれを行う非常に簡単で賢明な方法がありますが、zshellの記録はfcのエイリアスのようです。履歴から行を削除する方法は?

これを行う方法についてのアドバイスはありますか?マイユースケースは、履歴から最後に実行されたコマンドを削除してオートコンプリートを停止することです(主に誤った内容を入力して表示され続ける場合)。

次のようにして最後のコマンドを発行できることを知っています。

history | tail -n 1しかし、History -dは機能しないため、zshの正しいドキュメントが見つかりません。

答え1

Zshは真の履歴編集機能を提供しません。コマンド履歴はデフォルトで読み取り専用です。あなたができることは、それを卸売に置き換えることだけです。

コマンド履歴の編集:

  1. ファイルに保存します。fc -W
  2. ファイルの編集
  3. ファイルから履歴を読み込む:fc -R

設定でファイル名を選択できますHISTFILE

テストされていないコード:

remove_last_history_entry () {
  setopt local_options extended_history no_hist_save_no_dups err_return
  
  local HISTFILE=~/.zsh_history_tmp_$$ SAVEHIST=$HISTSIZE
  fc -W
  ed -s $HISTFILE <<EOF >/dev/null
d
w
q
EOF
  fc -R
}

答え2

通常、行を削除できますが~/.zsh_history見つからない場合は、~/.zshrc履歴ファイルの場所を探してください。

次に、目的のテキストエディタを使用して問題のある行を削除します。または、ファイル全体を削除し、すべてのzshインスタンスを閉じて新しいインスタンスを起動します。歴史はすっきりクリアされます!

答え3

はい、これは古いトピックですが、これらの質問のどれも私の質問への答えではないので、これを見つけるために長い時間を費やしました!

私の解決策は次のとおりです。 @Gillesに感謝します。「fc -R」と「fc -W」の使用に関するヒント:)。

以下のスクリプトを.zshrcファイルに貼り付けます。

source.zshrcを使用してリロード

その後、「forget」と入力して最後のコマンドを忘れてください。 :D。最後の3つのコマンドを忘れるには、「forget 3」と入力してください。セクシーなチーグルチーグル。

上矢印を押すと、最後のコマンドに直接移動し、「forget」という単語も記憶されません。 :).

修正する:これで、すべてのディレクトリで動作するようにデフォルトパスを追加しました。ハハ。

アップデート2:忘れたい最後のコマンドの数を渡す機能が追加されました:D。最後の2つのコマンドを忘れるには、「forget2」を試してください。 :D。

# Put a space at the start of a command to make sure it doesn't get added to the history.
setopt histignorespace

alias forget=' my_remove_last_history_entry' # Added a space in 'my_remove_last_history_entry' so that zsh forgets the 'forget' command :).

# ZSH's history is different from bash,
# so here's my fucntion to remove
# the last item from history.
my_remove_last_history_entry() {
    # This sub-function checks if the argument passed is a number.
    # Thanks to @yabt on stackoverflow for this :).
    is_int() ( return $(test "$@" -eq "$@" > /dev/null 2>&1); )

    # Set history file's location
    history_file="${HOME}/.zsh_history"
    history_temp_file="${history_file}.tmp"
    line_cout=$(wc -l $history_file)

    # Check if the user passed a number,
    # so we can delete x lines from history.
    lines_to_remove=1
    if [ $# -eq 0 ]; then
        # No arguments supplied, so set to one.
        lines_to_remove=1
    else
        # An argument passed. Check if it's a number.
        if $(is_int "${1}"); then
            lines_to_remove="$1"
        else
            echo "Unknown argument passed. Exiting..."
            return
        fi
    fi

    # Make the number negative, since head -n needs to be negative.
    lines_to_remove="-${lines_to_remove}"

    fc -W # write current shell's history to the history file.

    # Get the files contents minus the last entry(head -n -1 does that)
    #cat $history_file | head -n -1 &> $history_temp_file
    cat $history_file | head -n "${lines_to_remove}" &> $history_temp_file
    mv "$history_temp_file" "$history_file"

    fc -R # read history file.
}

ここで何かが起こっています。このコマンドを使用すると、コマンドの前にスペースを入力でき、履歴に追加されません。

setopt histignorespace

したがって、スペースバーを押してから「echo hi」と入力し、Enterキーを押して上矢印を押すと、「echo hi」は履歴にありません。 :)

エイリアス "forget" には my_remove_last_history_entry の前にスペースがあります。このように、zshは「忘却」を記録に保存しません。

機能説明

ZSH は fc を使用して履歴やその他の項目を記録するため、「fc -W」を使用して現在のコマンドを履歴ファイルに記録し、「head -n -1」を使用してファイルから最後のコマンドを削除します。この出力を一時ファイルに保存し、元の履歴ファイルを一時ファイルに置き換えます。最後に、fc -Rを使用して履歴を再ロードします。

ところで、この関数に問題がありましたが、これはエイリアシングで解決されました。

名前で関数を実行すると、関数呼び出しである最後のコマンドが削除されます。そのため、zshがこの関数名を履歴ファイルに追加しないようにエイリアスを使用し、スペースで呼び出して最後の項目を必要なものにします。 :D。

答え4

@pandagoespoopの単純化されたバージョンを使用してください。 回答、それは私にとってうまくいきます(制限:Linuxでは1行コマンドの場合)。

1つの重要な修正は、新しく作成された履歴ファイルに対する権限を制限することです。デフォルト権限を持つ新しいファイルにリダイレクトすると、グループや他の人が履歴を読むことができます。だから私は次のように付け加えました。

chmod 600 $history_temp_file

完全なコード:

setopt hist_ignore_space

alias forget=" forget_last_history_entry"
forget_last_history_entry() {
    history_file="${HISTFILE:-${HOME}/.zsh_history}"
    history_temp_file="${history_file}.tmp"

    fc -W # write current shell's history to the history file.

    # Get the files contents minus the last entry(head -n -1 does that)
    head -n -1 $history_file > $history_temp_file
    chmod 600 $history_temp_file
    mv "$history_temp_file" "$history_file"

    fc -R # read history file.
}

そんな評判を得たら、コメントしていただろう。

関連情報