너무 길면 개행 프롬프트를 추가하세요

너무 길면 개행 프롬프트를 추가하세요

bash 프롬프트에 다른 정보(git 등)와 함께 전체 작업 디렉토리를 표시하는데 때로는 매우 길어집니다.

다음 줄에 명령을 입력할 수 있도록 프롬프트 끝에 개행 문자를 추가하고 싶지만프롬프트가 매우 긴 경우에만예를 들어 50자를 초과합니다.

| ~ $ Typing a command here is nice                                              |
| ~/foo/longDirectoryName/longsubirectory/src/package (master +*) $ Typing here s|
| ucks. I want to just start on a new line                                       |

내가 원한다면 분명히언제나다음 줄에 명령을 입력하면 개행 문자를 추가할 수 있습니다 PS1(예:이 게시물). 하지만 PS1이는 단지 형식 문자열일 뿐이 므로 조건부로 이를 수행하는 방법을 찾지 못했습니다 .


PS 저는 실제로 ZSH를 사용하여 Agnoster 테마를 사용자 정의하려고 시도하고 있지만 일반적으로 bash 관련 솔루션이 도움이 될 것이라고 생각합니다.

답변1

에서는 zsh이것이 %<number>(l:<yes>:<no>)신속한 확장을 위한 것입니다. 숫자가 음수인 경우, 예를 들어 -30화면 오른쪽 가장자리에서 30자 이상이 남아 있으면 yes텍스트를 출력하고, 그렇지 않으면 no다음과 같습니다.

PS1=$'%~%-30(l::\n)$ '

"$ "줄에 사용할 수 있는 문자가 28자 미만인 경우(30 -) 개행 문자가 삽입됩니다.

당신은 당신의 할 수 있습니다50 이상그리고:

PS1=$'%~%50(l:\n:)$ '

하지만 제 생각에는 사용할 수 없는 최대 공간을 보장하는 것보다 최소한의 사용 가능한 공간을 보장하는 것이 더 유용하다고 생각합니다.

바라보다수동더 알아보기. 긴 프롬프트를 잘라내고 줄임표로 바꾸는 방법에 대한 다른 지침도 찾을 수 있으며, 이러한 지침도 유용할 수 있습니다.

zsh 프롬프트는 bash실제로 솔루션에 더 가깝기 tcsh때문에 솔루션이 bash유용할 가능성은 낮지 zsh만 일반적으로 그 반대가 더 정확합니다.

답변2

최신 버전에서는 변수 대체 형태("프롬프트처럼 확장")를 bash통합할 수 있습니다 .PROMPT_COMMAND${var@P}

이것은 한 가지 방법입니다. 원하는 것 OPS1대신 프롬프트를 설정하면 됩니다 . PS1이것\-안으로 탈출하는 OPS1것과 같을 거에요부드러운 하이픈: 프롬프트가 ;보다 길면 COLUMNS / 2개행 문자로 확장됩니다. 그렇지 않으면 삭제됩니다:

generate_ps1(){
    local ps1=${OPS1@P}
    if [ "${#ps1}" -gt "$((COLUMNS / 2))" ]; then PS1=${OPS1//\\-/$'\n'}
    else PS1=${OPS1//\\-/}
    fi
}
OPS1=$PS1
PROMPT_COMMAND=generate_ps1

# after this, set OPS1 instead of PS1 to the prompt you want

$ OPS1='$long_var\-\$ '
$ long_var=$(printf 'foobar %.0s' {0..21})
foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foo
bar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar
$ _
$ long_var=$(printf 'foobar %.0s' {0..2})
foobar foobar foobar $ _

터미널의 자동 여백과 프롬프트 내 기존 줄 바꿈 등을 고려하여 진정한 소프트 하이픈처럼 작동하도록 개선할 수 있지만 그렇게 하면 가치가 있는 것보다 상황이 더 복잡해집니다.

관련 정보