Iterm2的使用者在使用过程中不断的切换工作内容,不可避免的会保持打开众多的标签或窗口,就像chrome不知不觉就是一大堆的标签一样。我们可以使用神器tumx来把工作环境分类,比如分成:github, work, blog。 好处是不同环境间布局不会相互影响且原环境切换到后台后,再切换回来,还是原状态。
tmux是把多个虚拟窗口看成一个物理窗口(terminal multiplexer),通过tmux的命令来操作这些窗口集合,方便切换且不会打乱你原来的工作环境,有点类似于Screen - GNU两者强大之处在于能把整个窗口都切换到后台运行,需要的时候再切换回来, 但是tmux的可操控性更好。
tmux

  • 在screen中,每个instance有自己完整独立的进程,而tmux则只在第一次运行时,会启动一个server进程,接下再启动instance则会去连接已有的server,这就意味着,可以多个instance共享同一个session,大家看到的都是一样的,绝佳的结对编程场景。tmate • Instant terminal sharing这个就是基于tmux用于共享terminal的开源项目。
  • screen只支持窗口(windows)模式,tmux支持多panes模式(与item2一致),一个window里面可以分割为多个panes(见上图)。

但是对于我这种不需要在编辑器(vim)使用tumx的人来说,tmux的缺点也很显示:

  • 要学习一整套tmux的快捷键和命令,man tmux可以看到使用手册大约有50页,复杂到甚至有人把它的使用看成一种哲学The Tao of tmux
  • Ctrl+BEmacs中的回退光标冲突了, 要时刻记住自己是在正常的终端还是在tmux中。
  • 不能随意的使用滚轮上下滚动。
  • 不能像iterm2那样方便的拖动窗口调整布局。

Iterm2整合tmux后就彻底的解决了以上缺点,并保留了tmux的所有优点。核心思路就是把tmux中的各种命令操作映射到iterm2原有的操作上,真正做到在iterm2中操作tmux和原有操作并无区别,把学习成本降低为零。

最佳实践

当你决定使用tmux时,最好一直都使用tmux来管理环境。为每一种环境设置不同的session, 比如:github,work,test,方便切换。

iTerm2中tmux基本设置

  1. 在login shell中send text as start

    tmux ls && read session && tmux -CC attach -t ${session:-default} \
    || tmux -CC new -s ${session:-default}
    • tmux ls : 列出已有的tmux session。
    • read session : 输入你需要打开的session。
    • tmux -CC attact -t ${session:-default} : 进入session。
    • || tmux -CC new -s ${session:-default} : 如果session不存在则新建此session。
      tmux_profile
  2. 在General选项中设置成以下,效果是每次打开使用tmux -CC新建session时都会使用一个新的窗口,并把tmux client session的命令隐藏到后台。
    tmux_new_windows
  3. 为了区别与其它的终端,我还在colors中也选择了的color Presets中也选择了Tango Dark。
    整体效果如下:
    iterm2_tmux_example
    是不是感觉和iterm2内置的窗口没有区别!这就是它最棒的地方,如果你点了左上角的小红点关闭窗口,并不是真正的关闭,只是把此session切到后台进行,你可以随时通过命令把它(attatch)切回来。

命令详解

如果你完全按照上面的设置后,以后的绝大部分操作都不需要手动输入tmux命令,因为iterm2已把tmux中大部分操作命令都映射到了自己身上,比如:

  • 关闭标签,窗口,会话映射为结束tmux 标签,窗口,会话。
  • Command + DCommand + shift + D分拆pane。
  • 拖拉窗口调整pane布局。

通过这些映射,你完全不需要输入任何的tmux命令,就能流畅地使用tmux。
如果觉得打开新标签页的方式来创建session的不太灵活,你还可以使用命令操作。以下就是2个核心命令:
tmux -CC -t session-name 用新窗口新建一个session;
tmux -CC attach -t session-name 转入到指定的session中;
总之,绝大部分情况下,你都不需要记住并输入这些命令。

其它你可能期待的设置

iterm2_better_setting
让选中的pane跟随鼠标,切换时少点击一下,爽!
设置切换panes tabs windows的快捷键。

最实用且一定要掌握的快捷键

Command + T 新建Tab
Command + W 关闭选中panes, tab, window
Command + D 纵向分割选中的pane
Command + Shift + D 横向分割选中的pane
Command + Shift + Enter 最大化选中的pane,隐藏其它panes,再次按下就还原布局。
Command + ; 提示输入过的命令
Command + Shift + H 根据时间弹出历史记录

总结

只需要适当的设置,无需学习任何tmux命令,你也可以熟练使用tmux神器。