Meu cursor está no início do meu prompt bash. Alguma idéia por quê?

2

Estou usando uma versão ligeiramente modificada do .bashrc de Gary Bernhardt (destroyallsoftware.com) com homebrew bash 3.2.51.

    #  . ~/bin/bash_colors.sh
    . ~/bin/colorize.sh

[... snipped ...]

    # Git prompt components
    function minutes_since_last_commit {
        now='date +%s'
        last_commit='git log --pretty=format:'%at' -1'
        seconds_since_last_commit=$((now-last_commit))
        minutes_since_last_commit=$((seconds_since_last_commit/60))
        echo $minutes_since_last_commit
    }
    grb_git_prompt() {
        local g="$(__gitdir)"
        if [ -n "$g" ]; then
            local MINUTES_SINCE_LAST_COMMIT='minutes_since_last_commit'
            if [ "$MINUTES_SINCE_LAST_COMMIT" -gt 30 ]; then
                local COLOR=${txtred}
            elif [ "$MINUTES_SINCE_LAST_COMMIT" -gt 10 ]; then
                local COLOR=${txtylw}
            else
                local COLOR=${txtgrn}
            fi
            local SINCE_LAST_COMMIT="${COLOR}$(minutes_since_last_commit)${reset}"
            # The __git_ps1 function inserts the current git branch where %s is
            # *** richard -- added purple to branch name


             local GIT_PROMPT='__git_ps1 "[3${txtgrn}%s3${reset}|3${SINCE_LAST_COMMIT}]"'
            echo ${GIT_PROMPT}
        fi
    }
    PS1="\[${txtblu}\u\[${txtmag}@\h\[${reset}:\[\W\]\[\$(grb_git_prompt)\$ "

[... snipped ...]

Por algum motivo, meu prompt faz isso:

Atéqueeufaça:

$bash

pontoemquefazisso:

Exatamente o mesmo .bashrc e scripts associados funcionam perfeitamente em minha caixa de archives.

$ echo $PS1
\[\u\[@\h\[:\[\W\]\[$(grb_git_prompt)$

O mesmo acontece no Terminal.app e no iTerm2. Alguma idéia?

    
por richard 01.05.2014 / 13:14

2 respostas

0

Sem saber exatamente o conteúdo de suas variáveis de cor, eu acho que você precisa mudar isso

PS1="\[${txtblu}\u\[${txtmag}@\h\[${reset}:\[\W\]\[\$(grb_git_prompt)\$ "

para isso

PS1="\[3${txtblu}\]\u\[3${txtmag}\]@\h\[3${reset}\]:\W\$(grb_git_prompt)\$ "

E mude isso

local SINCE_LAST_COMMIT="${COLOR}$(minutes_since_last_commit)${reset}"
local GIT_PROMPT='__git_ps1 "[3${txtgrn}%s3${reset}|3${SINCE_LAST_COMMIT}]"'
echo ${GIT_PROMPT}

para

local SINCE_LAST_COMMIT="\[3${COLOR}\]${MINUTES_SINCE_LAST_COMMIT}\[3${reset}\]"
echo "$(__git_ps1 "\[3${txtgrn}\]%s\[3${reset}\]|${SINCE_LAST_COMMIT}")"

Todos os códigos de cores precisam ser cercados individualmente por \[...\]

    
por 01.05.2014 / 15:30
0

Suspeito que suas definições de cor (que não vejo em sua pergunta) já têm os caracteres \[ e \] ao redor. Ou seja seu amarelo é algo assim:

txtylw="\[3[0;37m\]"

E isso é o que está causando a confusão e o problema.

O prompt do PS1 precisa dos caracteres adjacentes, mas as cores retornadas pelo grb_git_prompt() function não devem , porque essa função é chamada toda vez que você pressiona Enter e sua saída será inserida < em> literalmente em seu prompt.

Coloque-os no topo da sua função grb_git_prompt() para ver se estou certo:

local txtred="3[0;31m"
local txtylw="3[0;37m"
local txtgrn="3[0;32m"
local reset="3[0m"

P.S. Não tenho certeza se meus números reais de cores estão corretos.

    
por 01.05.2014 / 18:11