tmux使用 转自tankywoo
三个术语:
- session: 管理多个window的会话
- window: 一个window就是整个屏幕
- pane: 一个window可以被横向或纵向分割为多个pane, 也就是俗称的分屏
tmux有很多组合键, 类似screen, tmux的组合键前缀(prefix)默认是C-b
, 如果习惯了screen的C-a
, 可以修改prefix, 以下都用C-b
表示前缀
快捷键
基本操作
C-b :
进入tmux的命令行模式C-b ?
显示所有的bind-keyC-b [
进入复制模式C-b ]
进入粘贴模式
如果有设置 setw -g mode-keys vi
的话,可按 vi 的按键模式操作。移动至待复制的文本处,按一下空格,结合 vi 移动命令开始选择,选好后按回车确认.
session 操作
C-b d
deattch当前的sessionC-b C-z
挂起当前的sessiontmux attach [-t sessionname]
恢复sessionC-b $
可以重命名当前的sessiontmux ls
显示tmux的所有session
window 操作
C-b c
可以新建一个新的windowC-b &
关闭当前的windowC-b ,
可以重命名当前的windowC-b p
切换到前一个windowC-b n
切换到后一个windowC-b l
切换到上一次的windowC-b number
切换到指定编号的window, 默认从0开始C-b w
显示当前会话的window, 可以通过上下选择来切换tmux neww -n tmux
新建一个window, 名称是tmux
pane 操作
C-b "
将当前window横向分割为两个paneC-b %
将当前window纵向分割为两个paneC-b 方向键
在当前window里移动到其他paneC-b o
切换到下一个paneC-b Alt+方向键
调整pane的大小C-b q
显示pane的编号C-b x
关闭当前的pane, 会有确认提示. 也可以直接C-dC-b {
把当前的pane移到左边C-b }
把当前的pane移到右边C-b z
把当前pane最大化/恢复. 感谢 yanyaoer 和 陈兴明Mingo 两位同学, tmux 升级到 1.8 后有这个特性了.C-b Space
切换到下一个布局(这个布局应该是系统默认的一些)
配置文件
以下配置更新会有延迟, 最新配置见我的 dotfiles
# 设置状态栏左部宽度 set -g status-left-length 40 # 设置状态栏显示内容和内容颜色。这里配置从左边开始显示,使用绿色显示session名称,黄色显示窗口号,蓝色显示窗口分割号 set -g status-left "#[fg=colour52]#S #[fg=yellow]#I #[fg=cyan]#P" # 设置状态栏右部宽度 set -g status-right-length 80 # 设置状态栏右边内容,这里设置为时间信息 set -g status-right "#[fg=colour106]#(~/bin/system_info.sh) #[fg=colour208]|%d %b %R" # 窗口信息居中显示 set -g status-justify centre
# 监视窗口信息,如有内容变动,进行提示 setw -g monitor-activity on set -g visual-activity on set -g status-utf8 on
setw -g mode-keys vi # set-option -g default-command "reattach-to-user-namespace -l zsh"
#colorscheme source-file ~/Develop/dotfiles/tmux/color/solarized-256.conf
# 窗口号和窗口分割号都以1开始(默认从0开始) set -g base-index 1 setw -g pane-base-index 1
# 支持鼠标选择窗口,调节窗口大小 setw -g mode-mouse on set -g mouse-select-pane on set -g mouse-resize-pane on set -g mouse-select-window on set -s escape-time 1
# 设置C-a a为发送C-a键 bind a send-prefix # 加载tmux配置文件的快捷键 bind r source-file ~/.tmux.conf\; display "Reloaded!" # 快捷键查看man bind / command-prompt "split-window 'exec man %%'" unbind "%" unbind "\"" # 修改默认的窗口分割快捷键,使用更直观的符号 bind | split-window -h bind - split-window -v # 选择窗口功能修改为和Screen一样的C-a " bind "\"" choose-window
# 选择窗口分割快捷键 bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 选择窗口快捷键 bind -r C-h select-window -t :- bind -r C-l select-window -t :+ # 调节窗口大小快捷键 bind -r H resize-pane -L 5 bind -r J resize-pane -D 5 bind -r K resize-pane -U 5 bind -r L resize-pane -R 5
# 快捷调整窗口分割到全屏 unbind Up bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp unbind Down bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp
# 快捷记录窗口内的内容到文件中 bind P pipe-pane -o "cat >>~/#W.log" \; display "Toggled logging to ~/#W.log"
脚本化tmux
脚本化是 Tmux 的一大亮点
脚本化可以让我们自己定义一些脚本, 来构造自己的tmux布局
比如我写了一个分割三个pane的小脚本放在 ~/.tmux/tanky 里:
google搜出来的讲解tmux脚本化的E文不少, 不过没几个解释了 C-m
是干嘛的, 查看绑定键也没找到
后来在An Introduction to Scripting Tmux Key Bindings上看到了解释.
The C-m at the end is interpreted by Tmux as the enter key.
在 ~/.tmux.conf 里绑定快捷键: bind T source-file ~/.tmux/tanky
这样, 就可以通过快捷键 C-b S-t 一键初始化一个如下图的布局.
另外, 还可以直接写shell脚本, 然后运行, 比如:
tmux start-server
if ! $(tmux has-session -t 'tankywoo'); then tmux new-session -d -s 'tankywoo' -n 'tankywoo' # -d * tmux select-window -t 'tankywoo' tmux split-window -h -p 60 tmux select-pane -t 1 tmux split-window -v -p 25 tmux send-keys -t 0 'ipython' C-m # The C-m at the end is interpreted by Tmux as the enter key.
tmux new-window -n <span class="s1">'ops-dev'</span>
tmux <span class="k">select</span>-window -t <span class="s1">'tankywoo'</span>
tmux <span class="k">select</span>-pane -t 1
fi
tmux attach-session -d -t 'tankywoo'
下面这几个链接不错
技巧
批量操作
当需要在多个机器执行相同操作时, 可以考虑用pdsh
等内容分发的工具, 而tmux也有它的一种强悍的方式. 在一个windows里打开多个pane, 每个pane登录一台服务器, 设置windows的选项, 在其中一个pane上操作时, 其它pane都会复制相同的操作.
在tmux的命令行里, 使用选项set synchronize-panes on
即可.
在不同大小的屏幕打开一个session
TODO
比如在一个较小的桌面打开一个session, 然后又在一个较大的桌面也打开这个session:
tmux attach -t session-name
则会发现在较大的桌面上, 也只会显示和小桌面同样大小的窗口, 其余部分被密密麻麻的小点扩充.
解决方法之一是:
tmux attach -d -t session-name
即先强制 detach
掉小桌面的session, 然后再在较大桌面打开session.
另外, 看到很多帖子说可以设置:
setw -g aggressive-resize on
但是我设置后还是没有成功.
参考:
扩展 - tmux powerline
- tmux-powerline项目 官方说此项目现在只做维护, 不更新
- powerline项目 这个是最新项目
其他资料
- screen and tmux screen和tmux的操作对比
- Tmux - ArchWIKI 对tmux介绍的非常详细
- TMUX – The Terminal Multiplexer (Part 1)
- 使用tmux
- Using tmux
- Practical Tmux