0

Tmux 速成教程:技巧和调整

 2 years ago
source link: https://sineatos.github.io/tools/develop/tmux/tmux-tutorial/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Tmux 速成教程:技巧和调整

May 30, 2018工具

Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话。不仅如此,你还可以通过 Tmux 使终端会话运行于后台或是按需接入、断开会话,这个功能非常实用。

Tmux 的快捷键前缀(Prefix)

当想要使用快捷键时,需要先按下快捷键前缀,然后再按下快捷键。Tmux 所使用的快捷键前缀默认是组合键 Ctrl-b

建议: 1. 对调Ctrl键和Caps-Lock键的功能,使得按快捷键更容易、便捷。 2. 建议将 Tmux 的快捷键前缀变为Ctrl - a。用Caps-Lock键替代了Ctrl键之后,由于Caps-Lock键与a键离得更近,所以按下Ctrl - a就将会比按下Ctrl - b更容易、更便捷。

更改快捷键配置:

# ~/.tmux.conf
unbind C-b
set -g prefix C-a

Tmux 的配置文件

每当开启一个新的会话时,Tmux 都会先读取~/.tmux.conf这个文件。

小提示:如果希望新的配置项能够立即生效,那么可以将下面这一行配置加入到文件~/.tmux.conf 中

# bind a reload key
bind R source-file ~/.tmux.conf ; display-message "Config reloaded.."

这样配置了之后,每当向~/.tmux.conf文件中添加了新的配置,只需要按下Ctrl-b r就可以重新加载配置并使新的配置生效,从而免去了开启一个新的会话。

Tmux 中最棒的功能

容器之间的关系:

tmux -> session -> window -> pane

窗格(Pane)

  1. 创建一个竖直放置的窗格: Ctrl-b %
  2. 创建一个水平放置的窗格: Ctrl-b "
  3. 窗格之间的移动:Ctrl-b 方向键

窗口(Window)

窗口是个窗格容器,可以将多个窗格放置在窗口中,并根据实际需要在窗口中排列多个窗格。在 Tmux 的会话中,现有的窗口将会列在屏幕下方。下图所示的就是在默认情况下 Tmux 列出现有窗口的方式。这里一共有三个窗口,分别是“server”、“editor”和“shell”。

http://ww3.sinaimg.cn/mw690/7178f37ejw1et82d3hvlrj20hg0as74s.jpg

  1. 创建一个窗口: Ctrl-b c
  2. 切换窗口: Ctrl-b 窗口对应的数字编号

会话(Session)

一个 Tmux 会话中可以包含多个窗口,以为一个特定的项目创建一个专用的 Tmux 会话。

  1. 创建一个新的会话: tmux new -s <name-of-my-session>
  2. 当前已拥有一个会话,再创建一个新的会话: Ctrl-b tmux new -s <name-of-my-session>

除非显式地关闭会话,否则 Tmux 的会话在重启计算机之前都不会消失。只要还没有重启计算机,你都可以自由地从一个项目的会话跳转到另一个。

在 Tmux 的会话间切换

  1. 获取现有会话的列表: Ctrl-b s。列表中的每个会话都有一个 ID,该 ID 是从 0 开始的。按下对应的 ID 就可以进入会话。
  2. 介入已开启的会话: tmux attach

在文本间快速移动光标,复制文本

  1. 使得Tmux的复制文字的时候按键模式像vi一样:

    ~/.tmux.conf
    # Use vim keybindings in copy mode
    setw -g mode-keys vi
    

将复制下来的文本发送到系统的剪贴板中

在默认情况下,当从 Tmux 中复制文本时,复制下来的文本只能粘贴到同一个 Tmux 会话中。若要使复制下来的文本可以粘贴到任何位置,就需要让 Tmux 将文本复制到系统的剪贴板。安装retach-to-user-namespace

sudo apt-get reattach-to-user-namespace

并在配置文件~/.tmux.conf加入:

~/.tmux.conf
# invoke reattach-to-user-namespace every time a new window/pane opens
set-option -g default-command "reattach-to-user-namespace -l bash

选择和复制文本

  1. 进入复制模式: Ctrl-b [
  2. 在复制模式中选选择文本,按下空格开始选择文本,按下回车将选择以后的文本复制到粘贴板

使得复制文本更像Vim的操作

~/..tmux.conf 配置 Tmux v 选择文本,y 复制文本:

# start selecting text typing 'v' key (once you are in copy mode)
bind-key -t vi-copy v begin-selection
# copy selected text to the system's clipboard
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

共享Tmux会话(结对编程)

将 Tmux 会话的地址分享给他人,这样他们就可以通过 SSH 接入这个会话。由于会话是建立在 SSH 之上的,所以不会产生额外的开销。通过使用高速的互联网,对于那些连接到远程会话上的用户而言,他们会觉得这个会话就是运行在本地的。

在Tmux 中使用 Tmate

Tmate 是一个 Tmux 的管理工具,使用它不但能够轻松地创建 Tmux 会话而且还能够通过互联网把该会话共享给其他人。若要使用 Tmate 共享 Tmux 会话,请按照以下步骤操作: - 安装 Homebrew - 安装 Tmate - 使用 Tmate 开启一个新的会话 - 从 Tmux 的会话中复制由 Tmate 产生的 SSH URL。如下图所示,请注意屏幕下方的信息“[tmate] Remote session: ssh …” - 利用刚刚复制下来的 URL 就可以邀请其他人通过 SSH 访问你的会话了。

调整 Tmux 以增强其同 Vim 的集成度

调整背景的配色方案

~/.vimrc中加入(通过 Tmux 运行 Vim 需要配置一个特殊的终端参数):

if exists('$TMUX')
  set term=screen-256color
endif

调整光标的形状

在默认情况下,当通过 Tmux 运行 Vim 时,无论当前 Vim 是处于插入模式、可视模式还是其他模式,光标的形状都是一样的。这样就很难判断当前的 Vim 模式是什么。若要避免这个问题,就需要让 Tmux 通知 iTerm 更新光标的形状。为此,需要将以下配置加入到文件~/.vimrc中。

if exists('$ITERM_PROFILE')
  if exists('$TMUX') 
    let &t_SI = "<Esc>[3 q"
    let &t_EI = "<Esc>[0 q"
  else
    let &t_SI = "<Esc>]50;CursorShape=1x7"
    let &t_EI = "<Esc>]50;CursorShape=0x7"
  endif
end

调整粘贴时的文本缩进

在 Vim 中粘贴文本时可能会遇到这样的问题,有时文本的缩进会发生变化,特别是在粘贴大量的文本时,这个问题会更加明显。虽然可以通过在粘贴前执行:set nopaste 来解决这个问题,但是这里还有一种更好的解决方法。就是把下面这段配置加入到配置文件~/.vimrc中,这样 Vim 就会自动地阻止粘贴文本时的自动缩进。

" for tmux to automatically set paste and nopaste mode at the time pasting (as
" happens in VIM UI)
 
function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif
 
  let tmux_start = "<Esc>Ptmux;"
  let tmux_end = "<Esc>"
 
  return tmux_start . substitute(a:s, "<Esc>", "<Esc><Esc>", 'g') . tmux_end
endfunction
 
let &t_SI .= WrapForTmux("<Esc>[?2004h")
let &t_EI .= WrapForTmux("<Esc>[?2004l")
 
function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction
 
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

美化 Tmux 的状态栏

在配置文件~/.tmux.conf中加入:

# 状态栏
# 颜色
set -g status-bg black
set -g status-fg white

# 对齐方式
set-option -g status-justify centre
 
# 左下角
set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
set-option -g status-left-length 20
 
# 窗口列表
setw -g automatic-rename on
set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
 
# 右下角
set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK