银河国际手机版最新:升级Shell工作环境,终端管理工具

效率为王:终端管理工具 Tmux,为王tmux

本文来自作者 woosley 在 GitChat 上分享 「效率为王:终端管理工具
Tmux」,「阅读原文」查看交流实录。

「文末高能」

编辑 | 哈比

在工作中常会遇到程序员用着系统的 terminal 艰难的敲击着 bash shell
的命令。这种原始的方式可能会导致工作效率降低。

简介

Tmux
是一款非常实用的终端复用器,用来管理一个终端窗口中运行的多个终端会话。它通过会话,窗口,面板的形式高效且有序的管理你所有的工作终端。

此外,它还可以通过将终端会话置于后台运行,在需要时按需接入,以及将会话共享给其他人,是远程办公和结对编程的利器。无论是前端还是后端开发工程师,运维人员,都值得将其加入个人的日常工具列表。

对于终端的选择,每个人的习惯不一样,无法要求保持一致,但是我觉着,最基础最常用的终端功能的配置,最好还是在团队里推广一下,可以一定程度提高那些用着默认
terminal 的大神们的效率(PS:
听说有些大神使用记事本写代码,这类不在考虑之中)。但是这类配置又比较零散,所以趁着周末写一个我自身常用的
Shell
工作环境的总结吧,本文以MacOS为例,对于Linux系统,在文章最后列举了一些差异。本文适合想要提高一些终端使用效率的同学们。

安装

在 MacOs 下,安装 tmux 非常简单,使用 homebrew 便可以安装最新的版本:

brew install tmux

对于 Linux,大部分发行版都有打包 tmux,可以通过包管理器安装,比如在
Ubuntu 下,可以使用 apt 安装。

apt install tmux

在 windows 下想使用 tmux 有两种方法:

  • window10 加入了 linux 子系统的功能,用户可以在 windows 下使用 Ubuntu
    linux。安装 tmux 的方法和原生 Ubuntu 完全一样;

  • 对于 windows7 以及更加古老的版本,个人推荐使用 Cygwin,这是一个在
    windows 下模拟 linux 的工具,提供了大部分 *nix
    软件的安装,里面就包括了 tmux。

iTerm2

初次使用

初次使用 tmux,只需要在终端下面键入命令:

tmux

默认情况下会启动一个新的会话(session)。这时候窗口显示如下:

可以看到 Tmux 在默认终端上面启动了一个新的界面。包括原来的 shell
窗口和下方的状态栏。

状态栏显示了当前 tmux session 的基本信息。

  • [0] 代表当前 session 的名字;

  • 0:bash 代表当天 session 的第一个窗口,名字为 bash;

  • 其他部分为当前主机名,以及当前时间。

作为一款基于终端的工具,tmux 所有的操作都使用键盘快捷键来进行,熟悉了
tmux
的快捷键之后,我们可以把自己的双手从鼠标完全解放出来,对提高工作生产力有极大的作用。

tmux 的快捷键使用 Prefix + key 的形式。如果使用过 Gnu
screen,那么对这种模式应该很熟悉,不同的是,Gnu screen 默认的 prefix
是 ctrl + a,而 tmux 的默认快捷键是 ctrl + b,按键方法为同时按下
ctrl 键 和 b
键。这个组合是可以定制的,在本文中,我们用 prefix 来代表这个按键组合。

现在我们可以使用快捷键创建一个新的窗口,按下 prefix + c(同时按下 Ctrl

  • b,放开,然后按下 c)。

效果如下图所示:

此时整个窗口没有太大的变化,只是下面的状态栏多了一个 1:bash,表示当前启动了两个窗口。

现在可以试着按下 prefix + n,看 tmux 如何在不同的窗口间转跳。

安装及配置

首先需要安装 iTerm2,下载地址:iTerm2
Download,建议下载
Stable Release 版本。

安装完成后,打开 iTerm2 ->
Preferences,就可以根据自己的使用习惯进行一些偏好设置了,由于可配置的选项太多,这里不做一一列举,只对我自己设定的一些选项进行简单的介绍。(注意下载的不同版本的
iTerm2 的默认配置有可能有细微差别)

  1. 对于 General 选项卡,目前还没遇到修改的需求。

  2. 对于 Appearence 选项卡,我改动了 Tabs 的一些设置,如下图:

    银河国际手机版最新 1

    Appearence.png

    • 将 “Tab bar location” 改为了 Top
    • 将 “Theme” 改为了 Light(可以根据个人习惯进行选择)
  3. 改动较多的就是 Profiles 选项卡了,Profiles
    主要是与显示外观有关的配置,在左侧可以新建多个 profile
    配置,这里我只采用了 Default。

    每个 Profile
    的右边有多个配置选项:General、Colors、Text、Window、Terminal、Session、Keys、Advanced:

    • General:在下方有个 “Working Directory”
      的配置,这个是当你每次打开 shell
      时默认进入的工作目录,可以根据自己的工作习惯进行配置。由于我经常工作在
      home 的 Work 目录中,所以我勾选了 “Directory” 选项,并设置了
      Work 目录。

    • Colors:这个地方需要根据习惯自己调整配置。想想以后常用的 Shell
      的样子就是这里决定的,还是值得花时间去根据自己喜好进行配置。由于我个人使用
      Emacs 作为常用编辑器,而且 emacs 一直在用 Solarized light
      主题,所以我再右下角的 “Color Presets” 里面选择了 “Solarized
      light” 主题。字体、背景颜色都可以在 Solarized light
      的基础上进行微调。

      此外,在 Colors 选项卡中,有个 “Cursor Guide”
      选项,这个选项可以高亮当前光标所在行,更方便的找到光标位置,有需要的可以打开。不过这里有一个快捷键
      “Command+/” 可以直接定位到光标位置,很好用,所以我没有打开
      “Cursor Guide”。

    • Window:可以配置透明度、模糊效果和窗口大小等,看个人感受吧。

    • 其他配置没有修改,所以这里不再列举了。

  4. Keys:绑定的一些快捷键,这里我只添加了一个全局的快捷键 “HotKey ->
    Show/Hide all windows with a system-wide hotkey”,并设置为了
    Command+Control+i。这样在任何应用中,只要触发了该快捷键,iTerm2
    会立即回到第一窗口的位置,再次触发会隐藏 iTerm2。

    此外提一个强烈些的建议:将 MacBook 上的 CapsLock 键位和左下角的
    Control 键互换,互换方法在 “System Preferences -> Keyboard ->
    Keyboard -> Modifier
    Keys”,仍不清楚的上网搜一下。这样替换的好处是:

    • MacOS 上面的基本所有可编辑的地方,Control+f、Control+b
      代表前进、后退一个字符,Control+k
      表示删除当前行光标位置之后的内容,Control+d表示删除前面的字符。

    • 此外,MacOS 系统中绝大部分编辑器中还可以使用
      Control+n、Control+p 来进行上一行下一行移动,例如 Xcode、Sublime
      Text、系统文本编辑器等。当然,如果你使用
      Emacs,相信对这个键位的修改更没有疑问了。

  5. Arrangements:这个暂时没有用到。

  6. Pointer:鼠标和手势的一些操作,对此没有关注,有兴趣可自己看一下。

  7. Advanced:更多的可自定义配置,参数众多,如果你想戒掉王者荣耀,可以尝试将各个参数弄清楚(PS:意义不大,不建议这么干,还是玩王者吧)。

服务器和会话

tmux 本质上可以说是一个服务器,当 tmux 命令运行的时候,后台运行了一个
tmux 服务,并启动一个会话,会话和服务器之间通过 Unix socket 来通信。

默认情况下启动的 tmux 会话通过数字命名,比如第一个会话为 0。可以通过:

tmux new -s session_name

来创建一个命名的 tmux 会话,比如tmux new -s test。启动会话之后,tmux
自动连接到此会话之上。我们可以脱离会话,这样可以将会话里面运行的任务置于后台,在需要的时候重新连接。

脱离会话的快捷键为 prefix + d,脱离会话之后系统回到之前的终端。用这种方法,我们可以方便在在远程主机上启动一个长期运行的
tmux
会话,运行我们想长期运行的程序。我们可以用 tmux ls查看当前所有创建的
session,比如:

tmux ls learn: 1 windows (created Sun Dec 17 21:03:20 2017) [80×24]
test: 1 windows (created Sun Dec 17 20:59:44 2017) [80×24]

这里我创建了两个 tmux 会话,名字分别为 testlearn

重新连接 tmux
的命名为tmux attach。在没有任何参数的情况下默认连接最新创建的会话。可以添加参数-t $name,连接名字为$name
tmux 会话。比如tmux a -t learn。同时这里显示了一个 tmux 的小技巧,很多
tmux 的命令可以缩写,这里将 attach 缩写成为了 a。

在 tmux session 里面,可以通过 prefix + s选择并快速切换 tmux
会话,如下图所示。tmux
会弹出一个会话的选择列表,可以通过方向键选择我们想打开的会话。

如果在创建了会话之后想重命名当前会话,可以使用prefix + $,在底部弹出的输入框里面输入想要的名字即可。这里也可以使用
tmux
的命令模式。按下prefix + :,在输入框里输入:rename-session new-session(支持
tab 补全),便可以重命名当前的会话。

注意当服务器重启之后,tmux 的会话信息会丢失。要持久化保存 tmux
会话信息,在本文的 tmux 插件部分会介绍一款简单易用的插件
 tmux-resurrect

常用快捷键

iTerms
的有些快捷键不用掌握,因为后面章节会介绍更好用的工具。这里只列举了几个常用操作。

  1. Shift+Command+h —> 用于弹出粘贴历史窗口。

  2. Command+f —> 当前 tab 中搜索

  3. 按住 Command 键时有一些简单的操作:

    • 可以拖拽选中的字符串;
    • 点击 url —> 调用默认浏览器访问该网址;
    • 点击文件 —> 调用默认程序打开文件;如果文件名是
      filename:42,且默认文本编辑器是 Macvim、Textmate 或
      BBEdit,将会直接打开到这一行;
    • 点击文件夹 —> 在 finder 中打开该文件夹;
    • 同时按住 option 键,可以以矩形选中,类似于 vim 中的 ctrl v
      操作。

窗口

之前我们演示了如何创建新的窗口,并使用prefix + n,表示选择下一个窗口。

在不同窗口之间移动,除了 prefix + n之外,还可以用数字键,选择第 N
个窗口,注意 tmux 中窗口的序号是从 0
开始,因此prefix + 1表示选择第二个窗口。prefix + p表示转跳到前一个窗口。

我们还可以使用快捷键prefix + w来弹出一个虚拟的窗口列表,然后使用方向键来选择所需要打开的窗口。

使用prefix + ,可以用来重命名当前的窗口,对应的命令模式为rename-window

键入
exit,会退出当前窗口,但是有的时候窗口可能会卡死,此时我们可以使用prefix + &,在输入确认之后,强制杀死当前窗口。

Oh-my-zsh

oh-my-zsh
绝对是增强 shell
的一个神器,它提供了完整的插件体系,可以根据工作需求选用不同的插件。

面板

窗口可以分割为更小的面板,配合大屏显示器使用,非常有黑客的感觉。首先我们使用:

tmux new -s pane

创建一个新的
session,然后键入prefix + %,然后键入prefix + ",可以得到如下这样一个被分割的窗口:

当前光标所在的面板被高亮了出来。
我们可以继续键入prefix + %prefix + "查看继续分割面板的效果。要在不同的面板之间转跳,使用快捷键prefix + o。如果要想上下左右的移动到不同的面板,使用快捷键prefix + 方向键

在默认情况下,tmux
平均分割一个面板。我们可以通过prefix + ctrl + 方向键来调整面板的大小。

有的时候我们可能需要将一个面板放大,占满整个窗口。我们可以使用prefix +!,将面板转化为一个新的窗口;或者也可以使用prefix + z,使当前面板最大化为窗口,并暂时隐藏其他的面板。

强制退出一个面板的快捷键为prefix + x

安装方法

  1. 通过 wget:

    sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
    
  2. 通过 curl:

    sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
    

小结

会话 + 窗口 +
面板的组合是提升我们工作效率的一个强力组合。一个推荐的使用方法为对不同的项目建立不通的会话,使用窗口来分割一个项目里面的不同工作内容,然后使用面板来适用大屏开发。下面的一个截屏是我工作所建立的所有会话列表:

不同的项目被我放到了不同的会话里面,当我需要转跳到某一个项目的时候,使用prefix + s转跳到对应会话,之前项目所配置好的环境立刻就恢复了。

配置

关于 oh-my-zsh 的配置均在 $home 目录下的 .zshrc
文件中,如需修改配置可使用文本编辑器打开编辑(如 emacs、vim
等),修改完成后重新登录 shell 或者执行 “source ~/.zshrc” 即可生效。

  1. 主题:

    打开 .zshrc 文件后,ZSH_THEME=”robbyrussell”
    这一行就是主题的配置,我采用了默认配置 robbyrussell。

    oh-my-zsh 的主题配置主要是一些提示字符串格式、时间值、权限、git
    版本管理时显示的格式等信息。目前我还不清楚 oh-my-zsh 的主题对 iTerm2
    的显示外观(背景色、字体等)有何影响,因为我换了几个 ZSH_THEME
    后只是提示字符串等信息的变化,没有发现背景色、字体等外观受到影响。如果有知道的,麻烦留个言,也让我学习下。

  2. 插件:

    打开 .zshrc 文件后,plugins=(git) 这一行是 oh-my-zsh
    集成的插件列表,我安装的 oh-my-zsh 版本默认只使用了 git
    插件。我们可以在这个列表中添加 ~/.oh-my-zsh/plugins 目录下 oh-my-zsh
    已经提供的插件。

    关于插件,我使用了 git, zsh-syntax-highlighting, autojump
    插件,.zshrc 文件配置为:

    plugins=(git
             zsh-syntax-highlighting
             autojump)
    
    • git: 有很方便的使用命令行 git 工具的快捷绑定,例如 git checkout
      master 可以直接使用 gco master,关于所有的快捷绑定,可以打开
      ~/.oh-my-zsh/plugins/git/git.plugin.zsh 文件查看所有的
      alias。建议掌握几个最常用的命令快捷绑定:gco/gst/gaa/gcmsg/glgg/gl/gp/gd/gba。

    • zsh-syntax-highlighting:
      该插件可以帮助我们再输入命令时是否有误。例如,我在命令行中只输入
      ‘v’ 字符时,由于 shell 中没有这个命令,所以这个 ‘v’
      字符显示为红色,但是当我再输入 ‘im’ 后,’vim’
      这几个字符就变成了绿色,表示 shell 中有这个命令。该插件并不是
      oh-my-zsh 自带的插件,安装方法见下文的“自定义插件”。

    • autojump: 方便的跳转到某个目录,zsh
      可以记录已经访问过的目录,使用 autojump 可以输入 “j
      想要跳转的目录” 直接进入到目录,autojump 也支持输入 “j”
      后再输入目录关键字符,使用 <tab><tab> 补全目录。

    后续如果有新发现的好用的插件,我也会更新该文档,方便参考。

  3. 自定义插件:

    oh-my-zsh
    包含一个完备的插件体系,不只可以使用默认已打包的插件,也可以使用自定义插件:我们以
    zsh-syntax-highlighting 插件为例简述一下如何为 oh-my-zsh
    添加自定义的插件。

    • 下载
      zsh-syntax-highlighting
      并解压。
    • 将文件夹所有内容拷贝到
      ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting 里面。
    • 最后配置 ~/.zshrc 文件的 plugins=(git zsh-syntax-highlighting)

    其他从网络上下载的插件使用方法与 zsh-syntax-highlighting
    类似,当然有能力也可以自己写插件。

  4. 关于 powerline

    相信很多人都看到过别人的 Shell 有如下图这种样式:

    银河国际手机版最新 2

    powerline.png

    powerline 其实是一种增强提示信息的展现方式,可以在 vim、emacs、shell
    等多个场景下使用,之前也用过 powerline,但经过长期使用后,觉着
    powerline 在 shell
    中的优点并不明显,所以目前我已经弃用了。如果有兴趣,可按照:iTerm2
    Oh-my-zsh 配置与 agnoster
    主题配置
    一文中的方法进行配置。

    有一点需要注意,在之前的印象中,如果需要使用 powerline,iTerm2
    的背景色不能有透明度,记得是因为 powerline
    的三角不支持透明。有兴趣的可以验证下,并留个言告诉我的记忆是否正确。

  5. 一些常用的快捷键:

    • “d” 目录浏览和跳转:输入
      d,就显示在会话里访问的目录列表,输入列表前的序号,即可以跳转,如下图:

    银河国际手机版最新 3

    d.png

    • 在 ~/.zshrc 最后一行加入:

      alias lm="ls -al"
      alias rm='trash'
      alias cl='clear'
      

      lm 是为了显示当前目录所有文件(包含隐藏文件),rm 关联到 trash
      是为了防止不小心使用了 “rm -rf xxx”, cl 是清屏操作。

    • 常用快捷键会随着我的使用体验进行更新。

tmux 配置

tmux 比 screen
更加流行的一个原因就是在默认配置的情况下它已经足够好用了。当然,我们也可以通过配置文件对
tmux
进行个性化配置。它的默认配置文件为 ~/.tmux.conf,如果需要使用其他的文件,可以使用 tmux -f选项,读入另外一个配置文件。

MacVim

默认 prefix

我们可以通过配置文件更改 tmux 的默认 prefix。个人使用的 prefix
ctrl-z,习惯了 screen
的人可以配置为ctrl-a。这里以ctrl-z为例,用文本编辑器打开~/.tmux.conf,在里面加入内容:

set -g prefix C-z unbind-key C-b

这里 -g表示全局设置,应用于我们创建的所有会话。这是ctrl-b可以被释放出来组合,这里通过unbind-key C-b实现。

要使这个设置生效,我们应该重新加载
.tmux.conf。键入prefix + :打开命名模式,在输入框内输入source ~/.tmux.conf。此时我们就可以使用新的
prefix 了。

安装

使用 Homebrew 进行安装:$ brew install MacVim

其实 MacOS 系统是自带 Vim
编辑器的,但是由于系统自带一般版本较低,所以这里安装一个 MacVim,其也有
GUI 可以用。

快速重载配置文件

修改完配置文件之后再使用命令行模式重载实在太麻烦了,我们可以自定义一个快捷键,简化这个操作。在~/.tmux.conf里面加入:

bind-key r source-file ~/.tmux.conf\; display-message “Config reloaded”

我们最后一次使用prefix + : + source ~/.tmux.conf的方式重新加载配置文件。之后就可以用prefix + r的方式来做这件事了。在
.tmux.conf 中加入。

bind e new-window -n “.tmux.conf” “vim ~/.tmux.conf”

这个prefix + e的组合可以让你迅速的打开 .tmux.conf
并进行配置修改,配置完成之后使用 prefix + r的方式重新加载,整个操作在几秒内即可完成。

配置

我日常使用的编辑器是 Emacs,遗憾的是 Emacs 其实并不如 Vim
那么的适合在终端使用,Vim 可以说是跟 Shell 联系最紧密的编辑器,所以掌握
Vim 的一些基础操作还是必须的。

由于现在我从事 iOS 开发工作,使用 Shell
的只是处理一些日常工作,并不会使用其进行代码编写。所以掌握 Vim
的一些基础操作就足够了。这一部分 Vim 党请略过,不过我相信 Vim
党也基本都已经有自己的完整的 shell 配置。

这里推荐 github 上一个 star 比较多的 vim
配置:k-vim。
安装过程在 github 中有详细文档,这里就不再赘述。我对 k-vim
的某些默认配置进行了修改:

  • $home/.vimrc 中的 “set background=dark”,我改成了 light(因为我的
    iTerm 配置的 light 主题)。

  • 231 行到 244 行与 relativenumber
    有关的都被我注释掉了,因为我不太习惯相对行号。

此外,在 Shell 中使用 MacVim 要使用 “mvim -v” 命令,为了方便在 Shell
中使用 MacVim,在 ~/.zshrc 最后为 “mvim -v” 命令添加一个别名:

alias vim="mvim -v"

更改默认序号

由于 tmux 的窗口和面板默认序号都是从 0
开始,我们可以更改这个设置,使默认序号从 1 开始。

set -g base-index 1         setw -g pane-base-index 1

使用

上面提到我目前常用编辑器是 Emacs,但是我的 Emacs(Spacemacs) 使用的是 vim
快捷键,因为 vim 的快捷键确实非常通用,而且效率高。(PS: 使用 Xcode
的能够发现,Xcode 的快捷键其实更像 Emacs)
Vim 的一些基础操作还是希望尽量能够掌握,例如 Vim
的集中模式,hjkl、e、b、0、$、dd、:w、:wq、:q、i、Esc、Control+[、o、O、v
等。

本文不是一篇 Vim 的介绍和教程,这里提到 Vim 只是为了能够在 Shell
中方便的编辑文件。如果不是专门使用 Vim
写代码,掌握基础技能就够用了(例如简单修改一个文件)。
如果希望能有一个自己顺手的长期使用的编辑器,建议可以深入学习下 Vim,当然
Emacs 也是不错的选择。(我习惯于 Emacs,一方面是由于熟悉 Scheme
语言,与Emacs Lisp 同属 Lisp 语言,能够自定义配置和编写插件,另外
Spacemacs 的出现降低了 Emacs 的学习成本,有兴趣可以尝试)。

更改分割面板的快捷键

tmux
垂直和水平分割面板的快捷键分别为prefix + %prefix + "。这两个按键比较难记忆,我们可以将其更改为prefix + |prefix + -。将以下配置加入 ~/.tmux.conf

bind-key | split-window -h bind-key – split-window

Tmux

更改面板间移动的快捷键

大部分键盘操作工具,比如
vim,都使用jkhl来进行上下左右的移动操作。我们可以将面板间移动的操作绑定到对应的按键。配置如下:

bind-key l select-pane -R bind-key h select-pane -L bind-key j
select-pane -D bind-key k select-pane -U

什么是 Tmux?

Tmux 是一个终端复用软件,BSD
协议发布。一般用于在一个命令行窗口中访问多个命令行会话,或者在一个命令行终端中同时使用多个程序。

你是否曾经开过一大堆的 Terminal?有没有把它们都保存下来的冲动?Tmux 的
Session 就是做这件事情的。只要没有关机,即使 iTerm/Terminal/Konsole
意外关闭也没关系,Session
可以完全恢复。即使关机了其实也可以恢复,但是要配置,因为我的Mac关机很少,而且日常工作很少有连接服务器的需求,所以没有这类需求。

Tmux 让我们可以随时退出或者进入任何一个 Session。每个 Session 有若干个
Window,每个 Window 又可以分成多个窗格(Pane)。有了 Session 的概念,
Tmux
就可以隔离工作环境,比如为处理第一项工作相关的会话创建一个work0,为处理第二项工作的会话创建一个
work1,为个人 hack 创建一个personalhack,然后我们就可以通过 session
的切换来切换我们的工作环境,我们可以就置身于单个工作环境了,达到了工作环境隔离的效果。这个功能尝试使用一下会有惊喜。

Tmux 是本文的重点介绍内容。

面板大小调整

我们用类似移动键的方式来进行面板的大小调整。将快捷键重新定义为
JKHL。配置如下:

bind-key L resize-pane -R 5 bind-key H resize-pane -L 5 bind-key K
resize-pane -U 5 bind-key J resize-pane -D 5

安装

brew install tmux

鼠标模式

鼠标模式有时候也可能非常有用,比如你可能想用鼠标来选中一个面板或者窗口,用鼠标调整面板大小,或者用鼠标滚轮来向上滚动浏览历史。

开启 /
关闭鼠标模式的配置为 set -g mouse on/off,需要在命令模式下敲入这串字符。我们可以更进一步,通过绑定到快捷键prefix +m来触发鼠标模式的开关。配置如下:

bind m run ‘old=$(tmux show -gv mouse);new=””; if [ “$old” = “on” ];
then new=”off”; else new=”on”; fi; tmux set -g mouse $new; tmux display
“mouse: $new”‘

注意这是一行配置,细心的读者可能已经发现,这其实是一段shell脚本,在鼠标模式关闭的情况下打开它,反之亦然。

基本使用方法

  1. tmux 中常用的有四个概念:

    • server:服务器。输入 tmux 命令时就开启了一个服务器。
    • session:会话。一个服务器可以包含多个会话。
    • window:窗口。一个会话可以包含多个窗口。
    • pane:面板。一个窗口可以包含多个面板。
  2. tmux 中的快捷键操作由一个 prefix 开启,即按下 prefix
    键位后,松开,再去按另一个快捷键。默认的 prefix 键位是
    Control+b,考虑到下面两个原因,我将其改为了 Control+空格。

    • Control+b 按起来并不顺手,而且 Mac OSX 系统中,Control+b
      通常代表返回到上一个字符位置,如果使用 Control+b 作为
      prefix,如果需要返回到上一个字符位置,则需要按两次 Control+b。

    • 网上大部分教程提示将 Control+b 修改为 Control+a,但是由于
      Control+a 在 MacOSX 中表示回到当前行的起始位置,如果使用
      Control+a 作为 prefix,我们需要按两次 Control+a
      才能回到行首,也不太方便。所以我这里修改为了 Control+Space。

    配置方法:在 ~/.tmux.conf 文件(如果没有需要自己创建)中加入下面语句:

    #设置前缀为 Ctrl + Space
    set -g prefix C-Space
    #解除 Ctrl+b 与前缀的对应关系
    unbind C-b
    
  3. tmux 会话(session)操作

    • 打开会话:在 iTerm2 Shell 中输入”tmux”后,就进入了一个新的 tmux
      会话。
    • 脱离当前会话:”prefix+d”,这时会回到 Shell 中。
    • 脱离指定会话:”prefix+D”
    • 切换会话:”prefix+s”,当有多个会话时,使用这个功能切换工作环境非常有用。
    • 修改会话名字:”prefix+$”
    • 进入命令行模式:”prefix+:”,此时可输入支持的命令,例如
      kill-server 关闭所有 tmux 会话, kill-session 关闭当前会话。
    • 挂起会话:”prefix+C-z”
  4. tmux 窗口(window)操作

    tmux 中的一个会话可以有多个窗口,各个窗口可以互不影响。

    • 每次打开一个会话会默认创建一个窗口
    • 创建新窗口:”prefix+c”
    • 关闭当前窗口:”prefix+&”
    • 切换到指定数字窗口:”prefix+数字键 0-9″
    • 切换到上一个窗口:”prefix+p”
    • 切换到下一个窗口:”prefix+n”
    • 通过窗口列表切换窗口:”prefix+w”
    • 重命名窗口:”prefix+,”
    • 修改当前窗口编号,相当于重新排序:”prefix+.”
    • 在所有窗口中查找关键词:”prefix+f”
  5. tmux 面板(pane)操作

    tmux
    中的每个窗口都可以打开多个面板,一个窗口的面板会同时展示在窗口中。下面是一些常用操作,在下一节介绍了
    tmux 插件后会使操作更方便。

    • 关闭当前分屏:”prefix+x”
    • 显示面板编号:”prefix+q”
    • 最大化当前所在面板:”prefix+z”,再次使用会复原当前面板大小。
    • 将当前面板上下分屏:”prefix+””
    • 将当前面板左右分屏:”prefix+%”
    • 选择当前窗口中下一个面板:”prefix+o”
    • 置换面板位置:”prefix+{” or “prefix+}” or “prefix+C-o” or
      “prefix+M-o”

状态栏的配置

默认 tmux 的状态栏是窗口下方的一段绿色长条,如下图:

它分为三个部分:

  • 最右边的会话名字;

  • 中间的窗口列表;

  • 左边的主机信息。

这些显示的信息,以及字体前景色,背景色都是可以灵活配置的。开源的好处就是社区已经有许多成熟的解决方案,这里面最受欢迎的是
powerline。

powerline 用 Python 编写,安装使用 Python 的包管理工具pip

pip install powerline-status

此外我们还需要安装 powerline 使用的字体,可以在
下载并安装。

对 tmux 使用 powerline,只需将如下配置加入
.tmux.conf,prefix + r重新加载即可:

source “{repository_root}/powerline/bindings/tmux/powerline.conf”

其中 repository_root 是 powerline 的安装路径。以下是作者安装 powerline
之后状态栏的一个截屏:

常用配置:

  1. 修改 prefix 按键:上面已经介绍过了。

  2. 开启鼠标操作:

    #开启鼠标操作
    set -g mouse on
    

    开启鼠标操作可以使用鼠标切换面板,并且一个比较使用的功能 copy/paste
    功能:

    按住 alt
    键(Option键),按住鼠标左键,移动鼠标以选中部分文本,松开鼠标左键后,选中的文本就复制到了系统的剪切板,可以在其他应用中粘贴。

    此外,如果在松开鼠标左键后,点击鼠标中键(不要放开 alt
    键),则选中的文本会自动粘贴到当前面板中的输入处,同时,系统剪切板也是可以用的。

  3. 重新加载 tmux 配置快捷键:

    #在 tmux 中使用 prefix + r 重新加载配置
    bind r source-file ~/.tmux.conf \; display-message "Config reloaded"
    

    修改完成后,可以使用 “prefix+:” 进入命令行模式,然后使用 “source
    ~/.tmux.conf” 生效新的配置,之后再次生效新配置就可以直接使用
    “prefix+r” 快捷绑定了。

  4. 修改面板和窗口起始编号(默认均为 0):

    #窗口和面板的起始编号为 1
    set -g base-index 1
    setw -g pane-base-index 1
    
  5. 启用 256 色(这个应该默认就是支持的):

    #使 tmux 显示 256 色
    set -g default-terminal "screen-256color"
    
  6. 安装 TPM(Tmux Plugin Manager):

    • clone TPM 项目:

      git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
      
    • ~/.tmux.conf 底部添加:

      # List of plugins
      set -g @plugin 'tmux-plugins/tpm'
      set -g @plugin 'tmux-plugins/tmux-sensible'
      
      # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
      run '~/.tmux/plugins/tpm/tpm'
      
    • 重载 tmux 配置文件

  7. 使用 TPM 安装插件的方法:

    • 添加 .tmux.conf 文件中类似 set -g @plugin
      ‘…’这样的行,添加你想要的插件
    • 在 tmux 环境中使用 “prefix+I” 安装插件(ls
      ~/.tmux/plugins/可以看到抓下来的插件)
    • 如果要升级所有插件,敲 “prefix+U”
    • 如果要干掉某个插件,先从~/.tmux.conf 中删掉对应的行,然后
      “prefix+alt+u”。
  8. 插件:tmux-pain-control

    该插件提供了一些便利的 pane 操作:

    • 竖直分隔面板:”prefix+|”
    • 水平分隔面板:”prefix+-“
    • 跳转到左边的面板:”prefix+h” or “prefix+C-h”
    • 跳转到上面的面板:”prefix+k” or “prefix+C-k”
    • 跳转到下面的面板:”prefix+j” or “prefix+C-j”
    • 跳转到右边的面板:”prefix+l” or “prefix+C-l”
  9. 插件:tmux-prefix-highlight

    安装该插件后,每次点击了 prefix
    按键后,底部的状态栏会显示一个状态,详细请参考其 github
    说明文档。之因为我安装了这个,是因为有时候命令不起作用时,我可以清晰看到是不是
    prefix 没有成功触发。

  10. 复制粘贴:

    首先安装一个 tmux 插件
    tmux-yank
    ,该插件可以让 tmux 复制和粘贴系统剪切板。安装说明请参考项目的
    README 说明。

    在 ~/.tmux.conf 文件中添加一下代码(我的 tmux 版本是
    2.5,如果是以前的版本,命令可能不一样):

    #复制操作
    set-window-option -g mode-keys vi
    bind-key -T copy-mode-vi 'v' send-keys -X begin-selection
    bind-key -T copy-mode-vi 'V' send-keys -X select-line
    bind-key -T copy-mode-vi 'r' send-keys -X rectangle-toggle
    bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"
    

    在 tmux 会话中,使用 “prefix+r” 重新加载
    ~/.tmux.conf,然后我们可以做如下操作:

    “prefix+[” 进入 tmux 复制模式,使用 vim
    快捷键移动光标到需要复制的文本起始位置,点击 “v” 开始复制,继续使用
    vim 快捷键移动光标到需要复制的文本末尾位置,按下 “y” 后,退出 tmux
    复制模式,并且复制了已选文本,这时,使用 “Command+v”
    就可以将已复制文本粘贴了。并且,在其他应用也是可以使用 “Command+v”
    进行粘贴的。

复制模式

tmux
初学者经常遇到的一个问题就是发现无法使用滚动键向上滚动查看终端的历史。要做到这一点,必须进入
tmux 的复制模式。

按下prefix + [,tmux 就进入了复制模式,再按回车键退出。默认情况下 tmux
保存 1000 行终端历史。我们可以通过。

set -g history-limit 10000

调整历史记录大小。

tmux 复制模式可以使用两种键盘模式,Vi 和 Emacs,默认为 Emacs,我们通过:

set -g mode-keys vi

更改为 Vi 的键盘模式。在 Vi 模式下,可以通过 jkhl 来上下左右移动光标。

要复制文本,我们先进入复制模式,将光标移动到指定位置,按下空格键,然后移动光标来选择文本,被选择的文本会高亮显示,最后按回车键,表示选择完毕。

此时敲入命令tmux list-buffer,我们可以看到 tmux
缓存区保存的文本,使用tmux paste-buffer或者快捷键prefix + ]可以粘贴缓存区里面的内容。

更加高级的是 tmux 维护一个缓冲区的栈,每复制一次,tmux
在这个栈顶部创建了一个新的缓冲区。现在我们可以多复制几次文本,然后键入命令tmux list-buffers,这时可以看到一个缓冲列表。

再敲入命令tmux choose-buffer,tmux
会创建一个选择框,我们可以选择需要粘贴的文本,然后回车,对应文本就插入到了光标位置。

vim 用户可以重新配置这些命令和快捷键,让使用起来更加熟悉。

bind-key -Tcopy-mode-vi ‘v’ send -X begin-selection bind-key
-Tcopy-mode-vi ‘y’ send -X copy-selection unbind p bind p paste-buffer
bind b choose-buffer

现在在复制模式下可以使用 v 和 y
来选择文本,使用prefix + p粘贴文本,使用prefix + b来选择缓冲(将
prefix 设置成为 ctrl + b 的用户可自行选择其他快捷键)。

fzf

fzf
提供命令行中的模糊搜索,绝对算得上是 shell
的一个大杀器,谁用谁知道。安装方法可参考 github README,使用 homebrew
安装非常简单。

fzf 提供对 tmux 和 vim
的支持,所以与本文所述的环境结合度非常高。下面看一下我经常用到的功能:

  1. 在 tmux 中搜索文件和目录:

    只需按下快捷键 Control+t 即可(不需要 tmux 中的 prefix
    键),就会在当前的窗口中出现一个交互式的输入行,下方是搜索本目录的子目录和文件匹配到的结果,如下图:

    银河国际手机版最新 4

    fzf0.png

    可以使用 Control+n 和 Control+p 上下选择搜索结果,点击 Enter
    会将该行内容输入到 tmux 的命令输入行中,使用 Control+g 退出 fzf
    搜索模式。fzf 的搜索是模糊搜索,非常方便,另外可以看到 Control
    键是非常的常用,这也是上面建议将键盘左下角的 Control 和 Capslock
    键互换的原因。

  2. 在 tmux 中索索历史命令:

    使用快捷键 Control+r (不需要 tmux 中的 prefix
    键)。效果同上,只不过弹出的列表是历史命令。不再详述。

  3. 支持部分 shell 命令的参数补全:

    • 输入:kill -9 **<TAB> 就会出现一个进程列表,输入进程 ID
      即可杀死指定进程。
    • 输入:vim **<TAB>
      会出现一个当前目录下面文件的列表,可以输入文件名进行匹配。
    • 还有一些其他命令,参考下 fzf 的说明文档吧,我常用的就这几种。

其他配置

为了使 tmux 更好的工作,作者在这里还贴出一些其他的 tmux 基本配置。

set -g default-terminal “screen-256color” # 颜色支持 setw -q -g utf8 on
      # utf8 支持 set -q -g status-utf8 on # tmux < 2.2 setw -g
automatic-rename on # 自动重命名窗口 set -g renumber-windows on  #
关闭窗口的时候重新计算窗口 index set -g display-time 4000 # tmux
消息提示时间为 4 秒

配置文件的管理

上面介绍的几个工具涉及到了多个配置文件,为了统一管理配置文件,建议集中管理并引入
git 进行版本控制。

vim 的配置文件是 ~/.vimrc,zsh 的配置文件是 ~/.zshrc,tmux 的配置文件是
~/.tmux.conf,fzf 的配置文件 ~/.fzf.zsh。这里将几个文件放入到
~/Dotfiles/ 目录中,并为该目录引入 git 版本控制,然后在 $home
目录下为三个文件创建与文件相同名字的符号链接。最后,直接修改由 git
管理的 Dotfiles 中的文件即可。

session 共享和结对编程

目前很多企业都在推行结对编程,两个人同一工作台前开发软件。当开发人员在同一个办公室的情况下,实施结对编程比较简单,但是如果开发人员处于异地的状态,实施结对编程就必须有屏幕共享的软件。

而 tmux
基于终端的会话共享可以在即使网络状况不佳的情况下提供良好的结对编程体验。

我们先来看一下最基本的会话共享机制。

假设有主机 Foo,程序员 A ssh 连接到了这台主机,并使用 tmux 开始了会话
pairing。

tmux new -s pairing

A 想把这个会话共享给开发人员 B,那么他只需要让 B
登录同一台主机的同一个用户,B 就可以用命令。

tmux attach -t pairing

attach 到同一个会话。此时 A 和 B
看到的就是同一会话的统一窗口,两人的操作也会完全同步到各自的屏幕上。

这种方法一个不那么完美的地方就是 A 和 B
看到的屏幕永远是完全一致的,有的时候我们可能需要让 A 和 B
能够同时做不同的事情,同步窗口的结果但不必保持窗口显示的同步。要做到这一点,只需要
B 使用命令:

tmux new -s test -t pairing

创建一个新的会话并将其加入到 pairing 会话即可。这样 A 和 B
看到的窗口结果是一样,但是两人都可以独立输入而不会互相打扰。

如果想在不共享服务器的登录权限的情况下共享 tmux 会话,可以尝试使用
tmate。它是一款 tmux 的 fork,可以在无需登录主机的情况下只读的共享你的
tmux 会话。详细使用读者可以自行参考相关网站。

总结

本文中介绍的 iTerm2 和 MacVim 应该是只适用于 MacOS,对于 Linux
系统可以采用系统终端,然后安装
zsh,vim(有的系统只有vi,而没有vim,需要安装)。其余的例如
oh-my-zsh,tmux,fzf等功能,Linux 也是可以使用的。

最后再推荐一个工具
Moom
,用着非常舒服,尤其是在笔记本电脑这种屏幕大小有限的环境下。具体使用方法这里就不介绍了,请参考
OS X 是了不起的操作系统:窗口控制应用 Moom
体验详解。

关于 Shell
环境的配置先介绍这么多,有更好用的插件或配置我会更新上来。一眼看过去貌似命令比较多,不过个人觉着这些命令都不需要死记硬背,只要你坚持用上两周,我想基本能记个差不多了吧。经过我长期使用的体验,iTerm2、zsh、oh-my-zsh、vim
和 Tmux 的组合确实能够有效提高工作效率。

希望所有程序员都能掌握一部分命令行的操作,并且有一个自己用的习惯的 Shell
环境。

插件管理

tmux 官方支持一系列的插件,可以在
找到。注意大部分插件都需要 tmux 1.9 +  版本。

参考文档

  1. iTerm2 Oh-my-zsh 配置与 agnoster
    主题配置
  2. The Text
    Triumvirate
  3. 优雅地使用命令行:Tmux
    终端复用
  4. 终极 Shell
  5. A tmux Crash
    Course
  6. 关于
    Zsh,我最喜欢的那些特性
  7. Tmux
    快捷键速查表
  8. tmux
    配置指南

tpm

首先需要提及的是插件管理工具 tpm,它可以用来方便的安装和删除插件。安装
tpm 的方法为

git clone ~/.tmux/plugins/tpm

在 ~/.tmux.conf中加入这些配置:

#tmux 插件列表 set -g @plugin ‘tmux-plugins/tpm’ set -g @plugin
‘tmux-plugins/tmux-sensible’ #将这一行插入 .tmux.conf 最底部 run
‘~/.tmux/plugins/tpm/tpm’

然后使用prefix + r重新加载 tmux 配置,就可以使用 tmp 了。

当在 .tmux.conf
里面加入了新的插件时,我们可以使用prefix + I安装插件,使用prefix + U更新插件。删除插件的快捷键为prefix + alt + u

会话保持:tmux-resurrect

tmux-resurrect
是一款轻量级的会话保持插件。它可以用来在服务器重启之后重新加载之前保存的
tmux 会话。

安装
tmux-resurrect,首先将 set -g @plugin 'tmux-plugins/tmux-resurrect'加入到
.tmux.conf 中,然后按prefix + I安装。

保存 tmux 会话的方法为prefix + C-s。保存成功之后会出现如下提示

此时我们如果重启机器,然后打开一个新的 tmux
会话,那么可以使用快捷键prefix + C-r恢复保存的会话信息。

tmuxinator 是另外一款 tmux
的会话保持工具,它通过编辑和读取配置文件的形式进行会话的保持。这里留给读者自行参考。

结束语

到此为止,本篇关于 tmux 的介绍就结束了。正如文章开头所说,tmux
可以大幅度的提高工作效率,希望读者都能喜爱上这一款优秀的终端管理工具。

文中提及的网站

homebrew:

Cygwin:
powerline:
tmate:
tpm:
tmux-resurrect:
tmuxinator:

近期热文

《谈谈源码泄露 · WEB 安全》

《用 LINQ 编写 C# 都有哪些一招必杀的技巧?》

《机器学习面试干货精讲》

《深入浅出 JS 异步处理技术方案》

《敏捷教练 V 形六步法实战:从布朗运动到深度协作》

《从零开始,搭建 AI 音箱 Alexa 语音服务》

《修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞》


「阅读原文」看交流实录,你想知道的都在这里

发表评论

电子邮件地址不会被公开。 必填项已用*标注