zshでセカンダリプロンプトを無効にする

zshでセカンダリプロンプトを無効にする

Enterキーを押す前にzshで引用または複雑なコマンドを正しく完了しないと、PS2で定義されているセカンダリプロンプトを使用して完了するように求められます>

サポートプロンプトを無効にする方法はありますか? PS2の設定を変更するのではなく、フル機能をオフにすることを意味します。オプションの1つが見つかりません。

実際には、コマンドを続行しようとするよりも、私の間違いによって2番目のプロンプトが表示される可能性が高くなります。したがって、構文エラーは補助プロンプトよりも便利です。これは、セカンダリプロンプトが表示されたときに元の行にすぐに戻ることができないためです。

(複数行のコマンドを入力する必要がある場合は、Shift + Enterを使用して新しい行を挿入できます。補助プロンプトとは異なり、zsh行エディタではこの場合は前の行に戻ることができます。)

答え1

これを行うよりクリーンで信頼性の高い方法があるかもしれませんが、ハッカーとして次のようにすることができます。

accept-line() {
  {
    unfunction _al_f_
    functions[_al_f_]=$BUFFER
  } 2> /dev/null
  if (( $+functions[_al_f_] )); then
    zle .$WIDGET
  else
    zle beep
    zle -M "Command unfinished or invalid."
  fi
}
zle -N accept-line

(必要であれば、行を許可する他のウィジェットに対してこれを繰り返します)。

つまり、上記ではaccept-line編集バッファを本文として使用する関数を定義し、失敗した場合はその行を受け入れる代わりにユーザーにエラーを報告します。

エイリアスはに割り当てられても拡張されないため、構文を変更するfunctions[_al_f_]エイリアス(たとえば、a)があるとalias not_before=until問題が発生します。

答え2

サポートプロンプトを無効にするzshプラグインがあります。https://github.com/romkatv/zsh-no-ps2。現在入力したコマンドの形式が正しい場合は、通常どおりEnter実行されます。それ以外の場合は改行文字が挿入されます。

免責事項:私はこのプラグインの作成者です。

関連情報