tmux
- 版权声明:本文为CSDN博主「Naisu Xu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- 原文链接:https://blog.csdn.net/Naisu_kun/article/details/119567566
tmux基础功能和screen差不多,但是目前来说tmux总体上比screen更加好用些。
根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板, 虽然其使用方法与终端控制台完全相同。
tmux使用C/S模型构建,主要包括以下单元模块:
- server服务器。输入tmux命令时就开启了一个服务器。
- session会话。一个服务器可以包含多个会话。
- window窗口。一个会话可以包含多个窗口。
- pane面板。一个窗口可以包含多个面板。
一个session可以被多个client接入,显示和操作在client中同步显示。
常用配置项
-
tmux的配置文件:
~/.tmux.conf
- 配置完以后,重启tmux起效
-
或者先按C+b,然后输入
:
,进入命令行模式, 在命令行模式下输入:-
source-file ~/.tmux.conf
-
- 重新运行tmux配置没有生效,可能是你进入了之前已有的后台会话。
-
~/.tmux.conf
# ~/.tmux.conf # prefix key (Ctrl+a) set -g prefix ^a #set -g prefix C-a unbind ^b #unbind C-b bind a send-prefix # prefix key (Ctrl+a) # split window unbind '"' unbind % bind - splitw -v # vertical split (prefix -) bind | splitw -h # horizontal split (prefix |) # select pane bind k selectp -U # above (prefix k) bind-key k select-pane -U bind j selectp -D # below (prefix j) bind h selectp -L # left (prefix h) bind l selectp -R # right (prefix l) # copy mode # enter copy mode (prefix Escape) bind Escape copy-mode # paste buffer (prefix Ctrl+p) bind ^p pasteb #bind-key -T copy-mode C-Space send-keys -X begin-selection # reload config (prefix r) bind r source ~/.tmux.conf \; display "Configuration reloaded!" #-- statusbar --# set -g status-interval 1 set -g status-keys vi setw -g mode-keys vi setw -g automatic-rename off #set-option -g status-style bg=cyan # statusbar #set-window-option -g window-status-current-style fg=colour166,bg=#c0c0c0 set-window-option -g window-status-current-style fg=colour166,bg=colour222
- 状态栏(Status bar)和个性化设置:https://tao-of-tmux.readthedocs.io/zh_CN/latest/manuscript/09-status-bar.html
常用热键
tmux的任何指令,都包含一个前缀,也就是说,你按了前缀(一组按键, 默认是Ctrl+b)以后,系统才知道你接下来的指令是发送给tmux的。
-
命令行参数
tmux new -s session tmux new -s session -d #在后台建立会话 tmux ls #列出会话 tmux a -t session #返回某个会话 # 列出所有快捷键,及其对应的 Tmux 命令 tmux list-keys # 列出所有 Tmux 命令及其参数 tmux list-commands # 列出当前所有 Tmux 会话的信息 tmux info # 重新加载当前的 Tmux 配置 tmux source-file ~/.tmux.conf # 显示当前设置(需要先运行一个tmux实例) tmux show-options -g | grep status
C-b ? #显示快捷键帮助 # 新建与退出 C-b c #创建新窗口 C-b x #关闭面板 C-b & #关闭窗口 # 会话 C-b d #退出并保存当前tumx会话(tmux仍在后台运行)。通过tmux ls查看会话、tmux attach/tmux a返回会话 C-b s #以菜单的方式查看并选择会话 C-b w #以菜单方式显示及选择窗口 C-b :new-session #新建一个会话 # 窗口 C-b C-o #调换窗口位置,类似与vim里的C-w C-b 0~9 #选择0~9号窗口 C-b n #选择下一个窗口 C-b p #选择前一个窗口 C-b l #切换到最后使用的窗口 C-b ; #切换到最后一个使用的面板 C-b , #命令窗口Title # 窗格 C-b " #横向分隔窗口" C-b % #纵向分隔窗口 C-b q #显示分隔窗口的编号 C-b o #跳到下一个分隔窗口 C-b 上下键 #上一个及下一个分隔窗口 C-b C-方向键 #调整分隔窗口大小 C-b 空格键 #采用下一个内置布局 C-b ! #把当前窗口变为新窗口 # 其他 C-b t #显示时钟
-
copy-mode复制模式
1.C-b C-[ #前缀 [ 进入复制模式 2.上下键滚动屏幕 3.按 space 开始复制,移动光标选择复制区域 4.按 Enter 复制并退出copy-mode。 5 按 前缀 ] 粘贴 # 配置了vi快捷键模式时,可以像操作vi一样来滚动屏幕、按q键退出复制模式
安装
# centos yum install tmux # debian/ubuntu sudo apt-get install tmux # cygwin apt-cyg install tmux # MacOS brew install tmux
基础功能
-
创建新会话
tmux 创建新会话并进入; tmux new -s name 创建一个名为name的会话并进入;(推荐做法) tmux创建的会话会在底部依次显示会话名、窗口名、主机名、时间等信息;
- 退出会话
在tmux创建的会话中依次按下键盘 ctrl + b d 退出当前会话;
- 列出已创建的会话
使用 tmux ls
可以列出已创建的会话,会话名称、会话含有的窗口数、创建时间;
如果已经在tmux创建的会话中的话也可以依次按下键盘 ctrl + b s
进行查看,这个功能比较厉害,还可以预览各个会话的内容,并选择切换;
- 重新进入会话
tmux a -t name
使用会话名称重新进入已存在的会话;
如果已经在tmux创建的会话中的话也可以使用 tmux switch -t name
切换会话(没有 ctrl + b s 来的好用);
- 关闭会话
tmux kill-session -t name
使用会话名称关闭已有会话;
如果已经在tmux创建的会话中的并且只有一个窗口和窗格的情况下可以按下键盘 ctrl + d 关闭当前会话;
-
重命名会话
tmux rename-session -t old-name new-name
- 滚动历史内容
要注意的是在tmux创建的会话中无法通过滚轮上下来查看历史信息,需要依次按下键盘上 ctrl + b PgUp
,接着就可以使用 PgUp PgDn ↑ ↓
来查看历史信息了,按下 q
退出。
到目前位置tmux和前面的screen其实还是没有太大差别的,主要是快捷键、选项以及小部分操作上有些不同,真正区别大的是tmux的每个会话中还有窗口和窗格的概念。
窗口与窗格
一个tmux的会话中可以有多个窗口(window),每个窗口又可以分割成多个窗格(pane)。对窗口和窗格相关操作都是在会话中进行的。
如果把前面的会话看做是一个excel文件的话,那窗口就像是其中的一张张sheet。
-
新建窗口
-
在会话中依次按下键盘
ctrl + b c
创建新窗口; - 多个窗口下底部带*标记的为当前活动窗口;
-
ctrl + b %
将当前窗口垂直分割; -
ctrl + b "
将当前窗口水平分割;
-
在会话中依次按下键盘
-
切换窗口
-
ctrl + b w
列出所有窗口,可以预览并选择切换; -
ctrl + b 0
切换到0号窗口,依此类推; -
ctrl + b p
上一个窗口; -
ctrl + b n
下一个窗口; -
窗格:
ctrl + b ↑ 、ctrl + b ↓ 、ctrl + b ← 、ctrl + b →
-
-
关闭窗口
-
ctrl + b &
关闭当前窗口,会提示,按下y并回车确定; -
ctrl + b x
关闭当前窗口,会提示,按下y并回车确定; -
当前窗口只有一个窗格的情况下可以按下键盘
ctrl + d
关闭当前窗口; -
也可以按下键盘
ctrl + d
关闭当前窗口,不会提示;
-
-
调整窗格
-
ctrl + b space
依次切换窗格布局; -
ctrl + b {
当前窗格与上一个窗格交换位置; -
ctrl + b }
当前窗格与下一个窗格交换位置;
-
-
缩放窗格
-
ctrl + b z
当前窗格全屏显示,再使用一次会变回原来大小;
-
-
拆分窗格
-
ctrl + b !
将当前窗格拆分为一个独立窗口;
-
更多介绍 tmux内容挺多的,更多内容可以参考 man tmux 或是下面链接: https://github.com/tmux/tmux
tmux可以创建很多的会话、窗口、窗格,如果用的多的话在系统重启或崩溃的情况下一个个恢复就比较纠结了。针对这个情况甚至出了附加的工具来管理这些内容,参考如下:
别人的tmux.conf
# # author : Xu Xiaodong <xxdlhy@gmail.com> # modified : 2012 Jul 22 #-- base settings --# set -g default-terminal "screen-256color" set -g display-time 3000 set -g escape-time 0 set -g history-limit 65535 set -g base-index 1 set -g pane-base-index 1 #-- bindkeys --# # prefix key (Ctrl+a) set -g prefix ^a unbind ^b bind a send-prefix # split window unbind '"' # vertical split (prefix -) bind - splitw -v unbind % bind | splitw -h # horizontal split (prefix |) # select pane bind k selectp -U # above (prefix k) bind j selectp -D # below (prefix j) bind h selectp -L # left (prefix h) bind l selectp -R # right (prefix l) # 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) # swap pane # swap with the previous pane (prefix Ctrl+u) bind ^u swapp -U # swap with the next pane (prefix Ctrl+d) bind ^d swapp -D # misc # select the last pane (prefix e) bind e lastp # select the last window (prefix Ctrl+e) bind ^e last # kill pane (prefix q) bind q killp # kill window (prefix Ctrl+q) bind ^q killw # copy mode # enter copy mode (prefix Escape) bind Escape copy-mode # paste buffer (prefix Ctrl+p) bind ^p pasteb # select (v) bind -t vi-copy v begin-selection # copy (y) bind -t vi-copy y copy-selection # zoom pane <-> window #http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.sh bind ^z run "tmux-zoom" # app # htop (prefix !) bind ! splitw htop # man (prefix m) bind m command-prompt "splitw 'exec man %%'" # perl func (prefix @) bind @ command-prompt "splitw 'exec perldoc -t -f %%'" # perl var (prefix *) bind * command-prompt "splitw 'exec perldoc -t -v %%'" # perl doc (prefix %) bind % command-prompt "splitw 'exec perldoc -t %%'" # ruby doc (prefix /) bind / command-prompt "splitw 'exec ri %%'" # reload config (prefix r) bind r source ~/.tmux.conf \; display "Configuration reloaded!" #-- statusbar --# set -g status-utf8 on set -g status-interval 1 set -g status-keys vi setw -g mode-keys vi setw -g automatic-rename off #-- colorscheme --# #https://github.com/daethorian/conf-tmux/blob/master/colors/zenburn.conf # modes setw -g clock-mode-colour colour223 setw -g mode-attr bold setw -g mode-fg colour223 setw -g mode-bg colour235 # panes set -g pane-border-bg colour234 set -g pane-border-fg colour234 set -g pane-active-border-bg colour232 set -g pane-active-border-fg colour232 # statusbar set -g status-justify centre set -g status-bg colour235 set -g status-fg colour248 set -g status-attr dim #[default]» #[fg=colour187]#S #[default]• #[fg=colour187]w#I.p#P#[default]" set -g status-left " set -g status-left-attr bright set -g status-left-length 20 #[fg=colour174]#(/home/xiaodong/bin/uptime) #[default]• #[fg=colour174]#(cut -d ' ' -f 1-3 /proc/loadavg)" set -g status-right " set -g status-right-attr bright set -g status-right-length 80 setw -g window-status-current-fg colour223 setw -g window-status-current-bg colour237 setw -g window-status-current-attr bold setw -g window-status-current-format "#I:#W#F" #setw -g window-status-alert-attr bold #setw -g window-status-alert-fg colour255 #setw -g window-status-alert-bg colour160 # messages set -g message-attr bold set -g message-fg colour223 set -g message-bg colour235 set -g visual-activity on
- 快速启动tmux
如果觉得每次都要打开tmux,然后在打开几个窗口和面板很麻烦,那么下面这个脚本你一定会 喜欢。参考这里: https://github.com/xuxiaodong/tmuxen/blob/master/tmuxen
脚本化tmux:https://linuxtoy.org/archives/scripting-tmux.html
#!/bin/sh # # name : tmuxen, tmux environment made easy # author : Xu Xiaodong xxdlhy@gmail.com # license : GPL # created : 2012 Jul 01 # modified : 2012 Jul 02 # cmd=$(which tmux) # tmux path session=codefun # session name if [ -z $cmd ]; then echo "You need to install tmux." exit 1 fi $cmd has -t $session if [ $? != 0 ]; then $cmd new -d -n vim -s $session "vim" $cmd splitw -v -p 20 -t $session "pry" $cmd neww -n mutt -t $session "mutt" $cmd neww -n irssi -t $session "irssi" $cmd neww -n cmus -t $session "cmus" $cmd neww -n zsh -t $session "zsh" $cmd splitw -h -p 50 -t $session "zsh" $cmd selectw -t $session:5 fi $cmd att -t $session exit 0