2011-09-30 1 views
2

J'ai quelque chose comme ça dans mon script de connexion qui garde $ foo en haut à droite de mon terminal. Cela fonctionne, mais avec une mise en garde. Si je tape une commande vraiment longue, elle ne s'enroulera pas. (Bien, ça va emballer si c'est plus de deux lignes, mais la 2ème ligne écrase la 1ère ligne, si cela a du sens.)bash: retour à la ligne avec PS1 fantaisie qui fait écho positionnel

Quelqu'un sait comment je peux faire une bash wrap (ie insérer newline) à $ POS ? Ou même à $ COLUMNS?

trunc_pwd() { # See http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x783.html 
    local pwdmaxlen=50 # Number of $PWD chars to keep 
    local trunc_symbol="<" # Prepend to truncated $PWD 
    if ((${#PWD} > $pwdmaxlen)); then 
     local pwdoffset=$((${#PWD} - $pwdmaxlen)) 
     echo "${trunc_symbol}${PWD:$pwdoffset:$pwdmaxlen}" 
    else 
     echo ${PWD} | sed "s%^${HOME}%~%g" 
    fi 
} 

foo="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 

get_pos() 
{ 
    POS=$((COLUMNS-(${#foo}+4))) 
} 

if [[ ${PS1} ]]; then 
    PROMPT_COMMAND='get_pos ; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:$(trunc_pwd)"; echo -ne "\007"' 
    export PS1="\[email protected]\h \W \$ \[\e[s\]\[\e[1;\$(echo -n \${POS})H\]$foo\[\e[u\]" 
fi 

Répondre

3

Bash utilise les \[ et \] échappe à l'invite pour déterminer la longueur de la ligne et où envelopper. Si vous mettez quelque chose qui ne devrait pas affecter la longueur de la ligne (les séquences d'échappement, le $ foo, etc) avec ceux que vous devriez être ok. Je ne suis pas sûr pourquoi votre invite ne fonctionne pas (et je ne reconnais pas certaines des séquences d'échappement comme \ e [s, pourrait être vous êtes sur quelque chose d'autre qu'un vt100), ma tentative fonctionne très bien:

PS1='\[\e7\e[0;$((COLUMNS-(${#foo})))H$foo\e8\][\[email protected]\h \W]\$ ' 

re-regarder réellement à la vôtre, il pourrait fonctionner si vous changez PS1 à

PS1="\[email protected]\h \W \$ \[\e[s\e[1;\$(echo -n \${POS})H$foo\e[u\]" 

-à-dire, l'emballage \[ ... \] autour de tous les trucs hors ligne.

+0

Oui, +1. ('ESC [s' est" enregistrer la position du curseur ",' ESC [; H' est "positionner le curseur", et 'ESC [u' est" restaurer la position du curseur ".) Il tente d'imprimer' $ foo' ailleurs dans la fenêtre, la longueur de '$ foo' devrait être ignorée afin de suivre la durée de l'invite sur la ligne d'entrée - ce qui signifie que' $ foo' devrait être à l'intérieur de '\ [' ... ' \] 'comme vous le suggérez, plutôt qu'à l'extérieur comme dans l'original. –

+0

Vous les gars rock. '\ [... \]' était mon problème. Maintenant, avec cela à l'écart, j'aime la solution plus élégante de $ ((COLUMNS - ($ {# foo}))) 'au lieu d'appeler une fonction dans PROMPT_COMMAND. Je suis heureux et humble. Merci! –

+0

@ evil-otto - En utilisant votre solution, comment ajouter de la couleur? Quand je l'essaye, ça gâche l'emballage et l'édition des commandes. Je suis en enfer de séquence d'échappement! –

Questions connexes