기타/기타

[기타] oh-my-zsh, iTerm2 없이 mac 터미널 세팅하기

ready-go 2023. 11. 5. 17:08

터미널 커스터마이징

mac을 구매하고 처음 터미널을 열면 검은 바탕에 흰 글씨만 보인다. 개발자스러운 디자인이지만, 실제 개발자들은 대부분 이대로 사용하지 않는다. 가독성이 떨어질 뿐만 아니라, 화면에 보이는 정보들도 적고 타이핑도 느려져 생산성이 떨어진다. 따라서 생산성과 효율성을 중요시하는 개발자들은 자신의 필요에 맞게 다양한 기능을 추가하고, 여러가지 색깔로 자신만의 터미널을 꾸민다.

 

그런데 이렇게 터미널을 꾸미는 일은 자주 일어나지 않는다. 기껏해야 3~4년에 한 번쯤 회사에서 장비를 교체할 것이고, 집에서는 mac을 사용한다고 해도 5년정도는 사용할 것이기 때문이다. 그래서 항상 구글에 맥북 초기 세팅을 검색하고, 블로그의 글을 보고 oh-my-zsh과 iTerm2를 설치하게 된다. 그런데 이 조합이 과연 최선일까?

 

oh-my-zsh

oh-my-zsh - https://ohmyz.sh

oh-my-zsh는 zsh에 다양한 기능을 지원하는 플러그인과 누군가 만들어놓은 색상 테마들을 쉽게 적용할 수 있게 도와주는 프로그램이다. 기본 제공하는 git 플러그인을 포함해 무려 300개가 넘는 플러그인을 지원하고, 150개의 테마가 기본적으로 제공된다. 이렇게 다양한 선택지가 있는 만큼 무거운 프로그램일 것 같지만, 실제로 코드를 확인해보면 zsh 자체의 수많은 기능을 지원하기 위한 스크립트가 대부분이다.

 

그러나 개인적으로 사용하면서 느낀 단점은 업데이트가 너무 자주 일어난다는 것이다. 간만에 터미널을 열면 oh-my-zsh 업데이트를 할 것이냐고 묻는다. y/n 중 하나를 입력해야 하는데, 실수로 한글로 ㅛ를 누르면 지우지도 못하고 스킵해버린다. 또한, 플러그인이라고 하는 것들의 대부분은 단순히 alias를 제공하는 것들이 대부분이라 그다지 실용적이지도 않다.

 

iTerm2

iTerm2 - https://iterm2.com/index.html

iTerm2는 mac에서 기본 제공하는 터미널 대신 사용할 수 있는 앱이다. 개인적으로는 사용해 본 적이 없기 때문에 잘은 모르지만, 홈페이지의 기능 설명을 보면 한 개의 창을 나눠 사용하는 split 기능, 단축키로 한 번에 터미널을 여는 hotkey 기능, 자동 완성, 검색 등이 있다고 한다.

 

그러나 이러한 기능들은 기본 터미널에서도 제공하는 것들이 많다. 예를 들어, 터미널에서도 cmd + d로 split을 할 수 있고, cmd + f로 검색을 할 수 있다. 또한, zsh-autosuggestions를 설치하면 자동완성 기능도 사용할 수 있다. 물론, 같은 기능도 UI에 따라 더 편한 것들이 있고, 내가 알지 못하는 편의기능들이 있을 수도 있다.

 

서론이 길었는데, 이번 글에서는 oh-my-zsh와 iTerm2와 같이 잘 알려진 도구를 사용하지 않고 터미널을 꾸며볼 것이다. 이런 짓을 하는 이유는 oh-my-zsh나 iTerm2가 불편하거나 좋지 않아서가 아니다. 단지 이러한 도구들이 꼭 필요할까에 대한 궁금증에서 시작하게 되었고, 이것들을 사용하지 않고 터미널을 꾸미는 것을 보여줌으로써 많은 사람들에게 선택지를 늘려주기 위함이다.

 

프롬프트 커스터마이징

가장 먼저 터미널에서 보여주는 프롬프트를 바꾸고 색깔을 알록달록하게 커스터마이징 해보자. oh-my-zsh를 사용할 때 기본 테마로 적용된 robbyrussell이라는 테마를 참고해보자.

oh-my-zsh의 robbyrussell 테마

맨 먼저 초록색 화살표가 들어가고, 현재 디렉토리 위치가 나타난다. 또, 해당 디렉토리의 git 브랜치도 보여주고, 가독성이 좋게 색깔이 들어가있다. 실제 코드를 확인해보자.

PROMPT="%(?:%{$fg_bold[green]%}%1{➜%} :%{$fg_bold[red]%}%1{➜%} ) %{$fg[cyan]%}%c%{$reset_color%}"
PROMPT+=' $(git_prompt_info)'

ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}%1{✗%}"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"

코드 - https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/robbyrussell.zsh-theme

굉장히 복잡해 보이지만 색깔을 입히는 문법을 제외하면 별게 없다. 위 코드에서는 %{$fg[green]%}처럼 색깔을 지정하는데, %F{color}과 %f 사이에 텍스트를 넣는 방식으로도 색깔을 지정할 수 있다. 선택 가능한 색깔은 black, red, yellow, blue, green, magenta, cyan이 있다. 여기에 여러가지 포맷 문자를 이용해서 프롬프트에 나타날 텍스트를 정해줄 수 있다.

  • %n - 유저 이름
  • %d - 전체 디렉토리
  • %c - 현재 폴더
  • %T, %t - 시간(24시간 / 12시간)
  • %D, %W - 날짜(yy-mm-dd / mm/dd/yy)

참고 - https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html

또한, git 정보도 가져와야 하는데, 이것은 zsh의 vcs_info를 이용하면 된다.

autoload -Uz vcs_info

setopt prompt_subst
zstyle ":vcs_info:*" enable git
zstyle ":vcs_info:*" formats "%F{magenta}(%b)%f "

precmd() { vcs_info }

git을 활성화시켜준 다음, 브랜치 이름을 magenta 색깔로 지정해주었다. 여기서도 역시 다양한 포맷 문자를 사용해서 자신만의 프롬프트를 만들 수 있다.

  • %b - 브랜치 이름
  • %s - git, hg, svn 등의 VCS 이름
  • %r - 레포지토리 이름
  • %c / %u - stage된 것이 있는 경우 / 없는 경우

참고 - https://zsh.sourceforge.io/Doc/Release/User-Contributions.html#Version-Control-Information

 

최종적으로 아래와 같은 프롬프트를 만들어주었다.

PROMPT='%(?:%F{green}%1{➜%}%f :%F{red}%1{➜%}%f )%F{cyan}%c%f ${vcs_info_msg_0_}%F{blue}%(!.#.$)%f '

만들어진 프롬프트를 설명하자면, (?:A:B) 문법을 사용해 이전 커맨드가 성공했으면 초록색 화살표, 실패했으면 빨간색 화살표를 보여준다. 이후에 cyan색으로 현재 폴더를 보여주고, git 브랜치 이름을 magenta 색깔로 보여준다. 마지막으로 (!.#.$)은 현재 priviliged 권한이면 #, 일반 유저이면 $을 보여준다는 뜻이다.

최종 결과물

 

CLI Color

프롬프트의 색깔은 알록달록하지만, 여전히 화면에는 흰 글씨가 많다.

ls 명령어 실행

여기에 색깔을 입혀주기 위해서는 CLICOLOR 옵션을 추가하면 된다.

export CLICOLOR=1

ls 명령어 실행

이제 디렉토리는 파란색, 파일은 흰색으로 색깔이 구분된다.

 

Syntax Highlighting

다음으로, 사용자의 입력에도 색깔을 입혀보자. brew를 이용해 zsh-syntax-highlighting을 설치하고, ~/.zshrc 설정을 추가하면 된다.

brew install zsh-syntax-highlighting
echo "source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc

이제 다시 ls 명령어를 실행해보자.

ls 명령어 실행

입력한 명령어가 실행하능하면 초록색, 아니면 빨간색으로 하이라이트가 표시된다.

 

Auto Suggestions

이번에는 사용자의 이전 입력을 바탕으로 명령어를 추천해주는 기능이다. 이 기능을 이용하면 이전에 했던 명령어들을 반복해서 타이핑하지 않아도 되기 때문에 매우 편리하다. 마찬가지로 brew를 이용해 zsh-autosuggestions를 설치하고 zshrc에 한 줄을 추가한다.

brew install zsh-autosuggestions
echo "source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc

auto suggestions

이제 명령어를 다 입력하지 않아도 이전에 실행한 명령어를 볼 수 있고, 화살표 오른쪽 키를 누르면 자동으로 완성시켜준다.

 

Vim Syntax Highlighting

마지막으로, zsh은 아니지만 zsh을 사용할 때 많이 사용하는 vim 편집기에도 색깔을 입혀주자.

test.py

위와 같이 vim으로 python 파일을 편집한다고 해보자. 그런데 글자가 모두 흰색이면 알아보기가 어렵다. ~/.vimrc 파일에 syntax highlighting을 사용하겠다고 옵션을 주면 된다.

if has("syntax")
    syntax on
endif

다시 vim으로 test.py을 열어보면 아래와 같이 색깔이 들어간 것을 확인할 수 있다.

여기서는 최소한의 설정만 주지만, 이외에도 들여쓰기, 인코딩, 라인 넘버 등 다양한 옵션을 추가해 줄 수 있다.

 

최종 파일

~/.zshrc

autoload -Uz vcs_info

setopt prompt_subst
zstyle ":vcs_info:*" enable git
zstyle ":vcs_info:*" formats "%F{magenta}(%b)%f "

PROMPT='%(?:%F{green}%1{➜%}%f :%F{red}%1{➜%}%f )%F{cyan}%B%c%b%f %B${vcs_info_msg_0_}%b%F{blue}%(!.#.$)%f '

precmd() { vcs_info }

source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh

export CLICOLOR=1

~/.vimrc

if has("syntax")
    syntax on
endif

 

3줄 요약

  1. mac을 처음 구매하면 자신의 입맛에 맞게 터미널을 꾸미자
  2. ~/.zshrc만 수정하면 쉽게 커스터마이징 가능하다
  3. oh-my-zsh는 비추천, iTerm2는 취향에 따라 선택하자