Productive Mouse-Free Development

借用tmux書的副標題,來當作本文的標題。開發的過程中,只要是需要移動手去操作,例如滑鼠,甚至是在vim中移動手指頭去操作上下左右,無形中都是浪費時間。所以這裡試著配合tmux + vim的操作,來達到盡量不使用滑鼠的目標。

主要的過程一樣是參考upcase中tmux的教程。也參雜了一些我自己參考網路上其它人的設定檔,但重要的是整個調整的過程,先找出浪費時間的問題點,接著才是如何設定來克服問題。

prefix

預設的prefix是,如果你真的都是照這個按應該手很快就抽筋,可以改成

1
2
unbind-key C-b
set -g prefix C-a

重新設定prefix ,記得Ctrl要設定成Capslock,不然一樣手會抽筋。

1
bind a last-window

快速切換window,所以會變成<C-a>a,比較順手。

1
2
# type twice can still send C-a
bind-key -r C-a send-prefix

在vim中,<C-a>是有用處的,可以增加數字,因為tmux而不能用就太可惜了,所以設定連按兩次一樣會送出<C-a>,另外參數-r接示可以按著Ctrl鍵後再按a連發。

Reload Config

要測試設定檔最好的方式就是邊改邊試,所以重新載入設定檔就變成一個常執行的動作。

這邊就要先介紹一下tmux的plugin,tmux-sensible,它的目標是有一個所有tmux的使用者都能接受的設定檔,所以含蓋了一些基本的設定,包含我們現在要講的重載設定檔

1
2
# source .tmux.conf as suggested in `man tmux`
bind R source-file '~/.tmux.conf'

TPM (Tmux Plugin Manager)

既然上節提到了tmux plugin,那就得說說TPM,能幫助我們安裝套件,讓我們直接站在別人的肩膀上。

Integration with Vim

因為主力開發是Vim,所以當然要考慮同時使用Vim的情況下,因此vim-tmux-navigator這個套件就是因此而生的,作者也就是upcase tmux的主講人。

裝上後就可以用<C-h> <C-j> <C-k> <C-l>無縫在tmux pane和vim split window中自由的移動。

Pane Control

tmux-pain-control這個套件加入了幾個操作pane常用的功能,作者把名字故意取作pain,想必是原本在操作pane覺得很痛苦XD

另一個bind-key設定

1
bind-key b break-pane -d

可以把pane切出去另一個window

或是把另一個window的pane join過來

1
bind-key j command-prompt -p "join pane from: "  "join-pane -h -s '%%'"

交換pane

1
bind-key s display-panes\; command-prompt -p "pane #: "  "swap-pane -t '%%'"

Resize panes

prefix + H/J/K/L 可以控制當前pane的上下左右大小。

Spliting panes

  • prefix + | 望文生義,就不用解釋了
  • prefix + / 和上面一樣,但是會以全畫面來切割左右
  • prefix + - 一樣望文生義
  • prefix + _ 和上面一樣,但是會以全畫面來切割上下

Copy Text

在最前面提到了,既然想要盡量不使用滑鼠,面對查找Log時就會遇到困難。原來在iTerm中還可以用滑鼠滾動,圈選和複制,但是到了tmux就沒辦法。不方便沒錯,但是記住我們一開始的目標就是放在要能有效的操作,所以滑鼠的方便性在這裡我們只能捨去。

prefix + [可以進入copy mode,tmux的copy mode能夠切換成vi mode,對vim的使用者比較親切

1
2
3
4
5
6
7
# Use vim keybindings in copy mode
setw -g mode-keys vi
# vi like copy paste behaviour
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'V' send -X select-line
bind-key -T copy-mode-vi 'r' send -X rectangle-toggle
bind-key -T copy-mode-vi 'y' send -X copy-pipe-and-cancel "pbcopy"

另外加入bind-key v V r y讓操作更接近vim的習慣。
可以按q跳離copy mode。

在copy mode中也能像vim一樣用/做搜尋,或者是想要更進階的話可以用tmux-copycat

參考網頁的說明:

1
2
3
4
This plugin enables:
- regex searches
- search result highlighting
- predefined searches

原本copy需要另外安裝其它套件,不過現在較新的版本tmux/iTerm可以不用麻煩了:

If you have tmux 1.5 or newer and are using iTerm2 version 3 or newer then the y in copy-mode and mouse selection will work without tmux-yank.

To enable this:

  1. Go into iTerm2’s preferences.
  2. Go to the “General” tab.
  3. Check “Applications in terminal may access clipboard”

Session List Control

如果需要開其它的專案,這時候就會考慮再開一個新的session,那麼session管理的需求就會出現了,可以考慮用tmux-sessionlist這個套件。

prefix + g 尋找session,名字可以部份match
prefix + C 新增session
prefix + X 刪除session
prefix + S 切換上一個session
prefix + @ 把這個pane切出去另一個session