利器系列-终端分屏利器 tmux

这是利器系列的第 1 篇,当然还是要写每天都在用的 tmux 咯! 当时我不会介绍 tmux 的全部内容。 第 0 篇是 利器系列-更高效的Vim

终端分屏

首先,我们先来了解下终端分屏是什么。顾名思义,终端分屏就是把一个终端屏幕拆解为多个窗口,并且可以进行切换。

  • 为什么要进行终端分屏呢?

看过我介绍或者看过我之前文章的,应该都知道我是个 Vim 党,日常工作也都是在终端下,在终端下使用编辑器而不使用 GUI 或者 IDE,第一是因为在终端下我可以使用全键盘控制,不需要鼠标之类的,效率很高;第二,在终端下可以更灵活的配合系统工具完成我所需要的一切,包括测试之类的;第三,IDE 的功能太过繁琐,占用资源很多,而对我来说,这些都是累赘。第四,因为我长期都在 Linux 下,而且更多时间在考虑效率,默认情况下,终端内的 Vim 要比其他各种 IDE 要看着顺眼的多。

  • 为什么不使用 iTerm2 呢?

iTerm2 是一个纯粹的 GUI 工具,它的切割是真正对窗口的切割,而非对终端的切割,并且它也不能保存会话信息。为什么我一直在说会话信息呢?你有没有试过 结对编程 ? (看我纯洁的微笑 :-) 用 tmux 绝对是利器!

tmux 简介

tmux 不仅仅是一款终端分屏软件(终端复用器),同时 tmux 也可以随时断开或者进入会话,即终端会话保持(可能你会想到 Screen 但 tmux 却可以做到更多)。想想你有没有遇到过在服务器上编译调试,去接了杯水回来发现 Write failed: Broken pipe 连接断开了,又得重新开始。如果你有过类似经历,那么还是把后面的内容看完,并开始使用 tmux 吧! 下面我们先来聊一下 tmux 中的一些基本概念:

Session 会话

一组窗口或者说一个 tmux 实例。当你每次输入 tmux 的时候,便打开了一个会话。 类似的还有以下命令:

tmux attach-session 将会进入一个会话 tmux list-sessions 将列出所有会话

Window 窗口

一个可用于执行任务的窗口。 使用 <bind-key> c 可以创建一个新的窗口, 将 c 换为 np 可以进行前后切换。

Pane 窗格

切割成小块的窗口,可类比 Vim 中的窗口切割. <bind-key> " 或者 <bind-key> % 可以进行水平或者垂直分屏。

安装

Mac

brew install tmux

Linux

sudo apt-get install tmux  # Debian/Ubuntu

sudo yum install tmux  # CentOS/Fedora

配置

可以创建一个 $HOME/.tmux.conf 的文件, 配置项可以 man tmux 查看,或者直接使用我的

wget https://raw.githubusercontent.com/tao12345666333/dotfiles/master/tmux/tmux.conf -O $HOME/.tmux.conf

常用配置的说明

基础配置

set -g default-terminal 'screen-256color'
# 设置默认颜色

set -g status-utf8 on
# 支持 utf-8 

set -g history-limit 100000
# 设置历史记录最大条数

setw -g mode-keys vi
# 设置按键模式为 Vi 模式

窗口切割

tmux v1.9 开始 default-path 选项被移除,所以如果在某个位置新建窗口,则会跳转到家目录下,所以我们使用 -c 参数增加下面这些配置

unbind-key c
# 取消对 c 键的绑定

bind-key c new-window -c '#{pane_current_path}'
# 将 c 键绑定为从当前路径创建新窗口

unbind-key '"'
# 取消对 " 键的绑定

bind-key '"' split-window -v -c '#{pane_current_path}'
# 将 " 键绑定为从当前路径水平切割窗口

unbind-key %
# 取消对 % 键的绑定

bind-key % split-window -h -c '#{pane_current_path}'
# 将 " 键绑定为从当前路径竖直切割窗口

重载配置

bind-key R source-file ~/.tmux.conf \; display-message "Reload .."
# 绑定 R 键,重载配置文件,并显示 "Reload .." 提示信息

选择Pane(窗格)

# 以下配置为取消原有 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

设置颜色及状态栏

# 配置后的样式可参考我文末的截图

set -g status-fg '#55ff53'
set -g status-bg '#0a4174'
set -g status-left-fg '#55ff53'
set -g status-left-bg '#0a4174'
set -g status-right-fg '#55ff53'
set -g status-right-bg '#0a4174'
set -g status-left-length 90
set -g status-right-length 90
set -g status-left '[#(whoami)]'
set -g status-right '[#(date +" %m-%d %H:%M ")]'
set -g status-justify "centre"

set -g pane-active-border-fg '#55ff53'
set -g pane-border-fg '#7fcfee'

使用

在终端输入下面的命令就可以开始使用 tmux 了

➜  ~ tmux

而想要退出的时候,也只要输入 exit 即可

➜  ~ exit

注意:在Linux下,默认$TERM 是xterm, 直接启动tmux并且打开vim的话, 会出现颜色不对的情况。使用tmux -2 启动, 强制启动256色。

应用

  • 窗格同步
<bind-key> :set synchronize-panes on

执行这条命令可以让所有窗格内容同步。多用于一些批量环境命令之类的。

  • 使用下面的代码,做多ssh连接
starttmux() {
    if [ -z "$HOSTS" ]; then
       echo -n "Please provide of list of hosts separated by spaces [ENTER]: "
       read HOSTS
    fi

    local hosts=( $HOSTS )
    echo ' >>> will connnect to'
    echo '------'
    echo ${hosts[@]}
    echo '------'

    tmux new-window "ssh -p 31220 tao@${hosts[0]}"
    unset hosts[0];
    for i in "${hosts[@]}"; do
        tmux split-window -h  "ssh -p 31220 tao@$i"
        tmux select-layout tiled > /dev/null
    done
    tmux select-pane -t 0
    tmux set-window-option synchronize-panes on > /dev/null

}

HOSTS=${HOSTS:=$*}

starttmux

使用截图

原文发布于微信公众号 - MoeLove(TheMoeLove)

原文发表时间:2017-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

前端测试回顾及我们为什么选择Karma

前端测试,或者UI测试一直是业界一大难题。最近Q.js使用Karma作为测试任务管理工具,本文在回顾前端测试方案的同时,也分析下为什么Q.js选用Karma而不...

270100
来自专栏美丽应用

全局复制:允许你复制任何应用内文字

23810
来自专栏源码之家

Apache启动后又停止的解决办法

今天星期天,加班,但没什么工作任务,本打算好好把武术藏经阁网站搞一搞,没想到打开电脑,却是APACHE无法启动,找了半天,以前一般都是端口占用情况,今天改了端口...

37820
来自专栏我是攻城师

IntelliJ IDEA的光芒会盖过Eclipse吗

36850
来自专栏前端人人

React多页面应用4(webpack自动化生成多入口页面)

本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包...

61150
来自专栏伪君子的梦呓

安装和配置 Eclipse

之前安装了 Java 并且配置好了 Java 的环境变量,现在来搞一下开发环境,下面就是下载安装和配置 Eclipse 的教程。

56010
来自专栏向治洪

React native开发中常见的错误

react native环境搭建请移步:react native环境搭建 这里说说react native创建完成之后,运行中出现的常见问题, 问题1: jav...

33860
来自专栏企鹅号快讯

Vue2的单元测试与调试技术

测试是一个非常美妙的世界,一旦进入根本停不下来~在Java中,我们可以使用JUnit做单元测试,但在前端开发中,想做单元测试并不是一件特别容易的事情,但如果你采...

235100
来自专栏hrscy

iOS 百度地图 Demo

3.iOS 9 之后不能直接使用 HTTP 进行请求,需要在 Info.plist 新增一段用于控制 ATS 的配置:

13710
来自专栏QQ音乐技术团队的专栏

electron 构建跨平台桌面应用

昨日(2016.09.13)本文发表后,获得了一定的阅读和转发量,但经部分网友反馈和仔细审核后发现,在与 NW.js 对比的环节,言辞欠妥,且数据的真实性有待考...

1.3K110

扫码关注云+社区

领取腾讯云代金券