tmux

Posted 只缘心高嫌地窄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tmux相关的知识,希望对你有一定的参考价值。

原理

  • 你可以随时退出或者进入任何一个Session。每个Session有若干个Window,每个Window又可以分成多个窗格(Pane)
  • Session可以完全恢复!但是关机就不可以了,不过你可以写脚本来恢复
  • tmux -> session -> window -> pane
  • 一个会话(Session)可以包含多个窗口,一个窗口(Window)可以包含多个窗格(Pane)

安装 Tmux

  • apt-get install tmux
  • sudo port install tmux
  • sudo brew install tmux
  • sudo yum install tmux
  • 其他系统直接安装 Tmux 的 tar 包,Tmux 依赖于 libevent 和 libevent-devel 包.
  • 配置 Tmux 安装完 Tmux 默认没有配置文件,需手动生成。/etc/tmux.conf 全局文件,~/.tmux.conf 用户环境文件
# vim ~/.tmux.conf
set -g prefix ^g                        # <prefix> 激活控制台,(默认Ctrl+b)
unbind ^b                               # 解绑 Ctrl+b
set-option -g status-utf8 on            # 开启状态栏的UTF-8支持
# cp mode
set-window-option -g mode-keys vi       # 复制模式中的默认键盘布局使用 vi
bind h select-pane -L                   # h 等于向左移动光标
bind j select-pane -D                   # j 向下移动光标
bind k select-pane -U                   # k 向上移动光标
bind l select-pane -R                   # l 向右移动光标
  • tmux 默认使用的是Ctrl+b,之所以改成Ctrl+g是因为Ctrl+b在 Bash 环境里是向左移动光标. 现在 tmux 和 vim 操作一样了,复制时候也可以用 h、j、k、l 来移动光标。
  • 使用 Tmux Tmux 完全依靠快捷键来使用它的功能,而刚才设置的Ctrl+g是这些功能的前提,例如打开一个时钟:Ctrl + g + t 按键的时候要先按Ctrl+g后松开Ctrl和g键后,快速按出t 打开 Tmux:
  • Ctrl+g 后松开在按 t 会在终端里出现一个数字时钟
  • 说的是 tmux 的功能无非就是 Ctrl + g + 一些功能的键而已,所有的按键方式和上面的时钟例子一样。
  • 获取 Tmux 帮助 按 Ctrl + g + ? (问号等于:Shift + /)会出现 Tmux 的帮助信息, 信息中 ‘bind-key’ 说的就是 Ctrl + g, 或者直接 man tmux。

命令

  • tmux new -s myname 可以指定Session名
  • [PREFIX-:] new -s 在tmux中创建一个会话
  • tmux attach-session -t myname 重新连接此会话
  • tmux attach
  • tmux attach -t basic
  • tmux a -t basic
  • tmux list-session
  • tmux ls
  • [PREFIX-s] 在tmux中查看会话列表并切换
  • tmux new-session <会话名>
  • tmux attach-session -t <会话名>
  • tmux rename-session -t <会话名>
  • tmux choose-session -t <会话名>
  • tmux kill-session -t <会话名>

当你临时断开多个 tmux 会话时候,可以指定恢复某个会话:

# tmux ls   #查看所有会话
0: 4 windows (created Tue Jan 22 00:42:16 2013) [177x48]
1: 1 windows (created Tue Jan 22 00:51:30 2013) [177x48]
  • tmux a -t 0 恢复第一个会话

快捷键

  • + $ 重命名当前Session
  • d detach 分离会话
  • t big clock
  • ? list shortcuts
  • : prompt

Tmux 常用功能 分割终端窗口

  • + ” 在光标当前所在窗口,横向分割出一个窗口
  • + % 在光标当前所在窗口,竖向分割出一个窗口
  • + h ………… ,跳转光标到左边的窗口
  • + j ………… ,跳转光标到下边的窗口
  • + k ………… ,跳转光标到上边的窗口
  • + j ………… ,跳转光标到右边的窗口
  • + ! 关闭所有分割出来的窗口
  • + x 关闭光标当前所在窗口。(或直接Ctrl+d)
  • + 向前置换当前面板
  • + 向后置换当前面板
  • + q 查询面板编号

使用不同的窗口工作

  • 一个终端里开了多个小窗口,还是不够用?
  • + c 创建一个新的窗口
  • + p 切换到上一个窗口
  • + n 切换到下一个窗口
  • + f 列出所有窗口
  • + w 列出目前所创建的窗口,能看到窗口编号,在按编号直接切换窗口,见图2
  • + 0-9 直接切换到指定编号的窗口
  • + , 修改当前窗口名字,见图3
  • + d 临时断开所有的会话,用命令# tmux attach 恢复会话
  • + & 关闭窗口之前,你需要确认一下

把窗口分成许多面板

  • 有时候你在编辑器工作的同时,需要查看日志文件。在编辑的同时追踪日志真的很有帮助。Tmux可以让我们把窗口分成许多面板。举个例子,我们可以创建一个控制台监测我们的服务器,同时用编辑器构造复杂的开发环境,这样就能同时进行编译和调试了。
  • tmux new -s panes
  • + ” 水平分割一个窗口 原来的
  • + % 再竖直分割 原来的
  • + 方向键 在他们之间移动
  • 按住不放,再按方向键,可以实现panes之间大小的改变
  • o swap panes
  • q show pane numbers
  • x kill pane
    • break pane into window (e.g. to select text by mouse to copy)
    • restore pane from window
  • ⍽ space - toggle between layouts
  • q (Show pane numbers, when the numbers show up type the key to goto that pane)
  • (Move the current pane left)
  • (Move the current pane right)
  • z toggle pane zoom
分割 原先未修改键位的分割方式是[PREFIX-%]和[PREFIX-“] 重新映射为
  • [PREFIX-] / [PREFIX–]
关闭一个面板, 要确认
  • [PREFIX-x]
  • 或者
  • exit [面板里执行]
切换
  • [PREFIX-hjkl] pane之间移动
  • [Ctrl-hjkl] pane之间移动
  • [Ctrl-] 最近使用两个窗口之间切换
  • [PREFIX-q] 展示窗口数字并选择跳转
  • [PREFIX-o] 循环切换
大小调整
  • [Ctrl-HJKL] pane大小调整
  • [PREFIX-z] trigger暂时把窗口变大
关闭及移动
  • [PREFIX-x] 关闭当前pane, 需确认
  • [PREFIX-] 当前pane移到左边
  • [PREFIX-] 当前pane移到右边
其他
  • [PREFIX-!] 当前pane在新的window中打开
  • [PREFIX-space] 会自动切换依次使用这些布局(几种窗口布局轮流切换)

复制粘贴

  • [PREFIX-[] 进入复制模式
  • => 可以进行的操作
  • space/v 开始选择
  • Ctrl-v 整块选择
  • hjkl 方向键移动
  • w/b 向前向后移动一个单词
  • fx/Fx 行内移动到下一个字符位置
  • ctrl-b/f 在缓冲区里面翻页
  • g/G 到缓冲区最顶/底端
  • / ? 向下, 向上查找
  • n/N 查找后下一个, 上一个
  • Enter/y 复制
  • [PREFIX-]] 粘贴
其他增强:
# 复制整个pane可见区域
[PREFIX-:] capture-pane
# 查看缓冲区内容
[PREFIX-:] show-buffer
# 列出缓冲区列表
[PREFIX-:] list-buffers
# 从缓冲区列表选择并插入到当期面板
[PREFIX-:] choose-buffer => 回车

其他

获得快捷键列表

[PREFIX-?]

进入命令模式
[PREFIX-:]
一些命令模式下的命令
# 新建窗口
new-window -n console
# 新建并执行命令
new-window -n processes "top"

Tmuxinator

  • Tmuxinator 是一个 Ruby 的 gem 包,可用于创建 Tmux 的会话。它的工作方式是先在配置文件中定义会话中的细节,然后用 1 条命令创建出这些会话
gem install tmuxinator
tmuxinator new project_a => ~/.tmuxinator/project_a.yml => 配置
启动: tmuxinator start project_a
可以别名: mux start project_a

vim插件

  • christoomey/vim-tmux-navigator, 安装更便捷的导航跳转

看窗口历史记录 在小窗口做一些操作时候,输出内容太多,如何回滚呢?

  • + PgUP 向上回滚
  • + PgDn 向下翻滚

在终端窗口里复制 在一个终端里分割了多个小窗口,你可能会在一个小窗口里复制一些代码或命令行到另外一个小窗口,这时你用小红点、鼠标、触摸板是无法胜任的。它把整个终端窗口当作是复制区域对象,而不隔离小窗口复制

  • [ 进入复制模式,移动光标到要复制文本区域后,按空格键开始选择要复制的内容, 利用h、j、k、l、$、0等(和vim中操作一样),按回车确认选中的内容。
  • ] 粘贴
  • 上面所介绍的是一些比较实用的功能,使用熟练在于 vim 的熟练应用. (控制键的快捷键按键组合方式:Ctrl+b前面也说过弊处,后来换成Ctrl+n发现在终端中不能向下翻命令,在改成Ctrl+m后,发现回车也用不了了。直接算了
  • tmux clear-history

github tmux tmux的一些个性化配置

  • 默认的tmux风格比较朴素甚至有些丑陋。如果希望做一些美化和个性化配置的话,建议使用gpakosz的tmux配置。它的本质是一个tmux配置文件,实现了以下功能:
  • 基于powerline的美化
  • 显示笔记本电池电量
  • 和Mac互通的剪切板
  • 和vim更相近的快捷键
  • Ctrl + A 是备用的前缀,按两次可以实现跳到行首
cd
rm -rf .tmux
git clone https://github.com/gpakosz/.tmux.git
ln -s .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .

会话,窗口,面板

  • 根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板,虽然其使用方法与终端控制台完全相同。
  • tmux使用C/S模型构建,主要包括以下单元模块:
  • server服务器。输入tmux命令时就开启了一个服务器。
  • session会话。一个服务器可以包含多个会话
  • window窗口。一个会话可以包含多个窗口。
  • pane面板。一个窗口可以包含多个面板。

配置

  • 我们先来看一下几个配置,这些配置才是我离不开tmux的原因:-)。tmux的配置文件是~/.tmux.conf,这个文件可能不存在,你可以自己新建。下面开始配置,首先,有没有觉得tmux的前缀按起来太不方便了,ctrl与b键隔得太远,很多人把它映射成C+a,也就是在配置文件(~/.tmux.conf)中加入下面这条语句:
  • 设置前缀为Ctrl + a
set -g prefix C-a
  • 与此同时,取消默认的前缀按键:
  • 解除Ctrl+b 与前缀的对应关系
unbind C-b
  • 配置完以后,重启tmux起效,或者先按C+b,然后输入:,进入命令行模式,在命令行模式下输入:
  • source-file ~/.tmux.conf
  • 你也可以跟我一样,在配置文件中加入下面这句话,以后改了只需要按前缀+r了。
  • 将r 设置为加载配置文件,并显示”reloaded!”信息
bind r source-file ~/.tmux.conf \\; display "Reloaded!"
  • 关于前缀,很多人都喜欢改成Ctrl+a,不过我个人更喜欢Ctrl+x,如果你是vim用户,你一定懂的。还有就是面板的切换很不方便,需要先按前缀,再按方向键,还记得vim里面怎么切换各个面板的吗?tmux也可以,因为它支持映射。把前缀映射改成Ctrl+x,再加入如下几条语句,现在切换窗口就和vim一摸一样了,顿时觉得亲切了很多。
upbind-key k select-pane -U#downbind-key j select-pane -D#leftbind-key h select-pane -L#rightbind-key l select-pane -R
  • 上面的最后一条语句会更改C-x l的功能,我挺喜欢这个功能的,因为我们很时候都是在两个窗口或这两个面板中切换,所以我又加入如下语句
  • select last window
bind-key C-l select-window -l
  • 现在我的l键可不能随便按了,Ctrl+x l是切换面板,Ctrl+x Ctrl+l切换窗口,Ctrl+l清屏。

复制模式copy-mode

  • 前缀 [ 进入复制模式
  • 按 space 开始复制,移动光标选择复制区域
  • 按 Enter 复制并退出copy-mode。
  • 将光标移动到指定位置,按 PREIFX ] 粘贴
  • 如果把tmux比作vim的话,那么我们大部分时间都是处于编辑模式,我们复制的时候可不可以像vim一样移动呢?只需要在配置文件(~/.tmux.conf)中加入如下行即可。
  • copy-mode 将快捷键设置为vi 模式
setw -g mode-keys vi

会话

  • C-x s 以菜单的方式查看并选择会话
  • C-x :new-session 新建一个会话
  • C-x d 退出并保存会话
  • 终端运行 tmux attach 返回会话
  • 命名会话
  • tmux new -s session
  • tmux new -s session -d #在后台建立会话tmux ls #列出会话tmux attach -t session #进入某个会话

使当前pane 最大化

  • 从我用vim开始,就相信这世界上有些人比你自己还了解你自己想要什么,所以乔老爷子才能做出让世人尖叫的产品,所以我经常浏览高手的.vimrc 文件,我用了tmux不到3天就发现,它怎么不能最大化当前pane?就像vim里的ZommWinPlugin.vim插件一样,你按下某键,当前窗口 就最大化了,获得最大可视界面。当目前为止,就还没有发现我有需求而别人没有的,同样,已有前人找到的解决办法,方法如下:
  • # zoom pane <-> window#http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.shbind ^z run “tmux-zoom”##

滚屏

  • 滚屏要进入copy-mode,即前缀+[,然后就可以用上下键来滚动屏幕,配置了vi快捷键模式,就可以像操作vi一样来滚动屏幕,非常的方便。退出直接按‘q’键即可。

以上是关于tmux的主要内容,如果未能解决你的问题,请参考以下文章

vim-zsh-tmux环境配置

这些是指哪些键位

tmux 终端复用详解

魔兽世界德鲁伊技能键位设置及摆放位置

如何在 konsole/yakuake 启动时自动启动 tmux?

我的 Vim 常用插件和键位映射配置