tmux

tmux基础功能和screen差不多,但是目前来说tmux总体上比screen更加好用些。

根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板, 虽然其使用方法与终端控制台完全相同。

tmux使用C/S模型构建,主要包括以下单元模块:

一个session可以被多个client接入,显示和操作在client中同步显示。

常用配置项

常用热键

tmux的任何指令,都包含一个前缀,也就是说,你按了前缀(一组按键, 默认是Ctrl+b)以后,系统才知道你接下来的指令是发送给tmux的。

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   #显示时钟

安装

# centos
yum install tmux

# debian/ubuntu
sudo apt-get install tmux

# cygwin
apt-cyg install tmux

# MacOS
brew install 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创建的会话中无法通过滚轮上下来查看历史信息,需要依次按下键盘上 ctrl + b PgUp ,接着就可以使用 PgUp PgDn ↑ ↓ 来查看历史信息了,按下 q 退出。

到目前位置tmux和前面的screen其实还是没有太大差别的,主要是快捷键、选项以及小部分操作上有些不同,真正区别大的是tmux的每个会话中还有窗口和窗格的概念。

窗口与窗格

一个tmux的会话中可以有多个窗口(window),每个窗口又可以分割成多个窗格(pane)。对窗口和窗格相关操作都是在会话中进行的。

如果把前面的会话看做是一个excel文件的话,那窗口就像是其中的一张张sheet。

更多介绍 tmux内容挺多的,更多内容可以参考 man tmux 或是下面链接: https://github.com/tmux/tmux

tmux可以创建很多的会话、窗口、窗格,如果用的多的话在系统重启或崩溃的情况下一个个恢复就比较纠结了。针对这个情况甚至出了附加的工具来管理这些内容,参考如下:

https://tmuxp.git-pull.com/

别人的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,然后在打开几个窗口和面板很麻烦,那么下面这个脚本你一定会 喜欢。参考这里: 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