zsh로 프롬프트의 오른쪽 부분을 무리하게도 선행에 표시하고 싶습니다.

3204 단어 ShellScriptZsh

하고 싶은 일



zsh에서 다음 두 개에 해당하면 두 번째 줄에 RPROMPT(プロンプトの右側)가옵니다.
  • .zshrc 에서 PROMPT 끝에 줄 바꿈 코드를 넣고 명령을 새 줄에서 입력하도록합니다.
  • RPROMPT 사용

  • 아래 이미지처럼 보입니다.


    이것으로 곤란한 것이, 터미널의 내용을 Slack등에 복사해 공유하려고 했을 때, RPROMPT 까지 복사되어 버려, 그것을 지우는 수고가 생겨 버린다는 것입니다.

    왜 사용자가 명령을 입력하는 행과 같은 행에 RPROMPT 를 내는 사양일 것이다. .
    그것을 어떻게든하고 싶다는 틈새 게시물입니다.

    덧붙여서 어떠한 설정으로, 간단하게 이것을 해소하는 방법은 생각지 못했습니다.
    ( RPROMPT 는 개행 코드 효과가 없습니다. ZLE_RPROMPT_INDENT 를 부의 정수로 해도 무시됩니다.)

    해결방법안



    방안 1: RPROMPT 사용을 그만두고, ANSI 이스케이프 시퀀스로 무리하게 제어하고 그리기



    조금 이런 방법 밖에 모릅니다.
    .zshrc 를 다음과 같이 합니다.
    # 出したい情報をCUSTOM_RPROMPTに格納しておく
    
    print_to_rprompt() {
        col=$(( COLUMNS - 8 ))
        print -Pn "\e7\e[1A\e[${col}G${CUSTOM_RPROMPT}\e8"
    }
    
    TMOUT=1
    TRAPALRM() {
        print_to_rprompt
    }
    
    COLUMNS 는 윈도우 폭이 들어 있는 zsh의 환경 변수입니다.
    오른쪽으로 내는 문자를, 선두에 반각 스페이스를 삽입하는 것으로, 모두 8문자에 통일한 다음에 위와 같이 실장했습니다.

    제어 코드에 의한 조작의 설명을 합니다.
  • ESC7 : 현재 커서 위치 등을 저장합니다
  • ESC [1A : 커서 위치를 한 줄 위로 이동
  • ESC [{NUM} G : 커서를 왼쪽 가장자리에서 NUM만큼 오른쪽으로 이동
  • ESC8 : 저장된 커서 위치와 같은 복귀

  • 그리고, TRAPALRM 그리고 이것을 1 초마다 실행합니다.
    즉, 초당 print로 내고 싶은 정보를 계속 내보내는 것입니다.

    git의 status와 시간을 RPROMPT 에 내고 싶습니다만, 이 방법이라면 프롬프트의 우측의 정보는 보관 유지되지 않고 항상 재기록되기 때문에, 시각은 PROMPT 에 우울해 git의 status만 표시하도록 했습니다.
    다음과 같은 느낌이 듭니다.



    매초 갱신하는 당, 본래의 RPROMPT 와는 기능이 다르고 버립니다만, git의 status를 리얼타임으로 갱신해 표시해 주기 때문에 오히려 마음에 들었습니다.

    방안 2: PROMPT에 필요한 공간만 계산하고 삽입



    이것도 가능합니다. 이쪽이 본래 하고 싶었던 것에 가까울지도.
    단지 이번은 안 1로 했습니다.

    방안 3: tmux 사용



    tmux로 status-position top 로 할 수 있는 것 같습니다.
    tmux로 할까. .

    요약



    시행착오하는 동안 다음과 같은 프롬프트가 생겼습니다.
  • 다중 행 프롬프트의 경우 첫 번째 행의 오른쪽에 정보를 표시합니다
  • 초당 업데이트 (편집기에서 괴롭히면 상태가 반영됨)

  • 뭔가 다른 좋은 방법이 있으면 꼭 가르쳐 주셨으면합니다. .

    좋은 웹페이지 즐겨찾기