tmux(terminal multiplexer)是Linux上的终端复用神器。
1. 安装
(1)下载
下载及其依赖软件。
wget -c https://github.com/tmux/tmux/releases/download/3.0a/tmux-3.0a.tar.gz
wget -c https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz
wget -c https://ftp.gnu.org/gnu/ncurses/ncurses-6.2.tar.gz
(2)安装
先安装依赖,再安装tmux。
#libevent
./configure --prefix=/my/path/tmux_depend --disable-shared
make && make install
#ncurses
./configure --prefix=/my/path/tmux_depend
make && make install
#tmux
./configure CFLAGS="-I/my/path/tmux_depend/include -I/my/path/tmux_depend/include/ncurses" LDFLAGS="-L/my/path/tmux_depend/lib -L/my/path/tmux_depend/include/ncurses -L/my/path/tmux_depend/include"
#CPPFLAGS="-I/my/path/tmux_depend//include -I/my/path/tmux_depend//include/ncurses" LDFLAGS="-static -L/my/path/tmux_depend//include -L/my/path/tmux_depend//include/ncurses -L/my/path/tmux_depend//lib"
make
cp tmux /my/path/tmux_depend/bin
(3)设置环境
设置环境变量。
#bashrc
export PATH=/my/path/tmux_depend/bin:$PATH
source ~/.bashrc
2. 常用命令使用
tmux的结构包括会话(session)、窗口(window)、窗格(pane)三部分,会话实质是伪终端的集合,每个窗格表示一个伪终端,多个窗格展现在一个屏幕上,这一屏幕就叫窗口。
以下是摘自一篇博文tmux基本操作,写得很好,但如果没有一点点基础,会忽略很多地方。避免走坑,重点解释下。
tmux基本的操作无非就是对会话、窗口、窗格进行管理,包括创建、关闭、重命名、连接、分离、选择等等。
一般使用命令和快捷键进行操作,可在系统shell终端和tmux命令模式(类似vim的命令模式,窗口下有文字)下使用命令,或者在tmux终端使用快捷键。
tmux默认的快捷键前缀是Ctrl+b(下文用prefix指代),按下前缀组合键后松开(注意松开组合键后再按!),再按下命令键进行快捷操作,比如分离会话(是prefix d而不是prefix+d,因为d键不能与Ctrl+b同时按下!)。所以下面prefix等于ctrl+b/a。
快捷键可以自定义,比如将前缀改为Ctrl+a顺手一些(如果按ctrl b键无效,检查下~/.tmux.conf配置文件中是否替换或者屏蔽掉了,可试下ctrl a)。如果需要保留shell命令的Ctrl+a快捷键(即跳转到行首),按如下所示修改~/.tmux.conf文件:
1 set-option -g prefix C-a
2 unbind-key C-b
3 bind-key C-a send-prefix
4 bind-key R source-file ~/.tmux.conf \; display-message "~/.tmux.conf reloaded."
现在已将shell的Ctrl+a用prefix Ctrl+a取代,即需要按两次Ctrl+a生效(跳到行首)。
第4行的作用是使用prefix r重新加载配置文件,并输出提示。否则需要关闭会话后配置文件才能生效,也可手动加载配置文件,在tmux终端输入"prefix :"进入命令模式(注意有冒号),用source-file命令加载配置文件。
注意,将多个命令写在一起作为命令序列时,命令之间要用空格和分号分隔。
(1) 会话命令
- tmux new 创建默认名称的会话
- tmux new -s mysession 创建名为mysession的会话
- tmux ls 显示会话列表
- tmux a 连接上一个会话
- tmux a -t mysession 连接指定会话
- tmux rename -t s1 s2 重命名会话s1为s2
- tmux kill-session 关闭上次打开的会话
- tmux kill-session -t s1 关闭会话s1
- tmux kill-session -a -t s1 关闭除s1外的所有会话
- tmux kill-server 关闭所有会话
- tmux list-key 列出所有绑定的键,等同于prefix ?
- tmux list-command 列出所有命令
常用快捷键:prefix后按
- s 列出会话,可进行切换
- $ 重命名会话
- d 分离当前会话
- D 分离指定会话
(2)窗口命令
常用快捷键:prefix后按
- c 创建一个新窗口
- , 重命名当前窗口
- w 列出所有窗口,可进行切换
- n 进入下一个窗口
- p 进入上一个窗口
- l 进入之前操作的窗口
- 0~9 选择编号0~9对应的窗口
- . 修改当前窗口索引编号
- ' 切换至指定编号(可大于9)的窗口
- f 根据显示的内容搜索窗格
- & 关闭当前窗口
(3)窗格命令
常用快捷键:prefix后按
- % 水平方向创建窗格
- " 垂直方向创建窗格
- Up|Down|Left|Right 根据箭头方向切换窗格
- q 显示窗格编号
- o 顺时针切换窗格
- } 与下一个窗格交换位置
- { 与上一个窗格交换位置
- x 关闭当前窗格
- space(空格键) 重新排列当前窗口下的所有窗格
- ! 将当前窗格置于新窗口
- Ctrl+o 逆时针旋转当前窗口的窗格
- t 在当前窗格显示时间
- z 放大当前窗格(再次按下将还原)
- i 显示当前窗格信息
启动与关闭服务器
tmux # 启动
tmux kill-server # 关闭
进入和退出会话
tmux attach
prefix d # 或者 prefix C-z
3. 快捷键配置
关于~/.tmux.conf文件的配置,有一个教程介绍可以参考:
Tmux常用快捷键以及我会常到的一些问题汇总
或者:
tmux的使用方法和个性化配置
但是网上的教程里的配置大部分都太老了,很多识别不了。所以不能照搬来用,最好是自己用prefix ?
查看。比如用鼠标来控制不同窗口和窗格大小(拖动),在2.0版本及其以下通过如下设置来控制(网上的绝大多数教程,没用):
setw -g mouse-resize-pane on #(或者set)
setw -g mouse-select-pane on
setw -g mouse-select-window on
setw -g mode-mouse on
Tmux2.0 版本以上使用set -g mouse on
即可。更多设置鼠标来回滚动窗口参考:
# Enable mouse mode (tmux 2.1 and above)
set -g mouse on
#Enable oh my zsh in tmux
set -g default-command /bin/zsh
# Mouse based copy
bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
bind-key -T copy-mode MouseDragEnd1Pane send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
4. 问题
分割窗口虽然很方便,但是用鼠标复制一个窗口的文本到另一个窗口时,复制很不方便,因为多个窗口的同一行仍视为一行,所以比较难复制。比如我要复制一个较长的路径时(双击也复制不了),比较困难,而且切换粘贴时也比较麻烦:
网上有一些解决方法,比如:选择窗格后,prefix z,复制,prefix z,切换窗格,粘贴。确实时比较麻烦。后续看看快捷键能不能解决掉,不然这个功能缺陷会直接让我考虑要不要用它了。
通过配置鼠标解决了不同窗口单行复制问题,但显示器范围显示的单行还是视为一行(超出范围视为另一行,仍复制不了)。鼠标选择复制的问题很难解决,但这个需求太重要了,我经常要复制粘贴长串的路径,这也是为何我要用多个终端的原因,如果这一点不能很好地解决,我宁愿不用了!
所以,目前我用的配置是:如果想要和正常终端一样使用,即鼠标复制(双左击)粘贴(右击)操作,但也只能屏幕单行复制粘贴,将配置设为2.0版本以下模式;如果想要用鼠标自由拖动窗格大小、滚动窗格、鼠标随意选择窗格等操作,就设为2.0版本以上模式,即set -g mouse on
,但不能复制选择和粘贴。
最终方案:
要想一次复制长长的路径(鼠标),不再纠结用切割窗口的方法,多新建一个window,然后prefix n/p
来回切换复制粘贴。所以,如果需要在不同路径来回配合操作,可用切换window的方法;如果在同一路径,则切割window(如在一个pane编写代码,一个pane调试,或者top查看资源)。当然了,也可新建多个session,然后在不同session之间切换(prefix s
)来复制,但是会多一步,即切换时要选择session,或者用prefix w
查看所有的session和window,再选择切换。
Ref:
安装参考:https://www.jianshu.com/p/f7f24b4b2625
使用参考:https://www.cnblogs.com/liuguanglin/p/9290345.html