原文地址:https://kxcblog.com
本系列文章包括3篇,主要分享我在后端开发过程中使用终端的一些经验和心得,分享fish shell使用,使用tmux终端复用管理会话、窗口,以及vim插件使用,让vim变成强大的IDE。通过阅读本系列文章,你也可以打造一个高效易用的终端,能很大的提高工作的效率,让手指飞起来,让命令行飞起来。
本系列的3篇文章包括:
本系列文章使用的fish配置文件,tmux配置文件和vim插件都上传到了github, cool-terminal-conf.
本文为第二篇,Tmux配置及使用教程。
简介
命令行的典型使用方式是,打开一个终端窗口(terminal window),在里面输入命令。用户与计算机的这种交互,称为一次“会话“(session)。
会话的一个重要特点是,窗口与其启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束。这样会话中的进程也会随之关闭,不管有没有运行完。
tmux就是将会话与窗口”解绑“的工具。
- 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
- 它可以让新窗口"接入"已经存在的会话。
- 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
- 它还支持窗口任意的垂直和水平拆分。
配置
tmux配置文件为 ~/.tmux.conf
,我自定义了tmux的快捷键和状态栏,配置项我都写了注释,读者可以根据自己的喜好修改自定义 😃
# tmux默认快捷键的前缀是 ctrl-b, 我修改成了 ` (数字键1左边的那个键)
# Set Ctrl-b key bindings
unbind C-b
set -g prefix `
# 窗口索引从1开始,`-1 即切换到第一个窗口
# Count sessions start at 1
set -g base-index 1
# vi模式,v开始选择,y 复制选择内容到剪贴板
# Use vim bindings
setw -g mode-keys vi
# start selecting text typing 'v' key (once you are in copy mode)
bind-key -T copy-mode-vi 'v' send -X begin-selection
# # copy selected text to the system's clipboard
bind-key -T copy-mode-vi 'y' send -X copy-pipe-and-cancel pbcopy
#up
bind-key k select-pane -U
#down
bind-key j select-pane -D
#left
bind-key h select-pane -L
#right
bind-key l select-pane -R
# 切分窗口,快捷键修改为 - 水平切分窗口, \ 垂直切分窗口
# split window
unbind '"'
bind - splitw -v
unbind %
bind \ splitw -h
# ctrl + k/j/h/l 调整pane大小
# resize pane
bind -r ^k resizep -U 10 # upward (prefix Ctrl+k)
bind -r ^j resizep -D 10 # downward (prefix Ctrl+j)
bind -r ^h resizep -L 10 # to the left (prefix Ctrl+h)
bind -r ^l resizep -R 10 # to the right (prefix Ctrl+l)
# Status bar settings
# alignment
set-option -g status-justify centre
# left-bottom corner
set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
set-option -g status-left-length 20
# window list
set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
# right-bottom status
set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'
# center window status
set -g window-status-format "#I:#W"
set -g window-status-current-format "#I:#W"
# default statusbar colors
set -g status-fg white
set -g status-bg black
# default window title colors
set-window-option -g window-status-style fg=white
set-window-option -g window-status-style bg=default
set-window-option -g window-status-style dim
# active window title colors
set-window-option -ag window-status-current-style fg=red
set-window-option -ag window-status-current-style bg=default
set-window-option -ag window-status-current-style bold
# command/message line colors
set -g message-style fg=white
set -g message-style bg=black
set -g message-style bright
set -g status-keys vi
bind-key -T vi-edit Up send -X history-up
bind-key -T vi-edit Down send -X history-down
set -g status-interval 1
set -g status-justify centre # center align window list
# window-name
set-option -g allow-rename off
使用
下面操作的快捷键 指的是快捷键的前缀,默认是ctrl-b
,我配置文件修改为了 `(键盘数字1左边的键)
基本操作
tmux ls # 查询所有会话
tmux new -s session_name # 创建会话
tmux detach # 断开会话,或者使用快捷键 <prefix>-d
tmux attach [-t session_name] # 重新连接会话,-t session_name 指定连接的会话名称
tmux kill-session -t session_name # 关闭会话,会话关闭后,会话中所有的程序也会关闭
会话(session)管理
s # 列出所有会话
$ # 重命名会话
d # 断开会话
下图展示<prefix>-s
列出所有session的结果,我们只窗口了一个blog会话,选择session时,也会展示该session中各窗口的缩略图。
窗口(window)管理
c # 新建窗口
, # 重命名窗口
w # 列出所有窗口
n # 选择下一个窗口
p # 选择上一个窗口
0-9 # 选择对应编号的窗口
- # 水平分割窗口,默认键为 %
\ # 垂直分割窗口,默认键为 "
下图展示<prefix>-w
列出所有窗口的结果,可以看到blog会话包含了hugo, post, udp 3个窗口,选择某个窗口时也展示了该窗口包含的pane。
窗格(pane)管理
q # 显示窗格的编号
o # 在窗格间切换
} # 与下一个窗格交换位置
{ # 与上一个窗格交换位置
x # 关闭当前窗格
- # 创建一个水平窗格,默认键为 %
\ # 创建一个竖直窗格,默认键为 "
j # 选择下一个窗格
k # 选择上一个窗格
h # 选择左一个窗格
l # 选择右一个窗格
ctrl-j # 向下resize窗格
ctrl-k # 向上resize窗格
ctrl-h # 向左resize窗格
ctrl-l # 向右resize窗格
下图展示<prefix>-q
显示pane的编号,可以看到窗口3(udp)包含了 0 1 2 三个pane
其他命令
# 列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys
# 列出所有 Tmux 命令及其参数
tmux list-commands
# 列出当前所有 Tmux 会话的信息
tmux info
# 重新加载当前的 Tmux 配置
tmux source-file ~/.tmux.conf
总结
tmux终端复用的好处不仅在于将窗口与会话"解绑",这样即使你不小心关掉了终端,终端中正在运行的程序不会退出,你仍然可以使用 tmux attach
切换到会话中来,同时,一个session可以管理多个窗口和窗格,窗口之间能快速切换,能很大的提高工作效率。