Zsh의 여러 줄 프롬프트에서 명령 실행 후 한 줄만 남겨 둡니다.

6998 단어 ShellScriptpromptZsh

하고 싶은 일



Zsh의 여러 줄 프롬프트에서 예를 들어 Git의 워킹 트리 상태 등을 내고있는 경우 명령 실행 후 화면에 남기고 싶지 않습니다.

Git 정보는 입력 접수중의 프롬프트에만 나와 있으면 좋고, 커맨드 실행 후에는 Git 정보를 지워 1행만의 프롬프트를 화면에 남기고 싶습니다.

하는 방법



여러 줄 프롬프트를 설정할 때 미리 한 줄 버전의 프롬프트를 변수에 넣고 다른 행과 연결하는 방식으로 $ PROMPT를 설정합니다. 아래의 예에서는, 평상시는 1행의 프롬프트입니다만, Git 리포지토리 내부에 있을 때만 1행째가 Git정보·2행째가 통상의 프롬프트가 되도록 하고 있습니다.
# 1行版のプロンプトの中身を $BASE_PROMPT 変数に入れる
case $TERM in
    xterm*)
        BASE_PROMPT=$'%{\e]0;[%n@%m:%~]\a%}'$'[%n@%m%{\e[00m%}]%(5~,%-1~/.../%1~,%~)%# '
        ;;
    *)
        BASE_PROMPT=$'[%n@%m%{\e[00m%}]%(5~,%-2~/.../%2~,%~)%# '
        ;;
esac

# Gitが公式に配布している git-prompt.sh を利用
source ~/.zsh/git-prompt.sh

# プロンプト表示前にGitの状態を検知してプロンプトを書き換える
precmd () {
    local git_prompt="$(__git_ps1 '%s')"
    if [[ -n "$git_prompt" ]]; then
        # Gitリポジトリの内部にいるとき、ワーキングツリーの状態によって色を切り替える
        local color=34 # blue
        if [[ $git_prompt == *'*'* ]]; then
            color=31 # red
        elif [[ $git_prompt == *'%'* ]]; then
            color=33 # yellow
        elif [[ $git_prompt == *'+'* ]]; then
            color=32 # green
        elif [[ $git_prompt == *'$'* ]]; then
            color=35 # magenta
        fi
        PROMPT=$'\e['"$color"$'m(\ue0a0 '"$git_prompt"$')\e[0m\n'"$BASE_PROMPT"
    else
        PROMPT="$BASE_PROMPT"
    fi
}

# git-prompt.sh 用のオプション設定
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWUPSTREAM=""
GIT_PS1_DESCRIBE_STYLE="branch"
GIT_PS1_SHOWCOLORHINTS=0

여기까지만이라면 그냥 여러 줄 프롬프트입니다. 다음이 본 기사의 포인트로, 명령 실행 후에 프롬프트를 1행만 남기는 부분입니다.
# Enter を打った時に実行する関数
function my_accept_line() {
    # プロンプトにgit状態も表示されている場合、git状態の表示を消す
    if [[ ${#PROMPT} -ne ${#BASE_PROMPT} ]]; then
        local saved_prompt=$PROMPT
        PROMPT=$BASE_PROMPT
        zle reset-prompt
        PROMPT=$saved_prompt
    fi
    zle accept-line
}
zle -N my_accept_line
bindkey '^M' my_accept_line

ZLE 기능을 사용하여 Enter를 칠 때 프롬프트를 다시 씁니다. 일시적으로 프롬프트를 1행판 프롬프트로 해, zle reset-prompt 에 의해 프롬프트 및 입력된 커멘드를 재묘화 하는 것이 미소입니다. 덧붙여 재묘화 후는 프롬프트를 원의 복수행판에 되돌리고 있습니다.

결과



화면에서 불필요한 정보가 사라져 깨끗이 했습니다.

좋은 웹페이지 즐겨찾기