sonumb

zsh 프롬프트 변경하기 본문

개발자 이야기

zsh 프롬프트 변경하기

sonumb 2020. 10. 12. 14:17

 

참조: zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html

 

zsh: 13 Prompt Expansion

A ‘#’ if the shell is running with privileges, a ‘%’ if not. Equivalent to ‘%(!.#.%%)’. The definition of ‘privileged’, for these purposes, is that either the effective user ID is zero, or, if POSIX.1e capabilities are supported, that at le

zsh.sourceforge.net

1. 프롬프트를 변경해서, 알면 좋은 것? 혹은 원하는 기능?

아이맥이나 맥북 기준으로, 아래와 같다.

  • iterm2를 이용할 때, LANG이 UTF인 터미널이랑 C 인 터미널이 구분되었으면 좋겠다.
  • IP 나왔으면 좋겠다..
  • 날짜도..
  • git 브랜치 이름이 나왔으면..
  • 현재 경로도 나왔으면...

2. ~/.zshrc 수정

1. 일단 언어에 따른 터미널 구별이 되도록 프로파일 이름을 명명한다.

그리고 이 이름은 ITERM_PROFILE 변수를 이용해서 얻어올 수 있다.

UTF-8 환경의 iterm2가 세팅한 쉘변수

2. ip는 프롬프트 포맷 specifier가 없으므로, ifconfig 명령어로 획득하면 될 듯하다.

3. 날짜는 프롬프트 포맷 지시자가 있으나, 요일이 나오지 않는다. 이것도 date 명령으로 실행하면 된다.

4. git branch 출력은 git branch 혹은 git symbolic-ref 명령어를 이용하면 됨. git branch 명령어를 통한 현재 브랜치 이름 출력은 보단 symbolic-ref 를 추천한다. (브랜치 개수가 많아지면, symbolc-ref 명령어가 유리함)

 

또한, 문자열 치환은 필수적인데, awk로 하면 느려지므로 쉘변수 치환 구문을 이용하는게 좋다.

 

git rev-parse --abbrev-ref HEAD 명령어로 한방에 해결.

 

5. 현재 경로는 위의 zsh 문서 링크를 참조하자. (색깔 입히기는 덤으로)

위와 같은 사실들을 확인했고, 아래 내용을 ~/.zshrc 파일에 추가해주었다.

# get_ip 는 현재 자신의 ip 주소를 획득하는 함수다. 단 무선과 유선을 동시에 쓴다면 유선의 주소를 반환한다.
# 단 mac 전용이다
get_ip()
{
  MAIN_IP=""
  for i in `seq 4 8`;
  do
    _status=`ifconfig en${i} 2>&1 | grep -w status | cut -d' ' -f2` # status
    if [[ $_status == "active" ]]; then
      MAIN_IP=`ifconfig en${i} | grep -w inet | cut -d' ' -f2` # wired internet
      if [[ ! -z "$MAIN_IP" ]]; then
        break
      fi
    fi
  done;

  if [[ -z "$MAIN_IP" ]]; then
    MAIN_IP=`ifconfig en0 | grep -w inet | cut -d' ' -f2` # wireless internet
  fi

  echo ${MAIN_IP}
}

# git 브랜치 이름 획득하는 함수
parse_git_branch() {
  # ver 1:
  # git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'

  # ver 2:  awk가 실행이 느리므로 버벅인다.
  # git symbolic-ref HEAD 2> /dev/null | awk 'BEGIN{FS="/"} {print $NF}' 

  # ver 3: ver1이랑 속도가 비슷하나 이게 조금 빠르다. sed 때문인 듯 
  # branch_name=$(git symbolic-ref HEAD 2> /dev/null)
  # echo ${branch_name##*/}

  # ver 4: 문자열 치환이 필요없다.
  git rev-parse --abbrev-ref HEAD
}

setopt prompt_subst #이 명령어를 수행해야, 아래의 홑따옴표로 이뤄진 문자열 프롬프트를 실행할 수 있다.
export PROMPT='
[$ITERM_PROFILE] %F{green}`date +"[%Y-%m-%d (%a)][%H:%M:%S]"`%f $USER@%F{cyan}`get_ip`%f %F{magenta}[$tb_display_name: $(parse_git_branch)]%f
 %F{yellow}%~%f
%F{green}%#%f '

3. 결과물

LANG이 C 인 터미널

LANG이 UTF-8인 터미널

 

반응형