alinhar rprompt com o início do prompt

5

Recentemente, fiquei muito empolgado com o zsh e me fiz um alerta extravagante, mas estou tentando alinhar meu RPROMPT. Eu tenho uma saída como esta:

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

em que | representa as arestas do terminal. O que eu quero é que a data seja alinhada verticalmente com a hora; como onde está, é propenso a ser sobrescrito por um longo comando, enquanto as informações do git dificilmente ficarão muito longas.

Existe alguma maneira para o deslocamento vertical do RPROMPT? De preferência, algo que é zsh de nível iniciante, como estou acostumado a bater, mas posso copiar e colar coisas, se necessário.

Este é o bit relevante do meu .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

Se eu remover todo o material de formatação e apenas mostrar o prompt simples:

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

Editar: Agora sou capaz de lidar com texto simples de comprimento variável e texto colorido de largura fixa com:

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 : '
}

Mas o texto colorido de comprimento variável em git_prompt_info ainda é contado. Eu tentei usar a substituição invisible de esta resposta , mas parece que não funciona ou estou a usá-lo errado:

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

imprime a mesma linha colorida duas vezes, ou seja, a substituição não faz nada.

    
por Zoey Hewll 26.05.2016 / 09:11

1 resposta

1

O ponto de RPROMPT deve estar na mesma linha que o comando digitado. Eu nem tenho certeza se você pode ter uma multilinha RPROMPT (exceto incluindo alguns comandos de movimento do cursor). Se você quiser um prompt de multilinha com algo à direita das primeiras linhas, inclua isso no prompt da esquerda. A variável COLUMNS contém a largura do terminal. Aqui está uma maneira de fazer isso, que usa uma função para reconstruir o prompt a cada vez para obter mais controle (não vejo de improviso como preencher a largura do terminal com apenas % escapes; isso pode ser feito com substituições incorporadas, mas fica difícil de ler ou estender):

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)

Se você quiser ainda mais controle sobre como o prompt é composto, construa-o a partir de mais partes. Por exemplo, codifiquei a duração e a data acima. Aqui está uma variante que calcula as larguras e blocos ou trunca a parte do meio contendo as informações do git de acordo. Desta vez eu faço o truncamento manualmente para ilustrar como isso pode ser feito. ${(%):-STUFF} expande as sequências de prompt em 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? : '
}
    
por 27.05.2016 / 01:44

Tags