Skip to content
.zshrc 相关配置笔记

基本设置 ​

sh
# 不保留历史记录
export SAVEHIST=0

环境变量 ​

sh
export PATH=/Users/ryan/.flutter/flutter/bin:$PATH

export PUB_HOSTED_URL=https://pub.flutter-io.cn

命令别名 ​

sh
alias myip="ifconfig | grep inet\ "

alias chrome="open -n /Applications/Google\ Chrome.app/ --args --disable-web-security -incognito  --user-data-dir=/Users/ryan/MyChromeDevUserData/"

补全系统(zsh 内置,零依赖) ​

sh
# compinit 是一切智能补全的来源(git/kill/ssh 的选项、进程、分支等)
# 位置:必须放在 .zshrc 前部,先于任何依赖 compdef 的代码
# (例:vite-plus 的 env 里有 compdef _vpr_complete vpr,顺序反了会静默失效)
autoload -Uz compinit && compinit

# 多候选时进入列表选择(方向键 + 高亮,回车接受,ESC 退出)
zstyle ':completion:*' menu select

# 不区分大小写(saf<Tab> → Safari)
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# 列表上色(macOS 无 GNU ls,LS_COLORS 为空,必须直接写配色)
# 目录蓝 34 / 链接青 35 / 可执行红 31 / 管道黄 33 / socket 绿 32
zstyle ':completion:*' list-colors 'di=34:ln=35:ex=31:pi=33:so=32:bd=34;46:cd=34;43'

# 候选按类型分组显示(标题文字来自系统补全函数,为英文)
zstyle ':completion:*' group-name ''
zstyle ':completion:*:descriptions' format '%F{yellow}── %d ──%f'
zstyle ':completion:*:warnings' format '%F{red}── 无匹配 ──%f'

# 近似匹配:打错也能补(最多 2 个字符错,如 git chekout<Tab>)
zstyle ':completion:*' completer _complete _ignored _approximate
zstyle ':completion:*:approximate:*' max-errors 2 numeric

# 光标在词中间也能补全,补完跳词尾
setopt COMPLETE_IN_WORD ALWAYS_TO_END

# 检查是否生效:非 0 即已启用(正常 1700+ 条)
echo ${#_comps}

历史记录增强 ​

sh
setopt HIST_IGNORE_ALL_DUPS
setopt SHARE_HISTORY EXTENDED_HISTORY   # 多窗口实时共享 + 时间戳
export HISTCONTROL=ignoreboth:erasedups
HISTSIZE=20000                          # 系统默认仅 2000/1000
SAVEHIST=20000

编辑手感 ​

sh
# ↑↓ 按已输入内容前缀搜索历史(只翻以当前输入开头的命令)
# 普通模式和应用模式序列都要绑:zle 编辑时 Ghostty 发的是应用模式序列
bindkey '^[[A' history-search-backward
bindkey '^[OA' history-search-backward
bindkey '^[[B' history-search-forward
bindkey '^[OB' history-search-forward

setopt AUTO_CD AUTO_PUSHD PUSHD_IGNORE_DUPS   # 输目录名直接进;cd 自动入栈
setopt NO_BEEP NO_FLOW_CONTROL                # 关蜂鸣;Ctrl+S 不再冻屏

踩坑记录 ​

  • zstyle 单独写没用:必须 compinit 先跑过,否则 _comps 这个参数都不存在(实测:只设 zstyle 时它为空)
  • compinit 的位置是硬性要求:必须在任何调用 compdef 的代码之前,否则那些注册静默失效、无报错
  • 只对某个命令启用菜单:context 必须写全 6 段,少一段会匹配到错误字段(官方文档明确警告)
    sh
    zstyle ':completion:*:*:app:*:*' menu select   # 仅对 app 命令生效
  • compstate[insert]=menu 不是列表菜单:它启动的是 menu completion(命令行循环补齐);列表菜单是 zsh/complist 的 menu selection,由 zstyle 的 select 关键字控制
  • 没有 compinit 时的 Tab:^I 绑定 expand-or-complete,只有基础文件名/命令补全(zsh 内置,不需要补全系统)
  • 启动开销:compinit 增量约 20–30ms,可忽略
  • 方向键序列:TERM=xterm 下 terminfo 的 kcuu1/kcud1 是应用模式序列 ^[OA/^[OB,普通模式是 ^[[A/^[[B;要绑都绑

Last updated:

⟣ Growing, with you. ⟢