0

できる限り多くの情報を提供する非常にシンプルな (1 文字の) プロンプトを作成しようとしています。これが私が現時点で持っているものです(何年も前から持っていたので、オリジナルをどこで見つけたか思い出せません):

# RPS1="['%1v', '%2v', '%3v', '%4v', '%5v', '%6v', '%7v', '%8v', '%9v']" # debug
PS1=" %(?|%2F|%1F)%1(V|%1v|%(#|#|:))%(?|%2f|%1f) "

function zle-line-init {
  zle -K vicmd
}
zle -N   zle-line-init

function zle-keymap-select {
  psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
  zle reset-prompt
  psvar[1]=""
}
zle -N   zle-keymap-select

これはかなり単純です。レンダリング時にプロンプ​​トをコマンド モードに初期化:し、vi の「コマンド」モードのときはプロンプトを表示し、vi の「挿入」モードのときは>(を変更して) プロンプトを表示します。psvar[1]また、root として行動している場合:は に置き換えられ、文字の色は最後のコマンドの終了ステータスを示します。#

私の問題:

キーマップが変更されると (つまり、例として「コマンド」モードと「挿入」モードを切り替えてからaエスケープ キーを押すと、$?終了ステータスが成功0ステータスで上書きされ、プロンプトが表示されます。赤ではなく緑で (前のコマンドが失敗した場合でも) の%(?|…|…)部分がシェルに送信され$PS1た最後のコマンドの終了ステータスを適切に表示するように、プロンプトを保存または設定するにはどうすればよいですか?

4

3 に答える 3

1

zsh-usersメーリング リストで Bart Schaefer から次の回答を得ました。できます!

これは 2010 年 7 月に修正されたため、最終的には何もする必要はありません。

   * users/15217: Src/Zle/zle_main.c: use top-level status when redrawing prompt.

それまでの間、これを試してください:

function zle-keymap-select { local Q=$? psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}" ($Q を返す) zle reset-prompt psvar[1]="" }

zsh が無名関数を持つのに十分なほど新しい場合は、サブシェル(return $Q)を に置き換えることができます(){ return $Q }

于 2011-02-11T16:45:20.710 に答える
0
function zle-keymap-select {
  local saved_exitcode=$?
  psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
  zle reset-prompt
  psvar[1]=""
  return $saved_exitcode
}
于 2011-02-11T06:34:43.007 に答える
0
oldexitcode=$?
∶
# do stuff...
∶
( exit $oldexitcode )
于 2011-02-11T11:21:37.153 に答える