2016-11-07

俺のためのtmuxまとめ

俺のために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が便利です。原理的には以下になります。

  1. SSHリモートフォワードする(任意のリモートポート => ローカルのClipperのポート)
  2. tmuxでコピーした内容をncでlocalhostに流す
  3. ローカルにフォワードされるので、常駐しているClipperがコピー内容をpbcopyに読み込ませる。 pbcopyは標準入力をクリップボードにセットしてくれる便利コマンド
ClipperはHomeBrewでインストール可能
$ 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()
}

参考URL

このエントリーをはてなブックマークに追加