zshell 적용하기

신년을 맞이하여 shell을 z shell(zsh)로 바꾸어 보았다.

zsh 설치

신년을 맞이하여 기분 전환으로 z shell을 설치하여 사용해 보았다. 나름 멋도 있고 편리한 점도 있어서 간단히 기록을 남겨본다.
시스템에 z shell(zsh) 설치는 아래와 같이 간단히 할 수 있다.

$ sudo apt install zsh

zsh를 조금 더 편리하게 사용하기 위한 zsh 프레임워크인 Oh My Zsh는 아래와 같이 설치할 수 있다. (즉, 사용자 별로 설치하는 것임)

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

설치 시에 기본 shell을 zsh로 바꿀 것인지 물어보므로 이때 변경해도 되고, 이후라도 언제든지 아래와 같이 chsh 명령을 이용해서도 변경 가능하다.

$ chsh -s $(which zsh)

Oh My Zsh를 설치한 이후에, Oh My Zsh의 업데이트는 아래와 같이 할 수 있다.

$ omz update

설치가 완료되었으면 ~/.bashrc 파일에서 추가하였던 설정들을 그대로 ~/.zshrc 파일로 가져온다.

zshell 플러그인 설치

용도와 목적에 따라 여러 플러그인들이 있지만, 주로 아래 플러그인들은 기본적으로 많이 설치하는 것 같아서 나도 설치하였다.

  • Syntax highlighting (올바른 명령이면 녹색, 틀린 명령이면 빨간색으로 표시됨)
    $ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
    

    단, bash를 사용할 때 처럼 없는 명령어의 경우 APT 패키지 설치를 제안해주지는 않는다는 단점이 있다. APT 패키지 설치를 제안받고 싶으면 bash 명령을 통해 bash shell을 잠시 사용한 후에 exit 명령으로 다시 zshell로 돌아오는 방법을 사용할 수 있겠다.

  • Auto suggestion (다음 명령이나 아규먼트를 history 기반하여 보여줌)
    $ git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
    

    전체 적용은 위나 오른쪽 화살표를 누르면 되고, 단어 단위로 적용하려면 Ctrl+오른쪽 화살표를 누르면 된다.

위와 같이 플러그인을 다운받았으면 ~/.zshrc 파일에서 plugins 항목에 아래 예와 같이 추가해 주면 된다. (git 플러그인은 기본으로 적용되어 있음)

plugins=(git zsh-syntax-highlighting zsh-autosuggestions)

플러그인 적용은 다시 로그인하거나, 아래와 같이 실행하면 반영된다.

$ source ~/.zshrc

테마 설정

기본 테마는 robbyrussell인데, 기본 테마 중에서 많이 사용되는 agnoster로 변경해 보았다. 테마 변경은 ~/.zshrc 파일에서 아래와 같이 ZSH_THEME로 세팅하면 된다.

ZSH_THEME="agnoster"

그런데 쉘 프롬프트가 내가 선호하지 않는 장황한 형식으로 나와서, ~/.zshrc 파일에서 아래 부분을 추가하여 host name, user ID가 출력되지 않도록 하였다.

prompt_context() {
  if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
  fi
}

그런데 커맨드 프롬프트 상태에서는 home/end 키가 제대로 동작하지 않았다. 구글링 끝에 ~/.zshrc 파일에 아래 내용을 추가해 주니, 정상 동작하였다.

bindkey '^[[H' beginning-of-line
bindkey '^[[F' end-of-line

기타 팁

터미널 색상 설정

vim에서 설정한 color scheme이 제대로 표시되지 않았다. 원래 이를 위해 ~/.bash 파일에서 TERM을 설정하였으므로, 아래와 같이 동일한 설정을 ~/.zshrc 파일에도 추가하니 되었다.

export TERM='xterm-256color'

Suggestion 색깔은 ~/.zshrc 파일에서 아래 예와 같이 변경할 수 있다. (foreground는 xterm-256-color 값 중의 하나로 아래 예에서는 242로 세팅)

ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=242'

“no matches found” 에러

bash 사용 시에는 문제 없었던 명령이 zsh 환경에서 “no matches found” 에러가 발생하는 경우가 있다. 이는 zsh는 bracket을 globbing, pattern matching 용으로 사용하기 때문인데, 이 경우 명령 맨 앞에 ‘noglob’를 붙이면 해결된다.

make 타겟 completion이 올바르지 않는 문제

그런데 zsh를 설치하면 (다른 플러그인을 설치하지 않은 경우에도) make 명령을 실행한 후에 tab 키를 누르면, 사용 가능한 타겟만 보여주는 것이 아니라 Makefile에 있는 모든 variable도 보여주는 문제점이 있었다.
이 경우 ~/.zshrc 파일에 아래 내용을 추가한다.

zstyle ':completion:*:*:make:*' tag-order 'targets'

또 /usr/share/zsh/functions/Completion/Unix/_make 파일의 맨 끝 부분의 else 부분을 아래와 같이 수정한다.

if [[ $PREFIX == *'='* ]]
then
  # Complete make variable as if shell variable
  compstate[parameter]="${PREFIX%%\=*}"
  compset -P 1 '*='
  _value "$@" && ret=0
else
  _alternative \
  'targets:make target:compadd -Q -a TARGETS' \
  'variables:make variable:compadd -S = -F keys -k VARIABLES' && ret=0
fi

그런데 이렇게 적용해도 테스트 결과 bash를 쓸 때처럼 완벽히 보여주진 못했다. 임시 대책으로 이 경우에는 잠시 bash를 실행시켜서 사용 가능한 make 타겟을 얻어야겠다.😟

카테고리:

업데이트: