前言

ssh连接云服务器,从12年开始一直用的screen,最近发现tmux功能更强大,换个轮子。记录下相关的操作及配置。
简单介绍下:tmux,全称terminal multiplexer,tmux是screen的替代品,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台,且无需担心掉线。相对于Screen,它支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活、动态的进行各种布局和操作。

安装

自动安装

$ yum install tmux    # linux, 目前大部分的centos上的源版本是1.8,建议源码安装最新版
$ brew install tmux   # macos

源码编译安装(2.6以上版本)

$ yum install libevent libevent-devel ncurses-devel
$ wget https://github.com/tmux/tmux/releases/download/2.6/tmux-2.6.tar.gz 
$ tar -zxvf tmux-2.6
$ ./configure && make
$ sudo make install   #默认安装在  /usr/local/bin/tmux 

命令行启动命令

$ tmux
$ tmux ls   #列出当前的sessions
$ tmux new -s <session-name> -n <window-name>
$ tmux attach   #默认attch最后一个session, 简略形式为   $ tmux a
$ tmux attach -t <target-session> 
$ tmux detach   #断开当前session
$ tmux detach -s <target-session> 
$ tmux rename -t <target-session> new-name
$ tmux kill-session -t <target-session>

配置及使用

tmux 默认会先从 /etc/tmux.conf 加载系统级的配置项,然后从 ~/.tmux.conf 加载用户级的配置项。默认情况下,tmux的子命令启动是 C-b,进入tmux后同时按ctrl+b按键进入子命令模式,再直接输入tmux的子命令。screen默认启动子命令是C-a。为了保持习惯,修改tmux配置文件,改为跟screen一致的C-a启动子命令。

配置文件一览

$ cat ~/.tmux.conf
# Tmux settings   跟screen保持习惯一致
set -g prefix C-a
unbind C-b

# Set XTerm key bindings
setw -g xterm-keys on

# Set colors
set-option -g default-terminal "screen-256color"

# Set reload key to r
bind r source-file ~/.tmux.conf \; display "Reloaded!" 

# Ctrl-a 回到shell头部
bind C-a send-prefix

# Count sessions start at 1
set -g base-index 1

# Use vim bindings
setw -g mode-keys vi

# Set history
set -g history-limit 10000

# Change window split key
unbind '"'
bind | split-window -h -c "#{pane_current_path}"          #左右分割
unbind %
bind - split-window -v -c "#{pane_current_path}"          #上下分割
unbind c
bind c new-window -c "#{pane_current_path}"               #创建新窗口时默认进入当前窗口


# Change pane size
bind K resize-pane -U 5         #窗格上移5
bind J resize-pane -D 5         #窗格下移5
bind H resize-pane -L 5         #窗口左移5
bind L resize-pane -R 5         #窗口右移5

bind -r k resize-pane -u 5      #窗口重复操作
bind -r j resize-pane -d 5      #窗口重复操作
bind -r h resize-pane -l 5      #窗口重复操作
bind -r l resize-pane -r 5      #窗口重复操作

# Swap window pane
bind ^u swapp -U                #与上窗格交换   (Ctrl-u)
bind ^d swapp -D                #与下窗格交换   (Ctrl-d)

# Remap window navigation to vim
unbind-key j
bind-key j select-pane -D 
unbind-key k
bind-key k select-pane -U
unbind-key h
bind-key h select-pane -L
unbind-key l
bind-key l select-pane -R


# Set status bar
set -g status-utf8 on
set -g status-bg black
set -g status-fg white
set -g status-interval 5 
set -g status-left-length 90
set -g status-right-length 60
#set -g status-left "#[fg=Green]#(whoami)#[fg=white]::#[fg=blue]#(hostname -s)#[fg=white]::#[fg=yellow]#(curl ipecho.net/plain;echo)"
set -g status-left "#[fg=Green]#(whoami)#[fg=white]::#[fg=yellow]#(curl ipecho.net/plain;echo) "
set -g status-justify left
set -g status-right '#[fg=Cyan]#S #[fg=white]%a %d %b %R'
set -g pane-active-border-fg white
setw -g monitor-activity on
set -g visual-activity on
setw -g window-status-format '#[fg=red,bold]#I#[fg=blue]:#(~/.tmux_set_window_name.sh #{pane_current_path})#[fg=yellow]#F'
setw -g window-status-current-format "#[fg=red,bold]#I#[fg=blue]:#(~/.tmux_set_window_name.sh #{pane_current_path})#[fg=yellow]#F"
setw -g window-status-separator "  "
setw -g automatic-rename on

# Set the title bar
set -g set-titles on
set -g set-titles-string '#(whoami)'
$ cat ~/.tmux_set_window_name.sh
#/bin/bash

echo $1 | awk -v home="$HOME" -F'/' '{
if($0 == home) {print "~"} 
else if(length($0) < 8){ print $0 } 
else {print "/"$2"."substr($0, length($0)-5, length($0))}
}'

滚屏并复制操作:进入copy-mode

  • Step1: C-a [ #进入复制模式
  • Step2: space 开始复制,移动光标选择复制区域,可以采用vi模式选择,在~/.tmux.conf中加入如下行 setw -g mode-keys vi
  • Step3: 按 Enter 复制并退出copy-mode
  • Step4: C-a ] # 粘贴复制内容

常用快捷键

C-a d #detach当前session,效果与 tmux detach 一样
C-a l #切换到previously selected window, 一般用于两个windows之间来回切换
C-a 0-9 #切换当前的window,按照序号

C-a n #切换到next window
C-a p #切换到previous window

C-a % #竖直方向切分当前window
C-a " #水平方向切分当前window

C-a o #切换到当前window的下一个pane
C-a Left/Right/Up/Down #切换当前的pane
C-a q #显示当前window的pane序号

C-a { #将当前pane跟上一个pane交换位置
C-a } #将当前pane跟下一个pane交换位置

C-a w #交互地选择当前window
C-a s #交互地选择tmux的session

C-a t #显示time

遇到的一些障碍

  • 定制status bar时,对于tmux自定义的variable无法传递给shell-command,原因是使用的tmux版本是1.8太旧,在#{shell-command}中解析 variable的时候有bug
  • 在使用awk的时候,shell的变量传递需要使用 -v 参数

参考