개요
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-highlightingvsfast-syntax-highlighting= 둘 다 타이핑 중 색칠. fast가 더 빠르고 하이라이트가 풍부. 둘 중 하나만(같이 쓰면 충돌).history-substring-search,vi-mode= omz 에 번들 존재
업데이트
- omz 자동 업데이트는 omz 코어 + 번들만 갱신. custom clone은 직접
git pull. - 즉 외부 플러그인 업데이트는 omz-custom 이든 직접 관리하던 똑같이 수동이다.
CLI 도구 vs 플러그인 vs 바이너리
- CLI 도구(
zoxidefzfezafdripgrepbat) = 컴파일된 실행파일(바이너리)- OS 패키지 매니저로 설치 → macOS
brew, Archpacman, Ubuntuapt. (Ubuntu는 이름이 다름:bat→batcat,fd→fdfind)
- OS 패키지 매니저로 설치 → macOS
- omz 의
fzf,zoxide,ripgrep플러그인 = 그 바이너리를 위한 셸 통합/완성 레이어일 뿐 바이너리 설치가 아니다.ripgrep플러그인 =rg탭 완성 정의fzf플러그인 = 키바인딩+완성zoxide플러그인 =zoxide init zsh실행
| 바이너리 (brew) | 플러그인 (zsh 스크립트) | |
|---|---|---|
| 정체 | 실제 프로그램 | 셸에 얹는 코드 |
| 실행 | rg foo, z dir | source |
| 역할 | 독립 도구 | 그 도구의 완성, 키바인딩, init |
- 경계 흐림:
zoxide/fzf는 바이너리인데 셸 통합 스크립트도 같이 제공(eval "$(zoxide init zsh)", fzfkey-bindings.zsh). 바이너리가 본체, 스크립트는 접착제. eza/bat은 셸 훅이 거의 불필요해 플러그인 없이 alias 정도로 쓴다(alias ls='eza').
프롬프트 엔진
프롬프트 != 터미널 디자인이다. 프롬프트 = 커서 앞 정보 줄(경로, git 브랜치). 터미널 디자인(창, 폰트, 색)은 터미널 에뮬레이터(Ghostty) 담당.
| 도구 | 셸 지원 | 스타(2025) | 상태 |
|---|---|---|---|
| oh-my-zsh 테마 | zsh 전용 | (프레임워크) | - |
| starship | 크로스셸 | ~56.6k | 활발 |
| oh-my-posh | 크로스셸 | ~23.1k | 활발 |
| powerlevel10k | zsh 전용 | ~52.7k | life 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. 아직 실행 전이며 절차만 정리한다.
- 로컬에 구조 잡기 (omz 유지한 채 zsh 설정을
~/.config/zsh로. 부트스트랩은 11. Zsh 설정 파일 구조 참고) - 파일을 repo로 이동
mv ~/.zshenv ~/repos/dotfiles/.zshenv mv ~/.config/zsh ~/repos/dotfiles/.config/zsh - 홈에 심볼릭 링크 (
install.sh로 자동화)ln -s ~/repos/dotfiles/.zshenv ~/.zshenv ln -sfn ~/repos/dotfiles/.config/zsh ~/.config/zsh - 새 머신에선
git clone→install.sh한 방으로 복원.