devAlice
← Mac

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

  1. starship — 빠르고 미려한 prompt (Oh My Zsh보다 가볍고 빠름)
  2. zsh-autosuggestions — 히스토리 기반 회색 제안 (fish 스타일)
  3. zsh-syntax-highlighting — 명령 입력 시 색상
  4. fzf shell integrationCtrl+R 모던 히스토리 검색
  5. .zshrcdotfiles 관리로 chezmoi에 commit

사전 조건

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

순서 주의:

  1. autosuggestions
  2. 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.zsh
  • Ctrl + R — 히스토리 fuzzy 검색
  • Ctrl + T — 현재 디렉토리 파일 fuzzy 선택 (e.g., vim <Ctrl+T>)
  • Alt + C — fuzzy cd

더 자세히: 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 load
  • zprof 진단: .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. 다음 단계


참고

변경 이력

  • 2026-05-16: 첫 작성. starship + 히스토리 + autosuggestions + syntax-highlighting + fzf + alias + zoxide + 통합 .zshrc 예시 + 트러블슈팅 6종.

댓글