终端环境通常由 Terminal、Shell 和 Terminal Multiplexer 三个部分组成。

Terminal 负责窗口、字体、输入输出以及渲染;Shell 负责命令解释和交互;Terminal Multiplexer 则负责管理多个终端会话、窗口和 Pane。

日常开发中,Shell 主要关注命令补全、历史记录、目录切换等操作,而 tmux、Zellij 这类工具则解决多终端组织和 Session 持久化的问题。

本文主要整理 Zsh、Fish、Antigen、fzf、tmux 和 Zellij 的配置方式,以及这些配置实际解决的问题。

Shell

Shell 是终端环境中最直接的一层。常见选择包括 Zsh 和 Fish。

Zsh

Zsh 在 Bash 的使用习惯基础上提供了更加丰富的补全、历史和交互能力,也是目前比较常见的开发环境 Shell。

Zsh 的主要配置文件是:

~/.zshrc

常见的环境变量、alias、补全以及插件都可以放在这里。

一个比较基础的配置结构:

# ~/.zshrc

# 环境变量
export EDITOR=vim

# alias
alias ll='ls -lah'
alias gs='git status'

# 插件
source ~/.antigen/antigen.zsh

antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle Aloxaf/fzf-tab

antigen apply

将配置按照功能分区以后,后续增加工具会比较容易维护。

Antigen

Antigen 用于管理 Zsh 插件。

基本配置:

source ~/.antigen/antigen.zsh

antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle Aloxaf/fzf-tab

antigen apply

antigen bundle 用于声明需要加载的插件,antigen apply 负责应用配置。

这种方式可以避免把插件脚本直接复制进 .zshrc,插件的安装和更新也更加集中。

zsh-autosuggestions 根据历史命令提供自动建议。

例如输入:

git che

Shell 会根据历史记录给出类似的建议:

git checkout feature/xxx

使用方向键即可接受建议,从而减少重复输入。

zsh-autosuggestions

zsh-syntax-highlighting 用于实时显示命令行语法。

常见情况下,正确的命令和参数会以不同的样式显示,拼写错误的命令也可以在执行之前发现。

对于比较长的编译、测试和 Git 命令,这个功能尤其方便。

正确命令 错误命令

fzf

fzf 是独立的命令行模糊搜索工具,并不属于 Antigen。

安装以后,可以启用 Zsh integration:

source <(fzf --zsh)

常见的快捷键包括:

Ctrl-R    搜索历史命令
Ctrl-T 搜索文件
Alt-C 搜索目录

其中 Ctrl-R 可以快速从历史命令中找到之前执行过的复杂命令。

fzf 也可以和其他命令组合使用,例如:

find . -type f | fzf

这里 find 负责生成候选列表,fzf 负责交互式选择。

fzf-tab 解决的是另一个问题:将 Zsh completion 与 fzf 结合。

~/.zshrc 里添加到 antigen apply 之前的插件区域里:

antigen bundle Aloxaf/fzf-tab

原本通过 <Tab> 展开的候选项可以使用模糊搜索进行筛选。

git checkout <Tab>

当候选分支比较多时,可以直接输入关键字进行过滤。

fzf-tab

zoxide 用于改进目录切换。

Zsh:

eval "$(zoxide init zsh)"

之后可以:

z kwin

zoxide 会根据历史访问记录定位目录。

相比频繁输入:

cd ~/src/project/...

这种方式更适合项目目录较多、路径层级较深的开发环境。

常用配置

一个比较完整的 Zsh 配置可以整理成:

# ~/.zshrc

# --------------------------------------------------
# Environment
# --------------------------------------------------

export EDITOR=vim
export PAGER=less

# --------------------------------------------------
# Alias
# --------------------------------------------------

alias ll='ls -lah'
alias la='ls -A'
alias gs='git status'

# --------------------------------------------------
# Antigen
# --------------------------------------------------

source ~/.antigen/antigen.zsh

antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle Aloxaf/fzf-tab

antigen apply

# --------------------------------------------------
# fzf
# --------------------------------------------------

source <(fzf --zsh)

# --------------------------------------------------
# zoxide
# --------------------------------------------------

eval "$(zoxide init zsh)"

实际使用时,还可以根据环境加入 PATH、代理、编译工具链以及项目相关的环境变量。

Terminal Multiplexer

Shell 主要负责命令交互,而 Terminal Multiplexer 更适合管理多个长期运行的终端。

典型工作环境可能包含:

Window 1
├── editor
└── shell

Window 2
└── build

Window 3
└── test

Window 4
└── logs

这样即使 SSH 连接断开,Session 中运行的任务也可以继续执行。

tmux

tmux 是使用非常广泛的 Terminal Multiplexer。

配置文件:

~/.tmux.conf

基础配置

常用配置:

# Prefix
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Mouse
set -g mouse on

# History
set -g history-limit 100000

# Vi mode
setw -g mode-keys vi

# Split
bind | split-window -h
bind - split-window -v

# Pane navigation
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Reload
bind r source-file ~/.tmux.conf

这里主要调整几个高频操作。

Prefix 从默认的 Ctrl-B 改成 Ctrl-A,Pane 导航使用 Vim 风格的 h/j/k/l,同时启用鼠标和较大的历史缓冲区。

TPM

tmux 本身同样拥有插件生态。

TPM(Tmux Plugin Manager)用于管理 tmux 插件。

安装:

git clone https://github.com/tmux-plugins/tpm \
~/.tmux/plugins/tpm

配置:

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

run '~/.tmux/plugins/tpm/tpm'

安装插件后,可以使用:

Prefix + I

安装插件。

Session 持久化

tmux-resurrect 用于保存和恢复 tmux Session。

set -g @plugin 'tmux-plugins/tmux-resurrect'

手动保存和恢复:

Prefix + Ctrl-S
Prefix + Ctrl-R

tmux-continuum 则可以进一步自动保存:

set -g @plugin 'tmux-plugins/tmux-continuum'

set -g @continuum-save-interval '15'
set -g @continuum-restore 'on'

这样可以让 tmux 工作空间长期保持。

在这里插一句,session 在这里的作用是用来快速恢复工作场景的,比如说正常因为网络环境断开导致的 tmux 断链,我们只需要重新 attach 上去就可以了,但是如果机器重启了呢?这个时候就可以使用 session 恢复功能,快速将 tmux 的状态恢复到一个快照状态,布局、运行的程序记录等。

比如说我使用 tmux new -s 创建多个不同的 session,kwin、treeland、agent 等,每个 session 之间可以互相隔离,并且有不同的布局,运行不同的程序,当机器重启了,我就可以使用恢复功能,而不必手动一个一个的创建布局了。

tmux sessions

Vim 导航

如果终端中经常使用 Vim 或 Neovim,可以使用:

set -g @plugin 'christoomey/vim-tmux-navigator'

这样可以统一使用:

Ctrl-H
Ctrl-J
Ctrl-K
Ctrl-L

在 Vim 窗口和 tmux Pane 之间移动。

常用配置

综合起来:

# ~/.tmux.conf

unbind C-b
set -g prefix C-a
bind C-a send-prefix

set -g mouse on
set -g history-limit 100000

setw -g mode-keys vi

bind | split-window -h
bind - split-window -v

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

bind r source-file ~/.tmux.conf \; display-message "reloaded"

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

set -g @continuum-save-interval '15'
set -g @continuum-restore 'on'

run '~/.tmux/plugins/tpm/tpm'

Zellij

Zellij 也是一个 Terminal Multiplexer,配置文件使用 KDL 格式。

Zellij

配置文件

默认配置目录:

~/.config/zellij/

主要配置文件:

~/.config/zellij/config.kdl

基础配置

例如:

pane_frames false

mouse_mode true

copy_on_select true

scroll_buffer_size 100000

常见配置包括:

pane_frames
控制 Pane 边框

mouse_mode
鼠标操作

copy_on_select
选择文本后自动复制

scroll_buffer_size
滚动缓冲区大小

Layout

Zellij 的一个重要功能是 Layout。

可以将一个开发环境描述成固定布局:

┌──────────────────────┐
│ │
│ Editor │
│ │
├──────────┬───────────┤
│ Build │ Logs │
└──────────┴───────────┘

然后通过 Layout 文件直接恢复。

这样就不需要每次进入项目以后重新创建 Pane。

常用配置

Zellij 配置可以继续向 Layout、Keybind、Plugin 等方向扩展。

最开始使用时,只需要配置:

pane_frames false
mouse_mode true
copy_on_select true
scroll_buffer_size 100000

已经可以覆盖比较常见的终端操作需求。

一个完整的终端环境

将这些工具组合起来,可以形成比较完整的开发环境:

Terminal

├── Shell
│ ├── Zsh
│ │ └── Antigen
│ │ ├── autosuggestions
│ │ ├── syntax-highlighting
│ │ └── fzf-tab
│ │
│ ├── Fish
│ │
│ ├── fzf
│ └── zoxide

└── Terminal Multiplexer
├── tmux
│ └── TPM
│ ├── resurrect
│ └── continuum

└── Zellij

这些工具并不需要全部同时启用。

Shell 层主要解决命令输入、补全、历史搜索和目录切换。Terminal Multiplexer 层主要解决终端组织、Session 管理和工作环境持久化。

最终可以根据自己的开发环境,将配置集中到 dotfiles 中统一管理:

dotfiles/
├── zsh/
│ └── .zshrc
├── fish/
│ └── config.fish
├── tmux/
│ └── .tmux.conf
└── zellij/
└── config.kdl

这样换机器或者重新部署开发环境时,只需要恢复这一套配置即可。