刚装好系统的时候,终端只是一片安静的黑。光标在角落闪着,什么也没说。

用得久了,总想让它顺手一点、好看一点。于是花了个把小时,把它一点点弄成现在的样子。这篇手记记下整个过程,重装之后照着走一遍就能复原。如果你也看腻了那片黑,可以一起 (。・ω・。)ノ♡

适用平台:macOS(Apple Silicon / Intel 都行)。大概一集番剧的时间 φ(≧ω≦*)♪


✦ 会陆续登场的伙伴

开始之前,先认个脸。后面会用到的,就这几位:

名字 做什么
入口 Homebrew 别的工具都顺着它装进来
底子 Oh My Zsh 插件、补全、别名都搭在它上面
提示符 Starship 终端好不好看,主要看它
ls 的替身 eza 列文件时带图标和 git 状态
cat 的替身 bat 看文件时有语法高亮
搜索 fzf + fd 找命令、找文件都快
跳转 zoxide 记得你常去的目录,cd 一步到位
版本管理 jenv / nvm 在多个 Java / Node 版本之间随意切
字体 MesloLGS Nerd Font 没有它,图标会变成方框「□」

最后那位别漏。少了它,终端想显示的小图标会变成一个个空白方框——明明要说点什么,却没说出来 (´•̥ ω •̥`)。这件事第七章会补上。


序章 ▸ 起点(Homebrew)

后面的一切都从它开始,先把它请来。

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

装好后它会让你把它加进 PATH。不用记,后面那份 .zshrc 已经写好了这段。

确认一下:brew --version 能报出版本号就行 ✧


第一章 ▸ 铺好底子(Oh My Zsh)

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

它会生成一份默认 .zshrc(旧的会备份)。先不管,第六章会用我们自己的覆盖掉。现在让它把框架搭好就够了。


第二章 ▸ 把工具装齐

一句话装齐核心几位:

1
brew install starship eza bat fzf fd zoxide jenv

装字体(Nerd Font):

1
brew install --cask font-meslo-lg-nerd-font

装 Java 17(Eclipse Temurin,想用别的 JDK 也行):

1
brew install --cask temurin@17

随手 starship --versioneza --version,能报版本就说明都到位了 (σ≧▽≦)σ


第三章 ▸ 加两个插件(Oh My Zsh)

gitmacos 是 Oh My Zsh 自带的,不用装。另外两个要手动 clone 进来:

1
2
3
4
5
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

它们的作用:

  • zsh-autosuggestions:打字时把你以前用过的命令用灰色提示出来,按 → 补全。
  • zsh-syntax-highlighting:命令实时上色,打错了会变红。

一个小约定:zsh-syntax-highlighting 要放在 plugins=()最后,不然不生效 (>_<)。下面那份配置已经排好序了。


第四章 ▸ 装 nvm

用它自己的脚本(会装进 ~/.nvm,和配置里约定的路径一致):

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

v0.40.1 不一定是最新,装之前可以去 nvm 的 GitHub 看一眼最新版本号再替换。


第五章 ▸ 换上好看的样子(Starship 主题)

这一步最有存在感——终端的样子,从这里开始变好看 (灬º‿º灬)♡。给提示符套上 gruvbox-rainbow

1
2
mkdir -p ~/.config
starship preset gruvbox-rainbow -o ~/.config/starship.toml

想换别的,把 gruvbox-rainbow 改成其他预设名就行。可选的在 starship.rs/presets,catppuccin、tokyo-night 都不错 ✧


第六章 ▸ 写进配置(~/.zshrc)

下面这份覆盖到 ~/.zshrc,它决定终端怎么跑、怎么和那些工具配合。(提示符的样子交给了 Starship,所以 ZSH_THEME 留空,是对的。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# =========================================================
# Oh My Zsh
# =========================================================
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME=""

plugins=(
git
macos
zsh-autosuggestions
zsh-syntax-highlighting
)

source "$ZSH/oh-my-zsh.sh"


# =========================================================
# Homebrew
# =========================================================
if [ -x /opt/homebrew/bin/brew ]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
fi


# =========================================================
# Java 17
# =========================================================
if [ -x /usr/libexec/java_home ]; then
JAVA_17_HOME=$(/usr/libexec/java_home -v 17 2>/dev/null)
if [ -n "$JAVA_17_HOME" ]; then
export JAVA_HOME="$JAVA_17_HOME"
export PATH="$JAVA_HOME/bin:$PATH"
fi
unset JAVA_17_HOME
fi


# =========================================================
# jenv
# =========================================================
export PATH="$HOME/.jenv/bin:$PATH"
if command -v jenv >/dev/null 2>&1; then
eval "$(jenv init -)"
fi


# =========================================================
# nvm / Node.js
# =========================================================
export NVM_DIR="$HOME/.nvm"
if [ -s "$NVM_DIR/nvm.sh" ]; then
. "$NVM_DIR/nvm.sh"
fi
if [ -s "$NVM_DIR/bash_completion" ]; then
. "$NVM_DIR/bash_completion"
fi


# =========================================================
# fzf + fd
# =========================================================
if command -v fd >/dev/null 2>&1; then
export FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
fi
if command -v fzf >/dev/null 2>&1; then
source <(fzf --zsh)
fi


# =========================================================
# zoxide
# =========================================================
if command -v zoxide >/dev/null 2>&1; then
eval "$(zoxide init zsh)"
fi


# =========================================================
# eza / bat aliases
# =========================================================
if command -v eza >/dev/null 2>&1; then
alias ls="eza --icons"
alias ll="eza -alh --icons"
alias tree="eza --tree --icons"
else
alias ll="ls -alh"
fi
if command -v bat >/dev/null 2>&1; then
alias cat="bat"
fi


# =========================================================
# Git aliases
# =========================================================
alias gs="git status -sb"
alias ga="git add"
alias gaa="git add ."
alias gc="git commit"
alias gcm="git commit -m"
alias gp="git push"
alias gl="git log --oneline --graph --decorate"
alias gb="git branch"
alias gco="git switch"


# =========================================================
# Handy aliases
# =========================================================
alias reload="exec zsh -l"
alias brew-maintain="brew update && brew upgrade && brew cleanup && brew doctor"


# =========================================================
# Local user binaries
# =========================================================
export PATH="$HOME/.local/bin:$PATH"


# =========================================================
# PATH deduplication
# =========================================================
typeset -U path PATH


# =========================================================
# Starship prompt
# =========================================================
eval "$(starship init zsh)"

写完重新加载一次:

1
exec zsh

第七章 ▸ 让图标被看见(终端字体)

说好要补的事。

如果图标显示成方框「□」,别慌,不是终端的问题 (ˉ▽ˉ;),只是它还没有一种能被读出来的字体。换成 MesloLGS Nerd Font 就好了。

macOS 自带 Terminal:

  1. 顶部菜单 Terminal → 设置(或 ⌘ ,
  2. 描述文件 → 选中正在用的那个 → 文本 → 字体 → 更改…
  3. Meslo,选 MesloLGS Nerd Font(不要带 Mono / Propo 后缀的),字号 13~14

VS Code 内置终端(如果也在那里写码):往 settings.json 加一句——

1
"terminal.integrated.fontFamily": "MesloLGS Nerd Font"

IntelliJ 内置终端:Settings → Editor → Color Scheme → Console Font,勾选并选 MesloLGS Nerd Font。

验证一下:

1
print '\ue0b0 \uf07c \ue702'

跳出三个图标(三角、文件夹、git 分叉)就对了 φ(≧ω≦*)♪。还是方框的话,回去再确认一次字体。


第八章 ▸ 收尾

工具装好还要再走一步,它们才真正能用:

给 nvm 装个 Node 版本:

1
2
nvm install --lts
nvm use --lts

把 Java 17 登记给 jenv:

1
2
jenv add "$(/usr/libexec/java_home -v 17)"
jenv versions # 列表里有 17 就成了

尾声 ▸ 现在的它

开一扇新窗口,看一眼——

  • 提示符是 gruvbox-rainbow 的颜色,橙黄到绿,一段段用箭头连着
  • ll 时每个名字前都有图标,没有方框
  • 进 git 仓库会显示分支,进 Java 项目会显示版本
  • cat 一个文件,文字有了颜色
  • 打字时有灰色建议,命令也一路上着色

已经不是当初那片黑了。够用,也耐看 (๑˃̵ᴗ˂̵)و~


番外 ▸ 想要颜色更透一点

macOS 自带 Terminal 不支持真彩色,颜色会被压暗一档。日常够用,但要是想要更透亮的效果,可以换成 Ghostty

1
brew install --cask ghostty

它的配置就一个文本文件(~/.config/ghostty/config),两行换皮肤:

1
2
font-family = "MesloLGS Nerd Font"
theme = Gruvbox Dark

ghostty +list-themes 能预览它内置的几百套主题。同一套配色,真彩色下会透亮不少 ヽ(✿゚▽゚)ノ


参考链接