tmux使用奇技淫巧
最近在用screen,后来发现,tmux更好用啊。这是一个笔记。
参考资料:
https://cloud.tencent.com/developer/article/1195836
安装
sudo apt-get install tmux
配置
配置快捷键
#首先创建几个alias
vi ~/.zshrc
alias tls="tmux ls"
alias ta="tmux attach -t "
alias tk="tmux kill-session -t"
alias ts="tmux switch -t "
alias tn="tmux new -s"
编辑配置文件
touch ~/.tmux.conf
vi ~/.tmux.conf
内容:
本配置中,prefix被重设为ctrl+x
set -g status-bg colour14
# 新版配置,配置当前窗口的颜色
setw -g window-status-current-style fg=red,bg=white
set -g window-status-format '#I:#{=-10:window_name}'
set -g window-status-current-format '#I:#{=-10:window_name}'
# 老配置,配置当前窗口的颜色
# set -g window-status-current-fg red
# set -g window-status-current-bg white
# 这是为了在使用ctrl+x+r的时候,重新把窗口的编号重排
move-window -r
set-option -g escape-time 50
set -g default-terminal "screen-256color"
set -g base-index 1 # 窗口从1开始计数
set -g history-limit 10000 # 设置历史记录最大条数
setw -g mode-keys vi # 设置按键模式为 Vi 模式
set -wg window-status-separator ""
set-window-option -g automatic-rename off
set-option -g allow-rename off
# 复制模式下使用系统剪贴板
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -se c -i'
# 旧版本 复制模式下使用系统剪贴板
# bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard'
# mac 复制模式下使用系统剪贴板
# bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'pbcopy'
# 重新载入配置
bind r source-file ~/.tmux.conf \; display "Reloaded!"
# 以下配置为取消原有 hjkl 键的绑定
# 并绑定 Pane 选择,和 Vim 操作一致
unbind-key h
bind-key h select-pane -L
unbind-key j
bind-key j select-pane -D
unbind-key k
bind-key k select-pane -U
unbind-key l
bind-key l select-pane -R
bind-key u command-prompt -p "join pane from:" "join-pane -s '%%'"
bind-key o command-prompt -p "send pane to:" "join-pane -t '%%'"
# 切换窗格大小
bind Down resize-pane -D 5
bind Right resize-pane -R 5
bind Left resize-pane -L 5
bind Up resize-pane -U 5
# 在远端和本地使用shift进行切换,套娃
# 参考:http://stahlke.org/dan/tmux-nested/
unbind C-b
set -g prefix C-x
bind -n C-t new-window -a
bind -n C-h prev
bind -n C-l next
bind -n S-left swap-window -t -1
bind -n S-right swap-window -t +1
bind -n M-F11 set -qg status-bg colour4
bind -n M-F12 set -qg status-bg colour14
bind -n C-k \
send-keys M-F12 \; \
set -qg status-bg colour4 \; \
unbind -n C-h \; \
unbind -n C-l \; \
unbind -n S-left \; \
unbind -n S-right \; \
unbind -n C-t \; \
set -qg prefix C-b
bind -n C-j \
send-keys M-F11 \; \
set -qg status-bg colour14 \; \
bind -n C-h prev \; \
bind -n C-l next \; \
bind -n S-left swap-window -t -1 \\\; prev \; \
bind -n S-right swap-window -t +1 \\\; next \; \
bind -n C-t new-window -a -c "#{pane_current_path}" \; \
set -qg prefix C-x
# 覆盖原来的 ctrl+x+(/) 作为切换前一个,后一个session的配置,现在直接ctrl+x+9/0
bind '0' switch-client -n
bind '9' switch-client -p
下面具体解释一下这个配置文件。
复制到系统剪贴板
网上的教程是使用xclip,首先要安装xclip,此时,在copy模式下,按空格选取,再按一下y。就复制到系统剪贴板了。
子窗口管理
# 创建子窗口
ctrl+x c
# 显示列表
ctrl+x w
# 关闭子窗口
ctrl+x x
# 修改窗口名
ctrl+x ,
分屏
用这个软件,就是用来用分屏玩的。
# 注意已经把唤醒键改成了ctrl+x
# 上下分屏
ctrl+x "
# 左右分屏
ctrl+x %
# 此时可以用ctrl+x h/j/k/l 来切换分屏了
分屏后的窗格管理
有时,已经打开了N个window。(比如窗口 0,1),并且通过分屏想将其中的部分窗格自由组合。可以这样操作:
首先对应配置文件为,它会让pane(窗格)有join/send的功能。
bind-key u command-prompt -p "join pane from:" "join-pane -s '%%'"
bind-key o command-prompt -p "send pane to:" "join-pane -t '%%'"
如果想把1号window加入到0号window,使之成为0号window的一部分。
- 切换到window0,使用
ctrl+h/l
- 此时按下
ctrl+x u
,输入:1
- window1从远端加入到window0成为一个pane。window1随即关闭。
| pane0 |
|----------------|
| pane1 |
如果想将pane1作为一个独立的window
- 先创建一个新window。
ctrl +t
。假设这个window的标号为1
。 - 切换为window0。此时window0有两个窗格:pane0,pane1。如下图所示。
| pane0 |
|----------------|
| pane1 |
- 使用
ctrl+x+k
将光标切换到pane1,按快捷键ctrl+x o
,进入send模式,输入:1
。此时pane1被移动到了window 1,成为它的一个pane。window0的pane1消失。
在远端和本地进行切换
tmux的强大之处在于,可以在远程的机器上装上tmux,类似于套娃的玩法。
效果图:
上面的 0:bash 1:bash
window是远程的。下面的9个window是本地的。
但是套娃的切换窗口是个问题。国外大神给出了解决方案:
http://stahlke.org/dan/tmux-nested/
使用本文的配置,可以使用ctrl+h/l
切换window(左右切换)。也可以使用ctrl + j/k
切换是本地还是远程(上下切换)。谁用谁知道。
去掉填充屏幕的小圆点
有时在不同的终端登录同一个tmux,会发生屏幕适配的问题。空白屏幕会被小圆点填充。
此时,在命令模式下:
:a -d
来自 大脸猪 写于 2020-03-16 18:24 -- 更新于2021-11-17 17:11 -- 1 条评论