zleリセットプロンプトは、矢印キーを使用して検索履歴を防止します。

zleリセットプロンプトは、矢印キーを使用して検索履歴を防止します。

私はzshとoh-my-zshをインストールしました(以前のシェルはbashでした)。 Myは.zshrcoh-my-zshのデフォルト設定をまったく変更しませんでした。 「git」プラグインのみが有効になります(デフォルトでは有効)。

私は以下を使用して非常に簡単なテーマを作成しました。この技術:

setopt PROMPT_SUBST
PROMPT='[%D{%L:%M:%S}] '
TMOUT=1
TRAPALRM() {
  zle reset-prompt
}

このテーマを有効にした後、上下の矢印キーが私の記録を正しく覚えていないことがわかりました。

  • 予想通り、上矢印を一度押すと、最新のコマンドが呼び出されます。
  • 上矢印を2回押すと何も起こりません。私は最も近い次の注文が回収されると予想します。
  • 上矢印を最初に押し、次に下矢印を押しても何も起こりません。プロンプトが私が開始した空のプロンプトに戻ることを望みます。

私が.zshrc使うならただ上記のスクリプトの内容(デフォルトではテーマのプロンプト設定を使用しますが、oh-my-zshを無効にする)の上下の矢印は期待どおりに機能します。

oh-my-zshに戻ってタイトルの行を.zshrcコメントアウトすると、記録zle reset-promptは正しく機能します(ただし、時計はもう存在しません)。

zle reset-prompt上下の矢印が異なる動作をせずにoh-my-zshを同時に使用できる方法は何ですか?これはoh-my-zshのバグですか、それとも間違った設定ですか?

答え1

代わりにこの機能を使用できます。

TRAPALRM() {
    case "$WIDGET" in
        expand-or-complete|self-insert|up-line-or-beginning-search|down-line-or-beginning-search|backward-delete-char|.history-incremental-search-backward|.history-incremental-search-forward)
            :
            ;;

        *)
            zle reset-prompt
            ;;
    esac
}

zle reset-promptデフォルトでは、WIDGETシャーシの内部ではない場合にのみ実行されます。ウィジェットのリストを追加してreset-prompt分離を無視できます。|

問題は、TMOUTシェルのタイムアウトが実際に指定されることです。シェルがタイムアウトした場合は、シグナルを送信SIGALRMしてシェルを終了します。この関数は、定義された関数の実行中に信号をTRAPALRM()捕捉し、終了を傍受します。SIGALRM

上下の矢印は動作が変わらず、代わりにプロンプ​​トがリセットされたときに実行されるため、動作は奇妙です。上記の機能は、履歴を入力またはスクロールしても実行されず、zle reset-prompt遅延を排除します。唯一の欠点は、ウィジェットの外部でアクション(ウィジェットをENTERトリガーするボタンを押すなど)を実行するまで入力したときにプロンプ​​トが更新されないことです。accept-line

関連情報