Zsh 프롬프트로 Giit 웨어하우스 정보 표시
개요
Zsh를 사용하여 Giit 창고 상태를 표시하는 Zsh 스크립트를 만듭니다.구체적으로 말하면
힌트를 만지작거리다
기트와 서브버젼 등의 창고를 이용하면 그 창고의 상태를 확인하고 싶어하는 경우가 많다.Giit의 경우 분기 이름, 커밋되지 않음, 미루지 않음 상태를 프롬프트에 표시하고 싶습니다.다른 사람들도 루트인지 아닌지를 잘 알고 힌트에 대해 다양한 사용자 정의를 할 수 있을 거라고 생각합니다.
물론 이러한 수요를 위해 다양한 수요가 있을 수 있지만, 얻기 어려운 기회라면 하나하나 기능을 확인하면서 이런 Zsh 스크립트를 만들어보자.
최종적으로 함수
git-prompt
를 만들어서 현재 Giit 창고의 상태를 표시하고 그 값PROMPT
이나 RPROMPT
을 마음에 드는 곳에 두십시오.코드는 다음과 같이 공개됩니다.다양한 상태의 창고를 만드는 메이크 파일이 있기 때문에 디버깅에도 사용할 수 있다.
https://github.com/kaityo256/zsh_vcs
구조 함수
우선 함수를 만들어 집행합시다.
function
할 수 있어요.아래의 문서는 예를 들어 zshrc_git.zsh
의 이름으로 제작되었다.function git-prompt{
echo "main"
}
git-prompt
함수 하나만 생성하고 호출합니다.시행해 보다.$ source zshrc_git.zsh
main
는 git-prompt
만 실행했고 echo
로 나타났다.색칠하다
창고의 상태를 색깔로 표현하고 싶으니 색칠을 해 보세요.이를 위해
main
라는 이름의 껍질 함수를 읽는다.autoload -U colors; colors
function git-prompt{
echo "${fg[green]}main${reset_color}"
}
git-prompt
이 동작을 실행한 후 녹색 디스플레이colors
를 사용해야 한다.첫 번째
main
는 껍질 함수를 읽어야 하는 성어다.autoload -U colors; colors
읽기autoload func
만 있으면 실행되지 않습니다.따라서 바로 사용하고 싶을 때func
.autoload func;func
와 autoload -X func
옵션은 즉시 실행되지만 현재 설정된alias를 계승합니다.-X
와 ls
등은 주로 사용자 측에서 알리스를 설정하는데 이를 조개 함수에 계승하면 오작동을 일으킬 수 있다.따라서 보통 알리스 읽기를 계승하지 않는 옵션cp
을 추가합니다-U
.autoload -U func
와 -U
는 동시에 지정할 수 없으며 즉시 사용하려면-X
.autoload -U func; func
실행 후 사용 가능colors
.예를 들어 fg[色]
색상을 녹색으로 설정합니다.이렇게 하면 다른 표시도 녹색을 유지하기 때문에 ${fg[green]}
로 색깔을 원상태로 회복한다.현재 분기 이름 가져오기
현재 지점
${reset_color}
은 빼낼 수 있습니다.$ git symbolic-ref --short HEAD
main
참고로 git symbolic-ref --short HEAD
옵션은 이전에 없었어요.이 옵션이 없으면 이 내용이 표시됩니다.$ git symbolic-ref HEAD
refs/heads/main
에서 지점 이름을 얻으려면sed 같은 것이 필요하지만 지금--short
에는 찾을 수 있기 때문에 필요 없습니다.또한 Giit 창고가 아닌 경우 표준 오류 출력에 다음과 같은 내용이 표시됩니다.
$ git symbolic-ref --short HEAD
fatal: not a git repository (or any of the parent directories): .git
따라서 표준 오류 출력을 건너뛰고--short
표준 출력에 나타나면 지점 이름이고 아무것도 없으면 Giit 창고가 아니다.이곳에서 HEAD를 얻을 수 있을 거라고 생각하지 마세요.위에서 말한 바와 같이 각본은 다음과 같다.
autoload -U colors; colors
function git-prompt {
local branchname
branchname=`git symbolic-ref --short HEAD 2> /dev/null`
if [ -z $branchname ]; then
return
fi
echo "${fg[green]}${branchname}${reset_color}"
}
git-prompt
여기에if문장의 조건식/dev/null
은 [ -z $branchname ]
명령의 줄임말이다.test
옵션은 다음 문자열의 길이가 0일 때 진짜가 됩니다.이런 느낌이에요.test -z "";echo $? # => 0
test -z "hoge";echo $? # => 1
또-z
는 진짜일 때 0으로 되돌아오니 주의해야 한다.이렇게 되면if [ -z $branchname ]; then
return
fi
는 test
가 공문자라는 뜻으로, 지트의 창고가 아니면 진짜가 되고 그때는 아무것도 하지 않는다는 뜻$branchname
이다.상황을 조사하다
브랜치 이름의 색상으로 상태를 나타냅니다.먼저 제출하지 않거나 초록색도 제출하지 않으며 Untracked files와 노란색이 있습니다. 이외에 빨간색을 선택하십시오.
우선 실행
return
, 표시git status
는 녹색입니다.이외에 nothing to commit, working tree clean
로 나타나면 노란색이고 그 외에 빨간색이다.그 이상을 솔직하게 실행하면 이런 느낌이 들겠죠.autoload -U colors; colors
function git-prompt {
local branchname branch st
branchname=`git symbolic-ref --short HEAD 2> /dev/null`
if [ -z $branchname ]; then
return
fi
st=`git status 2> /dev/null`
if [[ -n `echo "$st" | grep "^nothing to"` ]]; then
branch="${fg[green]}($branchname)$reset_color"
elif [[ -n `echo "$st" | grep "^nothing added"` ]]; then
branch="${fg[yellow]}($branchname)$reset_color"
else
branch="${fg[red]}($branchname)$reset_color"
fi
echo "$branch"
}
git-prompt
에 nothing added to commit but untracked files present (use "git add" to track)
와 branch
의 변수를 새로 가져왔습니다.st
의 실행 결과git stutus
가 받아들여졌고, st
가 포함된 문자열은 녹색이고, nothing to
가 포함된 문자열은 노란색이며, 이외에 빨간색이다.또한 브랜치 이름은 괄호로 묶습니다.창고로 한번 해보세요.
nothing added
창고kaityo256/zsh_vcs
에서sample_dir
몇 개의 디렉터리[1]를 만들 수 있습니다.git clone https://github.com/kaityo256/zsh_vcs.git
cd zsh_vcs
cd sample_dir
make
각각make
00
이후(노란색이어야 함)git init
01
이후git init;git add
02
이후(녹색이어야 함)cd sample_dir
make
cd 00
source ../../zshrc_git.zsh
같은 건 예상 색상대로 브랜치 이름을 말할 수 있는지 확인하는 게 좋을 것 같아요.어떤 디렉터리에서git branch -m hoge
source ../../zshrc_git.zsh
로서 지점명을 얻었는지 잘 확인해 보는 것도 좋다.업스트림 브랜치
이어 상위 지점의 취득과 상위 지점의 차이를 조사했다.상류 지점의 취득 방법은 여러 가지가 있지만
git init;git add;git commit
로 얻는 것은 비교적 쉽다.git config
에 업스트림 브랜치를 설정하면 얻을 수 있습니다.업스트림 브랜치가 없으면 아무것도 표시되지 않습니다.원격 브랜치를 표시할 수 있지만 어차피 나는
git config branch.ブランチ名.remote
만 사용하기 때문에 상위 브랜치가 있으면 브랜치 이름 옆에 origin
를 표시하고 이 색을 사용하지 않았는지 판정한다.상위 지점이 있으면
[up]
미적용 제출이 있는지 조회할 수 있습니다.아무것도 안 보이면 차별이 없어요.종합적으로 말하면 이런 느낌이죠.
remote=`git config branch.${branchname}.remote 2> /dev/null`
if [ -z $remote ]; then
pushed=''
else
upstream="${remote}/${branchname}"
if [[ -z `git log ${upstream}..${branchname}` ]]; then
pushed="${fg[green]}[up]$reset_color"
else
pushed="${fg[red]}[up]$reset_color"
fi
fi
echo "$branch$pushed"
어렵지 않아요.git log 上流ブランチ..現在のブランチ
변수pushed
[up]
.예컨대sample_dir
라면cd 03
source ../../zshrc_git.zsh
면 초록색03
으로 표시해야 합니다.각 디렉토리의 상태는 다음과 같습니다.
(main)[up]
누르지 않은 상태로 원격 웨어하우스 설치03
[up]
원격 창고 설치, 누르지 않음04
[up]
원격 창고 설치, 커밋되지 않음, 누르지 않음(빨간색 분기 이름은 녹색05
그렇습니다.
RPROMPT로 설정
다음에 나오는 문자열을 PROPT나 RPROMPT에 삽입하면 됩니다. 이렇게 설정하면 표시가 이상해집니다.색상이 바뀐 도피 시퀀스의 문자열을 문자로 계산하기 때문이다.이런 상황을 방지하기 위해서는 색깔이 바뀐 곳을
[up]
와%{
로 포위해야 한다.이상에서 수정한 내용은 다음과 같다.autoload -U colors; colors
function git-prompt {
local branchname branch st remote pushed upstream
branchname=`git symbolic-ref --short HEAD 2> /dev/null`
if [ -z $branchname ]; then
return
fi
st=`git status 2> /dev/null`
if [[ -n `echo "$st" | grep "^nothing to"` ]]; then
branch="%{${fg[green]}%}($branchname)%{$reset_color%}"
elif [[ -n `echo "$st" | grep "^nothing added"` ]]; then
branch="%{${fg[yellow]}%}($branchname)%{$reset_color%}"
else
branch="%{${fg[red]}%}($branchname)%{$reset_color%}"
fi
remote=`git config branch.${branchname}.remote 2> /dev/null`
if [ -z $remote ]; then
pushed=''
else
upstream="${remote}/${branchname}"
if [[ -z `git log ${upstream}..${branchname}` ]]; then
pushed="%{${fg[green]}%}[up]%{$reset_color%}"
else
pushed="%{${fg[red]}%}[up]%{$reset_color%}"
fi
fi
echo "$branch$pushed"
}
RPROMPT='`git-prompt`%{$fg_bold[cyan]%}[%~]%{$reset_color%}'
setopt prompt_subst
제 취미는 오른쪽에 현재 디렉터리를 파란색으로 표시하고 왼쪽으로 이동하거나 줄을 나누는 것입니다. 마음대로 설정하면 됩니다.참고로 마지막 %}
은 알림의 변수를 표시할 때 펼쳐집니다.총결산
나는 Zsh로 스크립트를 만들어서 Giit 창고의 상태를 보여 주려고 했다.최소한의 상태 표시라면 30줄 정도면 쓸 수 있고, 조개 각본에 익숙하지 않은 분들은 이참에 한번 해보는 게 재밌잖아요.
참고 문헌
지트 창고에서 다른 창고를 만드는 건 좋지 않지만 용서해 주세요.↩︎
Reference
이 문제에 관하여(Zsh 프롬프트로 Giit 웨어하우스 정보 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kaityo256/articles/zsh-vcs-prompt텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)