利器系列之——分屏利器Tmux时习之这篇⽂章中的 .f 配置⽂件你可以在我的代码仓库中到
为什么使⽤分屏⼯具
在 C、C++ 开发过程中分屏是⼀项⾮常提⾼效率的功能,因为我们时常需要⼀边写代码⼀边编译、测试。在脱离 IDE 的时代,通常我们需要开多个终端:⼀个终端编辑⽂件、⼀个终端编译运⾏程序、⼀个终端查看相关的 man ⽂档...。多个终端管理起来其实是⾮常不便的,因为你需要不停的在各个终端之间切换。终端分屏⼯具是解决这个问题的绝佳办法,它可以把⼀个终端分成多个窗⼝,把所有需要做的事情放到⼀个终端⾥⾯,让你不⽤再耗费⼤量的时间在不同的窗⼝之间切换。
为什么使⽤ Tmux
分屏⼯具主要分成两类,其中第⼀类是⾃带分屏功能的终端模拟器:在 Ubuntu 下⾯有⼀个终端模拟器 Terminator ⾃⾝就⽀持分屏,Deepin Linux 的深度终端也⽀持同样的功能。
但是这些终端模拟器的分屏功能可配置性太差,你没有太多的选择。他们最⼤的硬伤在于你只能使⽤他们的终端,所以你得忍受这些终端模拟器的蹩脚的地⽅,⽐如深度终端卡到爆的体验。此外如果你没有安装 X11 图形界⾯系统,你没有办法使⽤这些终端模拟器。
第⼆类是终端分屏软件,它不依赖于终端模拟器本⾝,可以在任何你喜欢的终端模拟器上运⾏,这⼀类的
软件中⽐较有名的包括:GNU Screen 以及 Tmux。
前者的历史⾮常的悠久⽐较稳定,以 GPL 协议发布。Tmux 是 2009 年才出现的产品,以 BSD 协议发布。很多⼈戏称 Tmux 为 Screen 的 BSD 版本重写,因为它包含了Screen ⼤部分的功能。从个⼈体验来说,Tmux 相对来说⽐ Screen 容易使⽤⼀些(我试过使⽤Screen,但是由于太笨,怎么⽤都不顺⼿)所以这⾥只介绍 Tmux 的使⽤。
Tmux 能做什么
Tmux 的功能⾮常⾮常的强⼤,使⽤它你可以:
在终端模拟器中虚拟出多个窗⼝
把⼀个窗⼝分成多个区域(panel)。
快速在各个区域中进⾏复制黏贴操作。
配置你喜欢的快捷键。
使⽤脚本控制 Tmux。
实现结对编程。
.....
本⽂只是简单的介绍 Tmux 基础配置以及它的分屏和复制功能,其他的功能⼤家可以参考《tmux: Productive Mouse-Free Development》⼀书。这本书⾮常的薄,值得通读。
Tmux 基本概念
为了⽅便理解 Tmux 的使⽤,这⾥先介绍两个相关的概念。
窗⼝(windows)
在没有 Tmux 这样的⼯具之前,如果我们需要在终端同时完成多项任务,⽐如同时听歌、收邮
件、查看⽂档、编辑代码,我们可能会需要开多个终端模拟器窗⼝来解决这个问题。(如果连终端模拟器都没有,那估计就只能在不同的 tty 中不断的切换)
Tmux 强⼤之处在于,它可以让你在⼀个终端模拟器窗⼝中完成原本需要多个终端模拟器窗⼝来完成的事情。它的做法是在⼀个终端模拟器窗⼝中虚拟出多个窗⼝,让你在不同的虚拟窗⼝中完成不同的⼯作,并能够⾮常⽅便的在各个窗⼝之间进⾏切换。
下⾯是⼀张 Tmux 多窗⼝运⾏界⾯图:
在上图中,我开了三个窗⼝,⼀个⽤来运⾏ VIM 编辑博客,⼀个⽤来查看 man ⽂档,另⼀个运⾏ top 命令查看进程运⾏状况,⽽这些统统在 Tmux 的⼀个 session 中完成(其实 Tmux 还可以运⾏多个 session,不过个⼈觉得⽤处不是特别⼤,有兴趣的可以参考《tmux: Productive Mouse-Free Development》⼀书)。
⾯板
⼤部分情况下我们会把不同的任务分派到不同的窗⼝中去。但是很多时候即使是⼀个任务你也没有办法在单个窗⼝在很好的完成它。⽐如 coding 这项任务,你可能需要⼀边写代码,⼀边⽤gdb 调试。⼜如 Git 提交这项任务,在进⾏ git add 提交之前我们通常是需要知道哪些⽂件有改动,这个时候我通常会调⽤ git status 命令查看⼯作⽬录的状态,调⽤ git diff 查看改动的地⽅。通常我会⼀边参考 git status 的输出,⼀边查看 git diff 的输出,⼀边进⾏git add 操作。我并不希望把这些操作分散到不同的窗⼝中去,因为我只是在完成⼀项任务。解决这种问题可以使⽤Tmux 的⾯板(panel),它把⼀个虚拟窗⼝分成多个可独⽴操作的区域,让你在不同的区域之间协调⼯作完成同⼀项任务,如下图。
上⾯这两个功能是我在⽇常开发过程中⽤得最多的功能,所以下⾯主要讲这两个功能的⼀些配置。其实 GNU Screen 也同样有前⾯提到的这些功能,Tmux 的优势在于它的易⽤和容易配置上⾯。
Tmux 配置
准备⼯作
在进⾏真正的配置之前,你需要:
安装 Tmux (以 debian 系列为例)
sudo apt-get install tmux
创建配置⽂件
touch ~/.f
去掉⼤写键
⼤写键是⼀个历史遗留按键,它霸占了黄⾦位置,却很少使⽤。⼀种⽐较流⾏的做法是把它替换成 Ctrl 键,或者和 Ctrl 键互换。在EmacsWiki中有⼀篇⽂章专门介绍各个平台如何重新绑定这个键。
我⽐较习惯的做法是直接把Caps Lock按键替换成 Ctrl。⽅法很简单,在你的 .bashrc或者 .zshrc 中加⼊:
setxkbmap -option ctrl:nocaps
有了这个黄⾦位置,许多命令输⼊起来会简单很多,⽐如输⼊ shell 命令时⽤常⽤的C-r、C-a、C-e,切换 VIM buffer 常⽤的 C-w C-w 等等。
如果你需要输⼊长串的⼤写字符,在 VIM 中你可以先输⼊⼩写然后输⼊ gUw 转为⼤写,在
shell 命令⾏中可以使⽤ A-u 把输⼊的单词变成⼤写。
绑定快捷键前缀
修改快捷键前缀是配置 Tmux 的第⼀步,因为 Tmux 中⼏乎所有的按键都是组合键,但是它默认的前缀 C-b 输⼊起来有点吃⼒。许多⼈建议把它绑定到 GNU Screen 的 C-a 上去,不过 C-a 在 shell 命令输⼊中是⼀个常⽤的快捷键(⽐如编辑⼀个问题突然发现没有权限,可以通过 C-a 跳到命令⾏⾸加上 sudo 再执⾏),所以我把它绑定到了 C-f,因为修改过⼤写键之后,这两个键输⼊起来是⾮常顺畅的。
修改前缀的⽅法⾮常简单,你只需要在~/.f中添加:
set -g prefix C-funbind C-b
当然⽆论你使⽤哪⼀个前缀你都有可能和其他的软件相冲突,⽐如 C-a 在 shell 中使⽤较多,C-f 在 VIM 中也是⼀个快捷键。Tmux 为了解决这个问题提供了⼀个功能叫做sendkey,就是绑定另外⼀个快捷键,输⼊这个快捷键可以把 PREFIX 键发送到其他的程序。我把这个快捷键设置成了PREFIX-PREFIX。也就是说连续按两遍 C-f 可以发送⼀个C-f 按键。设置⽅法是在~/.f 中加⼊:
bind C-f send-prefix
注意,在 Tmux 配置中 bind 后⾯只需要写 PREFIX 后⾯的部分,所以 bind C-f 其实最终是设置了 PREFIX-C-f)
当然这种⽅式并不算⾮常完美,因为你不得不输⼊两次 PREFIX,不过这个 tradeoff 我觉得是值得的。
窗⼝(windows)的操作配置
Tmux 的窗⼝操作快捷键设置的是⽐较合理的,并不需要额外的配置,你需要做的只是记住它的快捷键:
PREFIX-c : 创建新的窗⼝(create)EXIT,C-d : 关闭窗⼝,Tmux 中的窗⼝和终端模拟器中的窗⼝⼀样可以通过exit、C-d 来关闭。PREFIX-n : 切换到下⼀个窗⼝(next)PREFIX-p : 切换到前⼀个窗⼝(previous)PREFIX-w :列出所有的窗⼝,以供快速切换
Tmux 创建的窗⼝默认是从 0 开始编号的,如果你希望从 1 开始编号可以在配置⽂件中加⼊:set -g base-index 1
⾯板(panel)的操作配置
个⼈感觉 Tmux 本⾝的 panel 快捷键配置是不太合理的,所以我修改了⼤部分的 panel操作快捷键。这⼀⼩节分三个部分讲解 Tmux 的⾯板操作 —— 也就是传说中的分屏操作。
分屏
Tmux ⽀持⽔平分屏和垂直分屏,但是 Tmux 默认的快捷键很难输⼊。默认垂直分屏是C-'⽽默认⽔平分屏是C-%。我习惯的做法是使⽤最直观的-表⽰⽔平分屏,|表⽰垂直分屏,不过因为|和⼀般在同⼀个按键上⽽后者不需要按住SHIFT来转换,所以我⼀般直接把绑定为垂直分屏。在你的~/.f⽂件中加⼊:
unbind '''bind - splitw -vunbind %bind \ splitw -h
现在你可以使⽤PREFIX--(按下 PREFIX 组合键之后按下 - 键)来进⾏⽔平分屏,使⽤PREFIX-来进⾏垂直分屏。
和窗⼝⼀样,Tmux 分出来的 panel 默认是从 0 开始编号,你可以通过在配置⽂件中加⼊:
set -g pane-base-index 1
使编号从 1 开始。
切换⾯板
如何在vim中运行命令分屏之后最重要的⼀个操作应该是在不同的 panel 之间切换,我是⼀个 VIM 重度患者,所以习惯把涉及到⽅位操作的所有按键绑定到 hjkl 上⾯去。
我的配置如下:
bind-key h select-pane -Lbind-key j select-pane -Dbind-key k select-pane -Ubind-key l select-pane -R
使⽤ PREFIX-[hjkl] 就可以轻松的切换到不同⽅向的⼩窗⼝中去。
Tmux 还可以通过PREFIX-q在所有的⾯板上显⽰⼀个编号,输⼊这个编号可以直接跳转到这个这个⾯板上去。
修改当前⾯板的⼤⼩
Tmux 的默认分屏是对半分,不过更多的时候我们需要的是⼀个较⼤的主窗⼝和⼏个⼩⼀点辅助窗⼝。
⽐如⼀个⼤的 VIM 窗⼝编辑源代码,⼀个⼩的窗⼝⽤来编译源码。修改完源码之后可以⽴即切换到⼩窗⼝进⾏编译是⼀件很幸福的事情。Tmux 提供了改变 panel ⼤⼩的功能,我依旧把它绑定到 hjkl 四个按键上,只不过这⼀次使⽤的是C-[hjkl],也就是说最终可以通过 PREFIX-C-[hjkl] 来改变当前窗⼝的⼤⼩,配置如下
bind -r ^k resizep -U 5bind -r ^j resizep -D 5bind -r ^h resizep -L 5bind -r ^l resizep -R 5
如果你是两个垂直并列的 panel,可以使⽤ PREFIX-C-[hl] 来调整它们的⼤⼩,如果你是两个⽔平并列的 panel,可以使⽤ PREFIX-C-[jk] 来调整它们的⼤⼩。你可以通过把上⾯的 5 改成你想要的值来调整单次 resize 的粒度。
此外如果你想要暂时把其中⼀个 panel 最⼤化,你可以使⽤PREFIX-z
Tmux 还为 panel 提供了⼏种默认的布局,你可以通过PREFIX-space来切换这些布局。
复制黏贴的操作
前⾯⼏个⼩节系统的介绍了窗⼝和⾯板的使⽤,下⾯重点介绍⼀些 Tmux 的拷贝模式(copy-mode)。
我们经常需要在⼀个窗⼝(或者 panel)中复制代码黏贴到另⼀个窗⼝(或者 panel)中(虽然这不是⼀个很好的习惯)。Tmux 提供了强⼤的的复制黏贴功能来帮助我们完成这⼀任务。
在 Tmux 中复制是在拷贝模式下完成(copy-mode),进⼊拷贝模式的默认快捷键是PREFIX-[,不过我习惯把它绑定到PREFIX-C-v上⾯去
bind ^v copy-mode
进⼊了拷贝模式之后可以使⽤ hjkl 移动光标到你想要拷贝的地⽅。到需要复制的部分之后按空格键开始复制,使⽤ hjkl 选择复制的区域,最终按回车完成复制退出拷贝模式。同样这些按键,你也可以⾃⼰绑定快捷键。我习惯了 VIM 的复制黏贴,所以我把 v 绑定为拷贝模式下复制的开始(默认是 SPACE),y 绑定为复制结束(默认是 ENTER)。
bind -t vi-copy v begin-selectionbind -t vi-copy y copy-selection
复制完成之后你可以切换到你想要的黏贴的窗⼝,输⼊PREFIX-]完成黏贴操作,当然这个按键你同样可以绑定,⽐如我把它绑定到PREFIX-C-p上⾯。
bind ^p pasteb
Tmux 使⽤中的其他问题
去掉⿏标
Tmux 的⼀个⼝号是 mouse free,有了它之后你可以抛弃⿏标,如果你想要禁⽤⿏标设置,你可以在你的~/.f⽂件中加⼊:
set -g mode-mouse off
颜⾊问题
Tmux 在很多终端下使⽤的时候会出现颜⾊错乱的问题,为了解决这个问题你需要设置TERM 环境变量,最简单的做法是给 tmux 起⼀个别名,如下:
alias tmux='TERM=xterm-256color tmux'
把上⾯这句写到你的.bashrc或者.zshrc中即可。
Tmux ⽹上有很多相关的资料可以参考,最全⾯的资料应该是《tmux: Productive Mouse-Free Development》⼀书,强烈推荐有兴趣了解 Tmux 的⼈看⼀看这本书。聪明的你⼀定很容易到这本书。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。