優雅地使用命令行:Tmux 終端復用


轉自:http://harttle.com/2015/11/06/tmux-startup.html

你是否曾經開過一大堆的Terminal?有沒有把它們都保存下來的沖動?Tmux 的Session就是做這件事情的!你可以隨時退出或者進入任何一個Session。每個Session有若干個Window,每個Window又可以分成多個窗格(Pane)。

即使iTerm/Terminal/Konsole意外關閉也沒關系。Session可以完全恢復!但是關機就不可以了,不過你可以寫腳本來恢復!

Tmux是一個終端復用軟件,BSD協議發布。一般用於在一個命令行窗口中訪問多個命令行會話,或者在一個命令行終端中同時使用多個程序。Tmux用起來是怎樣的呢?看圖:

tmux screen shot

Tmux 最經典的使用場景便是用 Tmux+Vim 來做一個IDE,其中Vim部分的配置過程記錄在了這里,本文介紹Tmux的配置和使用。

iTerm的窗格和Tmux有什么區別?

iTerm是一個GUI軟件,它的窗格只是窗格而已!而Tmux是終端復用,在一個命令行窗口中不僅可以顯示多個Shell的內容,而且可以保持多個會話。 最重要的是:Tmux和Vim一樣,屬於字符終端軟件,不需要任何GUI的支持,在遠程登錄時尤其有用。

Tmux和screen有什么區別?

這兩個都是做終端復用的,我在阿里雲ECS上搭建Node.js API服務器時用過screen,它是GNU軟件,而Tmux是BSD的協議。 它們最主要的區別是Tmux支持Vi/Emacs風格的鍵盤映射,更好的接口和文檔,以及更好的腳本控制。所以建議使用Tmux!

安裝Tmux

OSX

brew install tmux

Linux

pacman -S tmux          # archlinux apt-get install tmux # Ubuntu yum install tmux # Centos 

基本使用

安裝好后就可以啟用一個Tmux Session了:(通過 tmux new -s myname 可以指定Session名)

tmux

在Tmux Session中,通過<prefix>$可以重命名當前Session。其中<prefix>指的是tmux的前綴鍵,所有tmux快捷鍵都需要先按前綴鍵。它的默認值是Ctrl+b

<prefix>c可以創建新的窗口(Window),<prefix>%水平分割窗口(形成兩個Pane),<prefix>"垂直分割窗口。退出當前Session的快捷鍵是<prefix>d。然后在Bash中可以查看當前的tmux服務中有哪些Session:

tmux ls

然后根據Session的名字可以再回去:

tmux a -t myname  (or at, or attach)

基本配置

默認的<prefix>Ctrl+b,如果你覺得不好按可以調整為Ctrl+a,只需要在配置文件~/.tmux.conf中加入:

unbind ^b
set -g prefix 'C-a'

為了能讓Tmux動態載入配置而不是重啟,我們設一個快捷鍵<prefix>r來重新載入配置:

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

注意,通過<prefix>r重新載入配置並不等同於重啟,只是增量地執行了配置文件中的所有命令而已。如果配置未生效,可以通過tmux kill-server來強行關閉Tmux。

窗格切換

可以把hjkl設置為切換窗格的快捷鍵:

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

再給調整窗格大小設置快捷鍵:

bind L resize-pane -L 10  # 向左擴展
bind R resize-pane -R 10  # 向右擴展
bind K resize-pane -U 5   # 向上擴展
bind J resize-pane -D 5   # 向下擴展

我們發現當打開新窗格時Shell仍然在Home目錄,可以設置為當前目錄:

bind '"' split-window -c '#{pane_current_path}'
bind '%' split-window -h -c '#{pane_current_path}'

拷貝

在Tmux中通過[進入拷貝模式,按下<space>開始拷貝。然后用Vim/Emacs快捷鍵選擇文本,按下<Enter>拷貝所選內容。然后通過]進行粘貼。

上述所有快捷鍵中,只有[]需要先按下<prefix>

我們可以讓上述拷貝快捷鍵符合Vi風格:

bind Escape copy-mode
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
unbind p
bind p pasteb
setw -g mode-keys vi      # Vi風格選擇文本

這樣,按下<Escape>進入拷貝模式,v進行選擇,y拷貝所選內容,p進行粘貼。

鼠標切換窗格

Tmux和Vim風格非常像,也可以設置鼠標模式。下面的設置開啟了所有鼠標功能: 通過點擊選擇窗格,通過拖動更改窗格大小,通過鼠標選擇窗口,還可以通過鼠標選擇復制區域。

setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on

恢復用戶空間

Tmux有一個Bug,其中Shell的用戶空間不是當前用戶,結果就是mac下的open, sudo等命令都會失效。錯誤如下:

The window server could not be contacted. open must be run with a user logged in at the console, either as that user or as root.

解決辦法如下:

更新reattach-to-user-namespace

brew update
brew upgrade reattach-to-user-namespace

.tmux.conf中添加:

set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"

這里的/usr/local/bin/zsh要對應於你的默認Shell,如果你沒做過手腳的話,應該在/usr/bin/bash

快捷鍵

Sessions

:new<CR>  new session
s  list sessions
$  name session

:new -s <session-name>可以指定新Session的名字。

Windows (tabs)

c  create window
w  list windows
n  next window
p  previous window
f  find window
,  name window
&  kill window

Panes (splits)

%  vertical split
"  horizontal split

o  swap panes
q  show pane numbers
x  kill pane
+  break pane into window (e.g. to select text by mouse to copy)
-  restore pane from window
⍽  space - toggle between layouts
<prefix> q (Show pane numbers, when the numbers show up type the key to goto that pane)
<prefix> { (Move the current pane left)
<prefix> } (Move the current pane right)
<prefix> z toggle pane zoom

Misc

d  detach
t  big clock
?  list shortcuts
:  prompt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM