2011-09-30 3 views
2

터미널의 오른쪽 상단에 $ foo를 유지하는 로그인 스크립트에 이와 비슷한 내용이 있습니다. 작동하지만주의해야합니다. 정말 긴 명령을 입력하면 줄 바꿈하지 않습니다. (글자가 두 줄 이상이면 줄 바꿈하지만 두 번째 줄은 첫 줄을 덮어 씁니다.)bash : 위치가 반향하는 팬시 PS1로 줄 바꿈

누구나 $ POS에 bash 줄 바꿈 (즉, 줄 바꿈 삽입)을 할 수있는 방법을 알고 있습니다. ? 아니면 $ 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 

답변

3

배쉬는 어디에서 포장하는 라인 길이를 결정하기 위해 프롬프트에서 \[\] 탈출을 사용합니다. 줄 길이 (이스케이프 시퀀스, $ foo 등)에 영향을 미치지 않아야하는 것을 포함시켜야한다면 괜찮을 것입니다.

나는 왜 프롬프트가 작동하지 않는지 잘 모르겠다. (나는 vt100이 아닌 다른 것에있을 수있는 \ e와 같은 이스케이프 시퀀스를 인식하지 못한다. 잘 : 당신은 모든 라인 외부 물건을 주위에 \[ ... \] 포장,

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

예에 PS1을 변경하는 경우

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

다시 찾고 당신에, 그것은 작동 할 수 있습니다.

+0

예, +1. ('ESC [s'는 "커서 위치 저장"이고, ESC [; H는 "커서 위치 설정"이고, ESC [u는 "커서 위치 복원"입니다.)'$ foo' 입력 줄에 프롬프트가 얼마나 오랫동안 있는지 추적 할 목적으로'$ foo'의 길이를 무시해야합니다. 즉'$ foo'는'\ ['...' \]'을 사용하십시오. –

+0

너희들 바위 야. '\ [... \] '이 제 문제였습니다. 이제 그런 식으로, 나는 PROMPT_COMMAND에서 함수를 호출하는 대신'$ ((COLUMNS - ($ {# foo})))'의 더 우아한 해결책을 좋아한다. 나는 행복하고 겸손 해. 감사! –

+0

@ evil-otto - 솔루션을 사용하면 색상을 어떻게 추가 할 수 있습니까? 내가 그것을 시도하면 포장 및 명령 편집을 망칠. 나 탈출구 지옥에있어! –