zsh의 오른쪽 프롬프트 끝에서 쓸모없는 공간 제거 ($ RPROMPT)


18

zsh에서는 오른쪽 프롬프트 오른쪽에 항상 공백 문자가 있습니다. 나는 매우 간단한 .zshrc로 시도했다.

PROMPT="#"
RPROMPT="*"

화면 오른쪽의 * 뒤에 항상 공백이 있습니다.

다음은 문제를 보여주는 스크린 샷입니다 (선 중 하나에서 공간을 선택했습니다). http://i.imgur.com/cnfa2eJ.png

감사.

답변:


20

TL; DR

당신이해야 할 일은 이것을 당신의 ~/.zshrc(또는 프롬프트 테마와 같은 파일에 ) 넣는 것입니다 .

ZLE_RPROMPT_INDENT=0

세부

최대 5.0.2 로 이어지는 ZSH 버전에서 rprompt_off(오른쪽 여백 오프셋을 설정하는) ZSH C 소스 코드의 값 은 다음과 같이 하드 코딩되었습니다.1 .

그러나 5.0.5 릴리스에서 개발자는 ZLE_RPROMPT_INDENT환경 변수 를 설정하여이 기본값을 대체하는 기능을 추가했습니다 .

근거이 "들여 쓰기" 는 디스플레이의 마지막 셀에 문자가있는 경우 일부 구형 터미널이 스크롤을 시작하기 때문입니다.

5.0.5 이전의 ZSH 버전

이전 버전의 ZSH를 사용 중이고 업데이트 할 수없는 경우 다음을 모두 수행하여 해당 공간을 제거 할 수 있습니다.

  1. 장난 당신 RPROMPT 생각하는 것은 실제로 표준 보이지 않는 시퀀스 래퍼를 사용하는 것보다 문자 짧은에 zsh을을 :%{...%}
  2. 그런 다음 terminfo를 사용하여 커서 백 이스케이프 시퀀스를 보냅니다. %{terminfo[cub1]}

자세한 내용은 메일 링리스트 에서 FAQ이 메시지 를 확인하십시오 .


5
이것은 또한 입력 커서를 평소의 왼쪽에 한 문자 놓는 것처럼 보입니다. 예를 들어이 질문의 프롬프트를 사용하면 커서가 바로 오른쪽이 아니라 해시 표시 배치 됩니다 . (제게, 오프셋을 0보다 작은 값으로 설정하면 프롬프트 커서가 올바른 위치에 나타납니다. zsh 5.0.8 및 5.2를 준수하십시오.)
Rob Kennedy

5.2에서 작동합니다.
Anthony Michael Cook

5
그것은 5.2에서 나에게 도움이되었지만 이제는 PROMPT에 문제가 있습니다 .PROMPT의 마지막 문자가 사라지고 자동 완성을 토글하면 마지막 문자가 현재 입력의 첫 문자로 채워집니다. 예를 들어 %git<Tab>로 변환%ggit
roboslone

최신 버전의 ZSH에는 트릭을 사용할 필요가 없습니다.
Anthony Michael Cook

5
ZLE_RPROMPT_INDENT = 0을 설정 한 후, 다른 사람들이 위에서 언급 한 왼쪽 프롬프트 와 동일한 도면 결함 문제를 발견했습니다 . 그러나 0 대신 -1을 사용하면 거의 모든 것이 예상대로 작동합니다 (예 : ZLE_RPROMPT_INDENT = -1). github.com/bhilburn/powerlevel9k/issues/… 에서 그 팁을 보았습니다 . 거의 -1을 사용하면 macOS에서 터미널 창의 맨 아래 줄을 사용하지 않기 때문입니다.
Marc Liyanage 2014 년

2

zsh 관리자에게 버그 보고서를 보냈지 만 의도적으로 설계된 동작 인 것 같습니다. 그러나이 문제는 나를 너무 귀찮게하여 zsh를 임시 수정으로 패치하고 컴파일하기로 결정했습니다. OS X를 사용하고 Homebrew를 사용하는 경우 (필수) 다음을 실행하여 패치를 포함하여 zsh를 설치할 수 있습니다.

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

당신은 가능성이 추가 할 것 /usr/local/bin/zsh으로 /etc/shells하고 chsh -s /usr/local/bin/zsh이후. 마지막으로 관심있는 사람을위한 원시 diff가 있습니다.

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
    else
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
        /*

PWS (zsh 관리자) 가 확장 패치를 게시 했으므로 RPROMPT 들여 쓰기는 곧 공식적인 출처에 있어야합니다.
mpy

링크를 게시 해 주셔서 감사합니다. 다음 릴리스를 기대합니다!
패트릭 오스 시티

1

오른쪽의 공백은 하드 코딩 된 것 같습니다. 그러나 zsh다음 설정으로 속일 수 있습니다 .

RPROMPT="%{*%}"

그것은 원칙적으로 zsh별이 어떤 문자도 차지하지 않는다고 말한다 ; 부터 man zshmisc:

%{...%} 문자열을 리터럴 이스케이프 시퀀스로 포함하십시오. 중괄호 안의 문자열은 커서 위치를 변경하지 않아야합니다. (...)

단점은 다음과 같이 공백을 "이동"하는 것입니다 PROMPT.

| PROMPT = "#"|
| RPROMPT = "% {* %}"|
| # ■ * |

|기호는 커서를 ■ 터미널 가장자리를 나타낸다.


또 다른 아이디어는 COLUMNS1 씩 증가시키는 것입니다 .

COLUMNS=$((COLUMNS + 1))

그러나 명령 렌더링이 아닌 프롬프트 렌더링에만이 작업을 수행하는 방법을 고려해야합니다. 그리고 이것은 여러 줄 명령 줄에서 각 줄의 마지막 문자를 삼킬 것입니다.


1
감사. 오른쪽에 표시된 시간과 자식 상태를 처리하면서 % {... %} 트릭을 사용하려고했습니다. 나는 일반적으로 하나가 있기 때문에 PROMPT의 여분의 공간을 신경 쓰지 않습니다. 그러나이 솔루션에는 한 가지 큰 단점이 있습니다. TAB을 사용하여 자동 완성을 활성화하면 여분의 공간이 제거되고 이상한 일을하고 있습니다 :)
Frozax
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.