@P 유무에 관계없이 PS1에서 생성된 프롬프트의 화면 너비를 얻는 방법은 무엇입니까?

@P 유무에 관계없이 PS1에서 생성된 프롬프트의 화면 너비를 얻는 방법은 무엇입니까?

예를 들어 PS1다음 값이 있다고 가정합니다.

'\w (\[\e[32m\]${__git_ps1_branch_name}\[\e[0m\] \[\e[31m\]*\[\e[31m\]%\[\e[0m\]>)\$ '

...여기에는 또는 __git_ps1_branch_name같은 문자열이 있습니다 .masterfeature123

묻다:위에 표시된 프롬프트에서 bash생성될 프롬프트의 화면 너비(문자 수)를 계산하는 방법을 찾고 있습니다.PS1


최신 버전에서는 위의 힌트 사양 요소를 최종 표시된 값으로 대체하여 얻은 문자열 bash로 표현식을 확장합니다 . ${PS1@P}( \w예를 들어 현재 디렉터리의 경로로 대체되거나 ${__git_ps1_branch_name}변수에 포함된 문자열로 대체되는 __git_ps1_branch_name등) 그러나 이것만으로는 문제를 해결하기에 충분하지 않습니다.

더 구체적으로 다음과 같이 설정하면:

EXPANDED_PS1="${PS1@P}"

... 표현식 에 의해 생성된 숫자 ${#EXPANDED_PS1}(즉, 의 문자 수 )는 다음과 같습니다.$EXPANDED_PS1상당히 크다bash 에 의해 생성된 프롬프트의 화면 너비보다 넓습니다 $PS1. 초과분은 표시된 프롬프트에 색상을 제공하는 이스케이프 시퀀스에서 비롯됩니다.

어떤 경우 에라도,그래요반품지원되지 않는 bash 버전에 대한 솔루션에 관심이 있음@P.

답변1

지원 없이는 어렵습니다 @P. 문제는 PS1을 확장해야 하는데 해당 기능이 비공개라서 직접 사용할 수 없다는 점이다. 그럼에도 불구하고 아주 좋은 시도가 있습니다이 문제.

지원이 있는 경우 @P다음이 도움이 될 수 있습니다.

$ echo -ne "\n${PS1@P}\033[6n";read -e -s -d R cnt;cnt=$((${cnt#;} - 1));echo $cnt

PS1먼저 새 줄과 확장된 문자열을 보냅니다. 이는 커서가 이제 열에 있음을 의미합니다.PS1의 길이 + 1.

그런 다음 ANSI 이스케이프 코드가 있습니다.장비현황 보고(CSI6n) 보냈습니다. 터미널 응답:

커서 위치(CPR)는 ESC[n;mR을 전송하여 보고됩니다. 여기서 n은 행이고 m은 열입니다. )

값은 표준 입력에서 읽고 넣습니다 cnt.

그것은 해킹적이고 ANSI 터미널에서만 작동하지만 작동하는 것 같습니다. 확장 길이가 터미널 너비보다 크면 열에 길이가 표시되지 않습니다 PS1. 다른 프로세스의 출력도 문제가 될 수 있습니다.

관련 정보