Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

十分钟学会 tmux #21

Open
kaiye opened this issue Jan 11, 2017 · 1 comment
Open

十分钟学会 tmux #21

kaiye opened this issue Jan 11, 2017 · 1 comment

Comments

@kaiye
Copy link
Owner

kaiye commented Jan 11, 2017

tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理。在 macOS 下,使用 iTerm2 能应付绝大多数窗口管理的需求。

iTerm2 的窗口管理

如上图所示,iTerm2 能新建多个标签页(快捷键 ⌘T),也能在同一个窗口中分割出多个窗格(快捷键 ⌘D 或 ⌘⇧D)。

tmux 相比 iTerm2 的优势在于:

  • iTerm2 的窗格切换快捷键(⌘⌥→)容易与其他软件全局快捷键冲突(例如 Spectacle 的窗口分割快捷键),tmux 由于存在前缀快捷键,所以不存在快捷键冲突问题;
  • tmux 可以在终端软件重启后通过命令行恢复上次的 session ,而终端软件则不行;
  • tmux 简洁优雅、订制性强,学会之后也能在 Linux 上使用,有助于逼格提升。

接下来我们花十分钟来掌握下 tmux 的基础用法:

安装运行

macOS 上使用 Homebrew 安装即可:

brew install tmux

安装完成后,运行 tmux 新建一个 tmux 的会话(session),此时窗口唯一的变化是在底部会出现一个 tmux 的状态栏。我们先按下 tmux 默认的前缀快捷键 ⌃b 将其激活为快捷键接收模式,再按下 % ,即可将当前窗口切分为左右两个窗格。

tmux 窗格

快捷键

一般情况下 tmux 中所有的快捷键都需要和前缀快捷键 ⌃b 来组合使用(注:⌃ 为 Mac 的 control 键),以下是常用的窗格(pane)快捷键列表,大家可以依次尝试下:

窗格操作

  • % 左右平分出两个窗格
  • " 上下平分出两个窗格
  • x 关闭当前窗格
  • { 当前窗格前移
  • } 当前窗格后移
  • ; 选择上次使用的窗格
  • o 选择下一个窗格,也可以使用上下左右方向键来选择
  • space 切换窗格布局,tmux 内置了五种窗格布局,也可以通过 ⌥1⌥5 来切换
  • z 最大化当前窗格,再次执行可恢复原来大小
  • q 显示所有窗格的序号,在序号出现期间按下对应的数字,即可跳转至对应的窗格

窗口操作

tmux 除了窗格以外,还有窗口(window) 的概念。依次使用以下快捷键来熟悉 tmux 的窗口操作:

  • c 新建窗口,此时当前窗口会切换至新窗口,不影响原有窗口的状态
  • p 切换至上一窗口
  • n 切换至下一窗口
  • w 窗口列表选择,注意 macOS 下使用 ⌃p⌃n 进行上下选择
  • & 关闭当前窗口
  • , 重命名窗口,可以使用中文,重命名后能在 tmux 状态栏更快速的识别窗口 id
  • 0 切换至 0 号窗口,使用其他数字 id 切换至对应窗口
  • f 根据窗口名搜索选择窗口,可模糊匹配

tmux 状态栏说明

会话操作

如果运行了多次 tmux 命令则会开启多个 tmux 会话(session)。在 tmux 会话中,使用前缀快捷键 ⌃b 配合以下快捷键可操作会话:

  • $ 重命名当前会话
  • s 选择会话列表
  • d detach 当前会话,运行后将会退出 tmux 进程,返回至 shell 主进程

在 shell 主进程下运行以下命令可以操作 tmux 会话:

tmux new -s foo # 新建名称为 foo 的会话
tmux ls # 列出所有 tmux 会话
tmux a # 恢复至上一次的会话
tmux a -t foo # 恢复名称为 foo 的会话,会话默认名称为数字
tmux kill-session -t foo # 删除名称为 foo 的会话
tmux kill-server # 删除所有的会话

除以上提到的快捷键以外,tmux 还有许多其他的快捷键和命令,使用前缀快捷键 ⌃b? 可以查看所有的快捷键列表,该列表视图为 tmux copy 模式,该模式下可使用以下快捷键(无需加 ⌃b 前缀):

  • ⌃v 下一页
  • Meta v 上一页 (tmux 快捷键为 Emacs 风格,这里的 Meta 键可用 Esc 模拟)
  • ⌃s 向前搜索
  • q 退出 copy 模式

常见配置与问题

1、鼠标滚屏

tmux 默认配置中最糟糕的体验就是滚屏查看和文本复制(大家可以先试试看)。你需要先使用 ⌃b [ 快捷键进入 copy 模式,然后使用翻页、字符定位来选择需要的字符,效率远没有鼠标选择来的快。

因此 tmux 提供了一些个性化配置项来优化这些配置,首先在 shell 中运行 touch ~/.tmux.conf 新建用户配置文件。在文件中增加以下内容:

# 开启鼠标模式
set -g mode-mouse on

# 允许鼠标选择窗格
set -g mouse-select-pane on

# 如果喜欢给窗口自定义命名,那么需要关闭窗口的自动命名
set-option -g allow-rename off

# 如果对 vim 比较熟悉,可以将 copy mode 的快捷键换成 vi 模式
set-window-option -g mode-keys vi

配置文件修改完成后,可以 tmux kill-server 重启所有 tmux 进程,或者在 tmux 会话中使用 ⌃b : 进入控制台模式,输入 source-file ~/.tmux.conf 命令重新加载配置。

注意:tmux 2.1 以上版本(使用 tmux -V 命令可查看版本号)对鼠标模式配置有调整,需要将以上配置文件中的前两项配置替换成 set-option -g mouse on 这一项配置。

2、鼠标复制

tmux 下开启鼠标滚屏后,复制文本有两种方式:

  • 方法 1:使用 ⌃b z 进入窗格全屏模式,鼠标选择文本的同时按住 option 键 ,然后使用 ⌘c 进行复制;
  • 方法 2:开启 iTerm2 「在选择时复制」选项,即可实现自动选择复制。如下图:

iTerm2 配置在选择时复制

3、tips

  • screen 是另外一款终端复用命令行,但他没有 tmux 好看好用;
  • tmux 有个 bug ,导致从它启动的 vscode 的复制粘贴快捷键会失效;
  • iTerm2 可以通过 「Preferences -> Profiles -> Keyboard Behavior -> Left option key acts as +Esc」将键盘的左侧 option 键映射为 Meta 键
  • zsh-autosuggestions 插件在 tmux 环境下有配色高亮的 bug,解决方案是在 .zshrc 文件中配置 export TERM=xterm-256color

另外,最近看到两篇不错的 awksed 命令入门,感兴趣的同学可以自己看一下。

@liangliangwqy
Copy link

好多快捷键。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants