Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

vcprompt를 이용해서 bash 프롬프트에 VCS 정보 표시하기

전에 bash 프롬프트에 Git와 Mercurial의 branch를 표시하기 라는 포스팅을 올렸었습니다. 이 방법을 1년동안 잘 사용하고 있었고 프롬프트에 Git이나 Mercurial의 정보가 표시된다는 것은 꽤나 유용했습니다. 다만 이 방법은 직접 쉘에 스크립트를 짠 것이기 때문에 Git과 Mercurial만 사용할 수 있었고 untracked file에 대해서 정확히 추적되지 않는 소소한 문제가 있었습니다.

어저께 nephilim님 의 프롬프트를 보다가 vcprompt 의 존재를 알게 되었습니다. vcprompt는 프롬프트에서 VCS의 정보를 조회해 볼 수 있는 유틸리티입니다. vcprompt는 GitMercurial 뿐만 아니라 Subversion, CVS, darcs, Fossil, Bazaar 까지 알려진 VCS를 거의 모두 지원하고 있습니다. vcprompt는 여러가지 버전이 존재하는데 저는 djl의 vcprompt 를 사용했습니다.

vcprompt 설치

vcprompt의 설치는 아주 간단합니다. 저장소에 올라와 있는 컴파일된 vcprompt파일 을 다운받아서 사용하면 됩니다. vcprompt를 다운받아서 PATH에 있는 경로에 추가하면 쉘에서 vcprompt를 사용할 수 있습니다. (파이썬 2.4 이상이 설치되어 있어야 하고 2.5이상을 추천합니다.)

vcprompt 포맷 사용 결과

vcprompt의 사용방법은 위와 같습니다. 현재 디렉토리가 VCS로 관리되지 않는다면 아무 결과도 나오지 않지만 VCS로 관리되는 디렉토리라면 위 처럼 정보를 조회해 볼 수 있습니다.

  • %s : VCS의 약칭(git, svn, cvs 처럼 표시된다.)
  • %n : VCS의 약칭(git, svn, cvs 처럼 표시된다.)
  • %h : 현재 커밋의 해쉬를 보여준다. 해쉬가 없으면 리비전을 보여준다.
  • %r : 현재의 리비전을 보여준다. 리비전이 없으면 해시를 보여준다.
  • %b : 브랜치명을 보여준다.
  • %m : 수정된 파일이 있으면 +를 출력하고 없으면 아무것도 출력하지 않습니다.
  • %u : 추적되지 않는 파일이 있으면 ?를 출력하고 없으면 아무것도 출력하지 않습니다.

vcprompt를 이용한 프롬프트

이전에는 직접 스크립트를 짜서 스크립트가 복잡했지만 vcprompt로 더 자세한 정보를 얻어올 수 있게 되었으므로 프롬프트에 대한 환경 설정을 다시 했습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
c_cyan=`tput setaf 6`
c_dark=`tput setaf 0`
c_red=`tput setaf 1`
c_green=`tput setaf 2`
c_pink=`tput setaf 5`
c_blue=`tput setaf 4`
c_sgr0=`tput sgr0`

show_repository ()
{
  echo -e "$(VCPROMPT_FORMAT=($(tput setaf 3)%s$(tput sgr0):$(tput setaf 6)%h$(tput sgr0)@$(tput setaf 2)%b$(tput setaf 1)%m$(tput setaf 5)%u$(tput sgr0)) vcprompt)"
}

export PS1='\[${c_cyan}\]\u\[${c_sgr0}\]@\[${c_blue}\]\h\[${c_sgr0}\]:\w\[${c_sgr0}\] $(show_repository)\n\$ '

앞부분은 프롬프트에 색을 지정하기 위해서 단축명령어를 만들 것이고 show_repository함수가 vcprompt를 이용해서 저장소를 출력해 주는 부분입니다. 앞에서 살펴본 vcprompt의 포맷을 이용하면 다양하게 출력할 수 있는데 vcprompt는 VCPROMPT_FORMAT라는 환경변수에 설정된 포맷을 기본 포맷으로 사용합니다. 앞에서 vcprompt를 출력했을 때 나온 값은 기본 포맷이 %s:%b이기 때문에 VCS종류와 브랜치만 표시된 것입니다. 이 환경변수를 설정해 놓으면 자동으로 먹기는 하는데 저는 이상하게 환경변수를 타지 않아서 vcpromt를 실행할 때 환경변수를 전달해 주었습니다.

눈에 띄기 쉽게 정보마다 다른 색을 지정해 주었고 버전컨트롤 되지 않는 폴더에서는 정보가 출력되지 않으므로 아무것도 나오지 않습니다. 마지막에 PS1부분이 실제 프롬프트를 커스터마이징 한 부분인데 사용자 계정명과 호스트네임을 출력하고 경로를 출력해 준 뒤에 VCS 정보를 출력해 주도록 했습니다. 그리고 경로명이 길어지는 것 때문에 프롬프트가 우측으로 밀리는게 은근이 짜증나서 줄바꿈을 해서 두줄로 출력되도록 했습니다.

vcprompt를 프롬프트에 적용한 모습

이제 완성된 프롬프트는 위와 같은 형태가 됩니다. 의도적으로 좀 다채로운 칼라를 사용했습니다. VCS 종류와 함께 해쉬태그와 브랜치명이 함께 표시되고 수정된 파일이 있으면 +가 표시되고 추적되지 않는 파일이 있으면 ?가 출력됩니다. 몇시간 고생했지만 프롬프트가 완성되니 기분이 좋군요.(vcprompt를 사용해서 머큐리얼을 사용하는 폴더에서 약간 느린 것은 어쩔 수 없더군요.)

Valid HTML5 Valid CSS WCAG 2.1 AA tested