履歴に保存せずにzshでコマンドを実行する方法(「up」キーを使用しても)

履歴に保存せずにzshでコマンドを実行する方法(「up」キーを使用しても)

人々はzshでフックを使用していると言いますpreexecが、正確にどのように使用しますか?私は、すべてのコマンドをチェックして、記録に残したくないコマンドであることを確認できますが、その後は何をすべきですか?

ベストアンサー1

デフォルトでは、zshセッション履歴の最後のコマンドは設定されていても常に保持されますHISTSIZE=0。記録メカニズムをバイパスするために独自のウィジェットを作成できます。

sneaky-run () {   
    echo
    eval $BUFFER
    BUFFER=''
    zle reset-prompt
}

zle -N sneaky-run
bindkey '^X^M' sneaky-run

ウィジェットはsneaky-run現在入力されているコマンドを実行し、コマンドバッファをクリアしてプロンプトをリセットします。ウィジェット内で実行されるコマンドは履歴に追加されません。

echo出力が新しい行から始まるように最初に必要です。複数行のプロンプトがある場合は、各行のecho前にsを追加する必要がありますzle reset-prompt。それ以外の場合、プロンプトはコマンド出力の複数行を上書きする可能性があります。

この例では、sneaky-runキーの組み合わせCtrl+ X、にバインドしますEnter


これに追加のキーの組み合わせを使用したくない場合は、accept-line通常、次のウィジェットをラップすることもできます。Enter

accept-line-with-sneaky () {   
    if [[ "$BUFFER" == "${BUFFER#" } ]] ; then
        zle accept-line
    else
        echo
        eval $BUFFER
        BUFFER=''
        zle reset-prompt
    fi
}

zle -N accept-line-with-sneaky
bindkey '^M' accept-line-with-sneaky

これは設定動作と似ていますHIST_IGNORE_SPACE。コマンドが空白で始まる場合、履歴に追加されません。ただし、withに加えてHIST_IGNORE_SPACE式は使用できませんUp

メモ:ここでは、最も基本的なキーバインディングの1つを扱いますzsh。したがって~/.zshrc

おすすめ記事