私はzshとoh-my-zshをインストールしました(以前のシェルはbashでした)。 Myは.zshrc
oh-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