俺のためにtmuxの操作方法と設定方法をまとめました。tmuxはバージョン2.3を使用。
インストール
ソースからインストールする場合は以下で。brew等はバージョン低かったりします。$ wget https://github.com/tmux/tmux/releases/download/2.3/tmux-2.3.tar.gz
$ tar xzvf tmux-2.3.tar.gz
$ cd tmux-2.3
$ ./configure && make
$ sudo make install
よく使う操作
ペイン生成Ctrl + b =>%
Ctrl + b => "
ペイン移動
Ctrl + b => カーソル
ウィンドウ生成
Ctrl + b => n
ウィンドウ移動
Ctrl + b => 番号
コピーモード
Ctrl + b => [
貼り付け
Ctrl + b => ]
Ctrl + b => #
.tmux.confあれこれ
tmuxでコピーしたバッファはOS Xのクリップボードにもセットする。$ brew install reattach-to-user-namespace
以下の設定を入れる
set-option -g default-command "reattach-to-user-namespace -l zsh"
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
コピーモードをviバインドにする
set-window-option -g mode-keys vi
マウス系の機能有効化(正確にはスクロールするとコピーモードになる)
set-option -g mouse on
リモートのtmuxでコピーした内容をローカルmacのクリップボードと共有するときは、Clipperが便利です。原理的には以下になります。
- SSHリモートフォワードする(任意のリモートポート => ローカルのClipperのポート)
- tmuxでコピーした内容をncでlocalhostに流す
- ローカルにフォワードされるので、常駐しているClipperがコピー内容をpbcopyに読み込ませる。 pbcopyは標準入力をクリップボードにセットしてくれる便利コマンド
$ brew install clipper
$ clipper
あとはclipperコマンド叩くなり、plist作ってlaunchctl作るなりしてclipperを起動させておく
リモートの.tmux.confはこんな感じで
bind-key -t vi-copy Enter copy-pipe "nc localhost 8377"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "nc localhost 8377"
Clipboard使わない場合はSSHを2つ並列で走らせて一方はtmux作業用、もう一方はコピー用として
$ tmux show-buffers
を叩けば良い。
同様のことをWindows環境で実行したい場合は、以下のようなGoのコードを書いて走らせればOK。
package main
import (
"fmt"
"net"
"os"
"io"
"os/exec"
)
const (
CONN_HOST = "localhost"
CONN_PORT = "8377"
CONN_TYPE = "tcp"
)
func main() {
// Listen for incoming connections.
l, err := net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
// Close the listener when the application closes.
defer l.Close()
fmt.Println("Listening on " + CONN_HOST + ":" + CONN_PORT)
for {
// Listen for an incoming connection.
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
// Handle connections in a new goroutine.
go handleRequest(conn)
}
}
// Handles incoming requests.
func handleRequest(conn net.Conn) {
buf, _, _ := bufio.NewReader(conn).ReadLine()
cmd := exec.Command("clip")
stdin, _ := cmd.StdinPipe()
io.WriteString(stdin, string(buf))
stdin.Close()
out, _ := cmd.Output()
fmt.Println("Copy String: " + string(buf))
// Send a response back to person contacting us.
conn.Write([]byte("Message received."))
// Close the connection when you're done with it.
conn.Close()
}