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}

동일한 색상 라인을 두 번 인쇄합니다. 즉, 대체는 아무 작업도 수행하지 않습니다.

답변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? : '
}

관련 정보