개요


Zsh 환경을 꾸미는 건 네 개의 독립된 층으로 나뉜다. 이걸 구분해야 “뭐가 뭘 하는지”가 안 헷갈린다.

  • 프레임워크 = 설정을 묶어 관리하는 도구 (oh-my-zsh) 또는 안 씀(직접 조립)
  • 플러그인 = 셸에 얹는 zsh 스크립트 (자동제안, 하이라이트 등).
  • 프롬프트 = 커서 앞 정보 줄을 그리는 것 (starship 등)
  • CLI 도구 = 독립 실행파일 (zoxide, fzf, bat 등)

그리고 이 설정 파일들은 dotfiles 로 모아 git 으로 버전관리한다. Zsh 시작 파일 구조는 11. Zsh 설정 파일 구조, 경로 표준은 12. XDG Base Directory 참고.

프레임워크: oh-my-zsh


  • oh-my-zsh(omz) = 올인원 프레임워크
    • ~/.oh-my-zsh/ 에 통째로 clone 된 큰 레포
    • 플러그인 관리 + 프롬프트 테마 + lib/ 의 기본값(history, completion, keybinding, color) + 자동업데이트를 다 얹는다
  • 직접 설정 = 프레임워크 없이 순수 zsh를 직접 조립
    • 플러그인은 직접 clone, source, 프롬프트는 starship, 기본값도 직접 작성
oh-my-zsh직접 설정
형태프레임워크(올인원)프레임워크 없음
플러그인자체 시스템, plugins=(...)직접 clone + source
프롬프트omz 테마starship
시작 속도무거워질 수 있음빠름
투명성낮음(블랙박스)높음(모든 줄이 보임)
재현성새 머신에 omz 먼저 설치설정이 플러그인까지 clone → 한 방
  • omz 의 숨은 값어치 = lib/ 가 history, completion, keybinding 기본값을 알아서 세팅. 직접 설정은 이걸 직접 써야 하지만 그만큼 투명하다.
  • 하이브리드도 가능하다: omz로 플러그인, 기본값을 맡기고, 커스텀(alias, 바인딩, fzf)만 모듈 .zsh로 정리해 .zshrc에서 source.

플러그인


  • 플러그인 = 순수 zsh 스크립트(.zsh). source 하면 zsh의 입력기(ZLE, Zsh Line Editor) 훅에 끼어들어 “타이핑 중 자동제안”, “구문 하이라이트” 같은 실시간 기능을 준다.
  • brew install zsh-autosuggestions 도 바이너리 컴파일이 아니라 그 .zsh 스크립트를 갖다놓는 것뿐이다.

설치 3방법

  • brew + source : source "$(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh". 업데이트는 brew upgrade.
  • omz plugins=(...) 배열 : 이름 추가하면 omz 가 source. 단 외부 플러그인은 먼저 clone 돼 있어야 함(아래).
  • 수동 매니저 : 직접 git clone 후 source. 첫 실행에 자동 clone 하는 함수로 감싸기도 함.

omz 번들 vs 커스텀

  • ~/.oh-my-zsh/plugins/ = omz 에 기본 포함된 번들(약 350개). clone 한 게 아니라 딸려온 것. plugins=(...) 에 이름 넣은 것만 로드되고 나머지는 방치.
  • ~/.oh-my-zsh/custom/plugins/ = 내가 직접 clone 한 외부 플러그인 위치. (번들 디렉터리에 clone 하면 omz 업데이트 때 덮어써지니 여기에)
  • omz 는 이름을 받으면 custom → 번들 순으로 찾아 <name>.plugin.zsh 를 source.

대표 플러그인

  • zsh-autosuggestions = 이전 명령 기반 회색 제안. (외부, clone 필요)
  • zsh-syntax-highlighting vs fast-syntax-highlighting = 둘 다 타이핑 중 색칠. fast가 더 빠르고 하이라이트가 풍부. 둘 중 하나만(같이 쓰면 충돌).
  • history-substring-search, vi-mode = omz 에 번들 존재

업데이트

  • omz 자동 업데이트는 omz 코어 + 번들만 갱신. custom clone은 직접 git pull.
  • 즉 외부 플러그인 업데이트는 omz-custom 이든 직접 관리하던 똑같이 수동이다.

CLI 도구 vs 플러그인 vs 바이너리


  • CLI 도구(zoxide fzf eza fd ripgrep bat) = 컴파일된 실행파일(바이너리)
    • OS 패키지 매니저로 설치 → macOS brew, Arch pacman, Ubuntu apt. (Ubuntu는 이름이 다름: batbatcat, fdfdfind)
  • omz 의 fzf, zoxide, ripgrep 플러그인 = 그 바이너리를 위한 셸 통합/완성 레이어일 뿐 바이너리 설치가 아니다.
    • ripgrep 플러그인 = rg 탭 완성 정의
    • fzf 플러그인 = 키바인딩+완성
    • zoxide 플러그인 = zoxide init zsh 실행
바이너리 (brew)플러그인 (zsh 스크립트)
정체실제 프로그램셸에 얹는 코드
실행rg foo, z dirsource
역할독립 도구그 도구의 완성, 키바인딩, init
  • 경계 흐림: zoxide/fzf 는 바이너리인데 셸 통합 스크립트도 같이 제공(eval "$(zoxide init zsh)", fzf key-bindings.zsh). 바이너리가 본체, 스크립트는 접착제.
  • eza/bat 은 셸 훅이 거의 불필요해 플러그인 없이 alias 정도로 쓴다(alias ls='eza').

프롬프트 엔진


프롬프트 != 터미널 디자인이다. 프롬프트 = 커서 앞 정보 줄(경로, git 브랜치). 터미널 디자인(창, 폰트, 색)은 터미널 에뮬레이터(Ghostty) 담당.

도구셸 지원스타(2025)상태
oh-my-zsh 테마zsh 전용(프레임워크)-
starship크로스셸~56.6k활발
oh-my-posh크로스셸~23.1k활발
powerlevel10kzsh 전용~52.7klife support(신기능 없음)
  • starship = Rust, starship.toml 하나로 선언적 커스텀, 크로스셸(bash/zsh/fish 동일), 빠름.
  • omz 테마 = zsh prompt escape로 그림. p10k는 omz 호환 테마지만 유지보수 사실상 중단.
  • transient prompt(명령 실행 후 이전 프롬프트를 최소형으로 접기)는 starship이 zsh에서 네이티브 미지원(수동 우회 필요), oh-my-posh는 네이티브 지원. 니치 기능.
  • 결론: 크로스셸 + 스타 1위 + 활발 + 설정 쉬움으로 starship 권장. omz 유지 중이면 ZSH_THEME="" 로 omz 테마만 끄고 eval "$(starship init zsh)" 로 공존 가능(복귀도 쉬움). 아이콘 렌더링엔 Nerd Font 필요.

dotfiles 관리


dotfiles = 홈(~)의 . 로 시작하는 설정 파일들. git 레포에 모아 버전관리하고, 새 머신에서 clone → 링크로 환경을 복원한다.

심볼릭 링크 vs 복사

  • 복사 = 홈과 repo에 파일이 각각 따로. 하나 고쳐도 다른 쪽은 그대로 → 수동 sync 필요.
  • 심볼릭 링크 = 실체는 repo에 하나, 홈엔 그걸 가리키는 포인터. 어느 경로로 고쳐도 같은 파일 → sync 불필요. (권장)
ln -s  ~/repos/dotfiles/.config/zsh  ~/.config/zsh
#      └─ 실체(source, repo) ────┘   └─ 이름표(link, 홈) ─┘

앱별 링크

  • ~/.config 통째로 링크하지 않는다. 앱들이 만드는 캐시, 상태, 런타임 잡동사니까지 git에 딸려온다.
  • 트래킹할 앱만 골라 링크: zsh, nvim, tmux, ghostty 등. 새 도구 추가할 때마다 그 앱의 ~/.config/<app>을 링크 목록에 추가.

절대 repo에 넣지 말 것

  • 비밀/자격증명: .ssh/(개인키), .aws/, .kube/, .docker/, 각종 토큰. git에 올리면 유출된다.
  • 자동생성 state/cache: .zsh_history, .zcompdump-*, .zsh_sessions/ 등은 홈에 방치.

마이그레이션 절차 (계획)

목적지 repo 는 ~/repos/dotfiles. 아직 실행 전이며 절차만 정리한다.

  1. 로컬에 구조 잡기 (omz 유지한 채 zsh 설정을 ~/.config/zsh로. 부트스트랩은 11. Zsh 설정 파일 구조 참고)
  2. 파일을 repo로 이동
    mv ~/.zshenv        ~/repos/dotfiles/.zshenv
    mv ~/.config/zsh    ~/repos/dotfiles/.config/zsh
  3. 홈에 심볼릭 링크 (install.sh로 자동화)
    ln -s  ~/repos/dotfiles/.zshenv      ~/.zshenv
    ln -sfn ~/repos/dotfiles/.config/zsh ~/.config/zsh
  4. 새 머신에선 git cloneinstall.sh 한 방으로 복원.

References