将 rprompt 与提示顶部对齐

将 rprompt 与提示顶部对齐

我最近对 ​​zsh 感到非常兴奋,并让自己成为一个奢侈的提示,但我一直在努力调整我的 RPROMPT。我有这样的输出:

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

其中|代表终端边缘。我想要的是日期与时间垂直对齐;就其所在位置而言,它很容易被长命令覆盖,而 git info 不太可能变得很长。

有什么办法可以让RPROMPT垂直位移吗?最好是初学者级别的 zsh,因为我习惯了 bash,但如果需要的话我可以复制粘贴内容。

这是我的相关内容.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}

将相同颜色的线打印两次,即替换不执行任何操作。

答案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? : '
}

相关内容