rpromptをプロンプトの上部に配置する

rpromptをプロンプトの上部に配置する

私は最近zshについて本当に興味を持っていて、自分自身に豪華なヒントを提供していますが、RPROMPTを調整するのに苦労しています。私は次のような結果を得ました。

    | [14:59:44] git:(master)                           |
    | /home/zoey/.oh-my-zsh                             |
    | yes, zoey? :                           2016-05-26 |

ここでは|端末の端を表します。私が望むのは、日付が時間と垂直に揃うことです。場所の面では長いコマンドで簡単に無視できますが、git infoは非常に長くなる可能性はありません。

RPROMPTを垂直方向に移動する方法はありますか? bashに慣れているので、初心者レベルのzshを使用することをお勧めしますが、必要に応じて貼り付け内容をコピーできます。

私が関連する内容は次のとおりです.zshrc

# show all but the last dir in the current path
function trim_pwd
{
    echo $(pwd | sed -e "s:/$::;s:[^/]*$::")
} 
setopt PROMPT_SUBST
# red for error, green for ok
ERRCOL='%(?:%F{green}:%F{red})'
PROMPT='${ERRCOL}[%f%B%F%D{%H:%M:%S}%f%b${ERRCOL}]%f %B$(git_prompt_info)%b
%F{green}%n%f@%F{yellow}%m%f:%F{blue}$(trim_pwd)%B%1/%b%f
%F{magenta}yes, %Bzoey%b?%f : '
RPROMPT='%F%D{%Y-%m-%d}%f'
# update clock per second
TRAPALRM() {
    zle reset-prompt
}
TMOUT=1

すべての書式設定項目を削除し、単純なプロンプトのみを表示すると、次のようになります。

setopt PROMPT_SUBST
PROMPT='[%D{%H:%M:%S}] $(git_prompt_info)
%n@%m:%/
yes, zoey? : '
RPROMPT='%D{%Y-%m-%d}'

編集:これで、可変長プレーンテキストと固定幅カラーテキストを処理できるようになりました。

ERRCOL="%(?:%F{green}:%F{red})"
() {
    left="${ERRCOL}[%F%B%D{%H:%M:%S}%b${ERRCOL}]%f "
    right="%F%D{%Y-%m-%d}%f"
    local bare_left='[00:00:00] '
    local bare_right='0000-00-00'
    local middle_width=$((${COLUMNS}-1-${#bare_left}-${#bare_right}))
    git_prompt_info=$(git_prompt_info)
    middle=${(r:$middle_width:: :)git_prompt_info}
    PROMPT='${left}${middle}${right}'
    PROMPT+=$'\n : '
}

しかし、可変長カラーテキストはgit_prompt_info依然として計算される。私はinvisible交換を試してみました。この回答が、うまくいかないような、または間違って使用しています。

right="%F%D{%Y-%m-%d}%f"
local invisible='%([BSUbfksu]|([FBK]|){*})'
local bare_right=${(S)right//$~invisible}
echo ${(%)bare_right}
echo ${(%)right}

同じカラーラインを2回印刷します。つまり、置換は何もしません。

ベストアンサー1

重要なことは、RPROMPT入力するコマンドと同じ行になければならないことです。複数の行を持つことができるかどうかはわかりませんRPROMPT(いくつかのカーソル移動コマンドを含むものを除く)。複数行プロンプトから最初の行の右側に何かを含めるには、左側のプロンプトに含めます。この変数COLUMNSには端末の幅が含まれます。以下は、より多くの制御のために毎回プロンプトを書き換える関数を使用するアプローチです。 (エスケープのみを使用してターミナル幅にパディングを即座に処理する方法がわかりません%。インライン置換を使用して実行できますが、読み込みや拡張が困難になります。):

setopt prompt_subst
precmd_prompt () {
  git_prompt_info=${(r:$((COLUMNS-22)):: :)$(git_prompt_info)}
  PROMPT="[%D{%H:%M:%S}] %>>$git_prompt_info %D{%Y-%m-%d}"
  PROMPT+=$'\n%n@%m:%/\nyes, zoey? : '
}
precmd_functions+=(precmd_prompt)

プロンプトの構成方法をより細かく制御するには、より多くの部分でプロンプトを構築します。たとえば、上記では時間と日付の長さをハードコーディングしました。これは、幅とパディングを計算するか、それに応じてgit情報を含む中間部分を切り捨てるバリエーションです。今回は、どのように行うかを説明するために、手動で切り取りを行いました。拡張のプロンプト順序。${(%):-STUFF}STUFF

precmd_prompt () {
  PS1_1_left=${(%):-'[%D{%H:%M:%S}] '}
  PS1_1_right=${(%):-' %D{%Y-%m-%d'}
  local middle_width=$((COLUMNS-#PS1_1_left-#PS1_1_right}))
  local git_prompt_info=$(git_prompt_info)
  if ((#git_prompt_info < middle_width)); then
    PS1_1_middle=${(r:$middle_width:: :)git_prompt_info}
  else
    PS1_1_middle=${git_prompt_info:0:$middle_width}
  fi
  PROMPT='${PS1_1_left}${PS1_1_middle}${PS1_1_right}'
  PROMPT+=$'\n%n@%m:%/\nyes, zoey? : '
}

おすすめ記事