zsh 커스터마이즈 — starship 프롬프트·history·alias·플러그인
macOS 기본 zsh를 30분 안에 작업감 좋은 셸로. starship + 히스토리 검색 + 자동 제안 + syntax highlighting.
macOS Catalina 이후 기본 셸이 zsh가 됐지만, 기본 설정만 쓰면 작업 효율이 낮다. Oh My Zsh를 통째로 깔면 무거워지고 부팅이 느려진다. 이 가이드는 필요한 만큼만 커스터마이즈 — starship 프롬프트, 히스토리 검색, 자동 제안, syntax highlighting, 자주 쓰는 alias 5종.
대상은 Mac 초기 셋업 후 zsh를 손보고 싶은 사람. dotfiles로 다른 머신에 옮기는 것까지 다룬다.
TL;DR
- starship — 빠르고 미려한 prompt (Oh My Zsh보다 가볍고 빠름)
- zsh-autosuggestions — 히스토리 기반 회색 제안 (fish 스타일)
- zsh-syntax-highlighting — 명령 입력 시 색상
- fzf shell integration —
Ctrl+R모던 히스토리 검색 .zshrc는 dotfiles 관리로 chezmoi에 commit
사전 조건
- macOS 14+ + Homebrew (Mac 초기 셋업)
- Terminal 또는 WezTerm/iTerm2 — Nerd Font 표시 가능한 것
1. 기본 zsh가 부족한 이유
- prompt에 git 정보 없음 — 브랜치/dirty 상태 안 보임
- 히스토리 검색 약함 —
Ctrl+R이 살아있지만 fuzzy 없음, 미려하지 않음 - 자동완성 미흡 — Tab 완성은 되지만 fish 스타일 회색 제안 없음
- syntax highlighting 없음 — 오타가 입력 후에야 보임
이걸 보완하면 매일 누리는 차이가 크다.
2. starship 프롬프트 (5분)
starship.rs — Rust로 작성된 빠른 cross-shell prompt. Oh My Zsh의 powerlevel10k보다 가볍고 부팅 거의 무지연.
2.1 설치
brew install starship.zshrc 끝에:
eval "$(starship init zsh)"새 터미널 열면 즉시 적용.
2.2 Nerd Font (아이콘용)
starship의 git 브랜치 아이콘·언어 아이콘 등을 보려면 Nerd Font 필요.
brew install --cask font-jetbrains-mono-nerd-font터미널 설정에서 폰트를 JetBrainsMono Nerd Font 로 변경. (WezTerm 가이드 참고).
2.3 미세 설정 (선택)
~/.config/starship.toml:
# 두 줄 prompt — 위 정보, 아래 입력
add_newline = true
format = """
$directory$git_branch$git_status$nodejs$python$rust$line_break$character"""
[character]
success_symbol = "[➜](bold green)"
error_symbol = "[✗](bold red)"
[directory]
truncation_length = 3
truncate_to_repo = true
[git_branch]
symbol = " "
style = "bold purple"
[git_status]
conflicted = "⚠️ "
ahead = "⇡${count} "
behind = "⇣${count} "
staged = "[+${count}](green) "
modified = "[!${count}](yellow) "
untracked = "[?${count}](red) "기본 설정도 훌륭하므로 처음엔 starship.toml 없이 시작 → 거슬리는 부분만 손보는 게 좋음.
3. 히스토리 — 잘못된 기본값 수정
.zshrc에 추가:
# 히스토리 크기
HISTSIZE=50000 # 메모리에 남기는 라인 수
SAVEHIST=100000 # 파일에 저장하는 라인 수
HISTFILE="$HOME/.zsh_history"
# 중복 제거 + 즉시 저장
setopt HIST_IGNORE_ALL_DUPS # 동일 명령 중복 제거
setopt HIST_REDUCE_BLANKS # 공백만 다른 명령 통합
setopt HIST_VERIFY # `!42` 같은 expansion 즉시 실행하지 않고 보여줌
setopt SHARE_HISTORY # 모든 zsh 인스턴스가 히스토리 공유
setopt INC_APPEND_HISTORY # 명령 실행 즉시 히스토리 파일에 추가
setopt EXTENDED_HISTORY # 타임스탬프 + 실행 시간 기록
# 검색 키 — Up/Down으로 prefix 매칭 검색
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down효과: git c 까지 입력하고 ↑ 누르면 git c로 시작하는 과거 명령만 순회.
4. zsh-autosuggestions (3분)
회색으로 다음 명령 자동 제안 (fish 셸 스타일). Tab 또는 → 로 수락.
brew install zsh-autosuggestions.zshrc 끝에:
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
# 회색 톤 (기본은 너무 어두움)
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'
# 너무 긴 명령은 제안 안 함 (성능)
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=80새 터미널 → 명령 입력 시 회색 제안 나타나면 OK.
5. zsh-syntax-highlighting (2분)
올바른 명령은 녹색, 잘못된 명령은 빨강, 옵션은 노랑 등으로 입력 중 색상화.
brew install zsh-syntax-highlighting.zshrc 끝(반드시 zsh-autosuggestions 다음):
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh순서 주의:
- autosuggestions
- syntax-highlighting (반드시 마지막)
순서 바뀌면 둘 다 가끔 망가짐.
6. fzf — Ctrl+R 모던 히스토리 검색
기본 Ctrl+R은 한 줄씩 역추적. fzf는 fuzzy 검색 + 미리보기.
brew install fzf
$(brew --prefix)/opt/fzf/install --all설치 스크립트가 .zshrc에 다음 자동 추가:
[ -f ~/.fzf.zsh ] && source ~/.fzf.zshCtrl + R— 히스토리 fuzzy 검색Ctrl + T— 현재 디렉토리 파일 fuzzy 선택 (e.g.,vim <Ctrl+T>)Alt + C— fuzzycd
더 자세히: Mac 초기 셋업 §3.2.
7. 자주 쓰는 alias 5종
.zshrc 또는 ~/.zsh_aliases (별도 파일 권장):
# git
alias g='git'
alias gs='git status -s'
alias gd='git diff'
alias gco='git checkout'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
# 파일 시스템 (eza — modern ls)
alias ls='eza --git --group-directories-first'
alias ll='eza -l --git --group-directories-first --icons'
alias la='eza -la --git --group-directories-first --icons'
alias tree='eza --tree --level=3'
# 디렉토리 이동
alias ..='cd ..'
alias ...='cd ../..'
# 빠른 reload
alias zrl='source ~/.zshrc'
# editor (VS Code or Cursor)
alias c='code .'길이 1자 alias는 충돌 위험.
g(git),c(code)는 사용자 의도 명확하면 OK.
8. 디렉토리 jump — zoxide
cd /Users/me/projects/myapp 대신 z myapp 한 글자로 jump. 자주 가는 디렉토리를 학습.
brew install zoxide.zshrc:
eval "$(zoxide init zsh --cmd cd)" # cd 명령 자체를 zoxide로 대체cd 가 zoxide로 대체됨. 평소처럼 쓰면 학습됨. 자주 가는 곳은 cd myapp 같이 부분 이름만으로 jump.
9. 통합 .zshrc 예시
처음부터 끝까지 통합한 예시 (참고용):
# ~/.zshrc
# ─────────────────────────────────────────────
# PATH
# ─────────────────────────────────────────────
export PATH="$HOME/.local/bin:$PATH"
# ─────────────────────────────────────────────
# History
# ─────────────────────────────────────────────
HISTSIZE=50000
SAVEHIST=100000
HISTFILE="$HOME/.zsh_history"
setopt HIST_IGNORE_ALL_DUPS HIST_REDUCE_BLANKS HIST_VERIFY
setopt SHARE_HISTORY INC_APPEND_HISTORY EXTENDED_HISTORY
# Up/Down — prefix search
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
# ─────────────────────────────────────────────
# Aliases
# ─────────────────────────────────────────────
alias g='git'
alias gs='git status -s'
alias gd='git diff'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
alias ls='eza --git --group-directories-first'
alias ll='eza -l --git --group-directories-first --icons'
alias la='eza -la --git --group-directories-first --icons'
alias ..='cd ..'
alias ...='cd ../..'
alias zrl='source ~/.zshrc'
alias c='code .'
# ─────────────────────────────────────────────
# Plugins (order matters)
# ─────────────────────────────────────────────
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#5f5f5f'
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=80
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# ─────────────────────────────────────────────
# Tools
# ─────────────────────────────────────────────
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
eval "$(mise activate zsh)" # 언어 버전 관리 — /mac/dev-toolchain
eval "$(zoxide init zsh --cmd cd)"
# ─────────────────────────────────────────────
# Prompt
# ─────────────────────────────────────────────
eval "$(starship init zsh)"10. 검증
# 새 터미널 열고
type starship # /opt/homebrew/bin/starship
ZSH_AUTOSUGGEST_USE_ASYNC=true # auto-suggest 활성
echo $HISTSIZE # 50000
# starship 프롬프트
cd ~/work/myrepo # 프롬프트에 git 브랜치·언어 아이콘 등장
# 자동 제안
git c # 회색 제안 — Tab으로 수락
# fzf
echo | history | head # 'git c' 입력 후 Ctrl+R — fuzzy 검색11. 트러블슈팅
프롬프트가 깨짐 (▢▢ 같은 텍스트)
Nerd Font 미설치. brew install --cask font-jetbrains-mono-nerd-font 후 터미널 폰트 변경.
command not found: starship
which starship결과 빈값 → brew prefix가 PATH에 있는가- Apple Silicon:
eval "$(/opt/homebrew/bin/brew shellenv)"가.zprofile에
새 터미널 부팅이 느림 (1초+)
.zshrc에서 무거운 명령(예:nvm)을 lazy loadzprof진단:.zshrc최상단zmodload zsh/zprof+ 최하단zprof | head -20
autosuggestions가 안 보임
.zshrc순서: syntax-highlighting이 autosuggestions 뒤ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE컬러가 배경과 너무 비슷하면 안 보임unset ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE후 기본 사용
syntax-highlighting이 명령 입력 직후 깜빡임
- WezTerm/iTerm2의
Render fast옵션 OFF - 또는
ZSH_HIGHLIGHT_MAXLENGTH=300으로 너무 긴 줄 비활성
zsh: no matches found: *.txt
zsh의 glob 기본은 strict. setopt NULL_GLOB을 .zshrc에 추가하거나, 명령 시 \*.txt로 escape.
12. 다음 단계
- Mac 초기 셋업 — /mac/initial-setup
- 터미널 — WezTerm/iTerm2 — /mac/terminal
- dotfiles 관리 (chezmoi) — /mac/dotfiles —
.zshrc를 다른 머신과 동기화 - 언어 툴체인 (mise) — /mac/dev-toolchain
참고
변경 이력
- 2026-05-16: 첫 작성. starship + 히스토리 + autosuggestions + syntax-highlighting + fzf + alias + zoxide + 통합 .zshrc 예시 + 트러블슈팅 6종.