screen+zshからtmux+zshへ移行した時の環境構築とか初期設定

# 概要
screenとzsh(oh-my-zsh)とvim使ってたけどどれも使いこなせてない程度の人がtmux+zshに乗り換えたという内容です。
oh-my-zsh使ってるとそれ以上いじらない（いじれない）のでちゃんとZSHをちゃんと使うためにも.zshrc頑張って書きました。

terminalの表示が崩れまくったりいろいろしましたが一番まともに動いた内容のメモです。
随時tmux勉強して便利な使い方が増えたらチートシートなり更新していくと思います。

# 動作環境

|名称|バージョン|
|---|---|
|raspbian|debian 7.6|
|tmux|2.0|
|zsh|4.3.17|

SSHクライアントはputty-tray or minttyを利用しています。
それぞれsolarizedのカラー設定を適用しています。
tmuxは罫線が崩れるのを防止するためパッチを当てるのでソースからビルドします。
zshはaptで入れます

# 出来た環境
こんな感じ
![mintty.png](https://qiita-image-store.s3.amazonaws.com/0/44786/bae7aa64-db46-9290-230d-eaacd5f2acd9.png)

# インストール
## zsh
yumやらaptで適当に入れます。

### 設定
初期設定で作成された.zshrcをベースにいろいろと便利そうな機能を追加しました。
設定ファイルに細かくコメントを書きながら作ったのでそっちを読んで頂くとして先に補足をすると、

- Ctrl+Tはtmuxで使うのでこちらのバインドは外しています。
- zshはemacsキーバインドで使います。(viモードは使いこなせそうになかった)
    - ただ候補の選択はhjklで選びたいのでVI風にキーバインドを設定しています。
- cdrは4.3.11以上の機能なのでバージョン判定して潰しています。(centos 6.6では4.3.10でエラーが出たので)
- プラグイン管理はantigenを使うようにしてインストールされてない場合はインストール方法を出すようにしました
    - raspberry piは起動に2秒ほどかかるようになってしまったのでブロックごとコメントアウトしてたりします。
    - 普通のマシンであればストレス無いと思います。。

```bash;.zshrc
if [ -f ~/.zsh_local ]; then
  source ~/.zsh_local
fi

#----------------------------
# コマンド履歴の設定
#----------------------------
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000

#----------------------------
# EMACSキーバインド+不要なバインドを削除 
#----------------------------
bindkey -e
bindkey -r '^T'

#-----------------------------
# パスを入力した場合自動的にCDを付与する
# /var/log => cd /var/log
#-----------------------------
setopt AUTO_CD
# cdをpushdに変更 cd => push
setopt AUTO_PUSHD
# pushdに同じパスを追加しない
setopt PUSHD_IGNORE_DUPS

#-----------------------------
# 不要機能の無効化
#-----------------------------
# ^Dでログアウトしない
setopt IGNORE_EOF
# ^Q/^Sのフローコントロールを無効にする
setopt NO_FLOW_CONTROL
# ベル鳴らさない
setopt NO_BEEP

#-----------------------------
# 履歴機能
#-----------------------------
#入力途中の履歴補完
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
# N P による履歴呼び出しを入力済み文字にマッチしたコマンド検索にする
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

#履歴のインクリメンタル検索でワイルドカード利用可能
bindkey '^R' history-incremental-pattern-search-backward
bindkey '^S' history-incremental-pattern-search-forward

#-----------------------------
# プロンプト設定
# - カレントディレクトリ表示
# 右側
# - gitのリポジトリの表示
#-----------------------------
PROMPT="%~ %# "

autoload -Uz add-zsh-hook
autoload -Uz vcs_info
# プロンプト内で変数展開を行う
#setopt prompt_subst

zstyle ':vcs_info:*' formats '%F{green}(%s) - [%b]%f'
zstyle ':vcs_info:*' actionformats '%F{red}(%s)-[%b|%a]%f'

function _update_vcs_info_msg() {
    LANG=en_US.UTF-8 vcs_info
    RPROMPT="${vcs_info_msg_0_}"
}
add-zsh-hook precmd _update_vcs_info_msg

#-----------------------------
# 区切り文字の設定
#-----------------------------
autoload -Uz select-word-style
select-word-style default
zstyle ':zle:*' word-chars " /=;@:{}|"
zstyle ':zle:*' word-style unspecified

#-----------------------------
# ディレクトリ移動の管理(CDR)-4.2.11以降
#-----------------------------
autoload -Uz is-at-least
if is-at-least 4.3.11; then
    autoload -Uz add-zshhook
    autoload -Uz chpwd_recent_dirs cdr
    add-zsh-hook chpwd chpwd_recent_dirs

    # 履歴上限拡張(default 20)
    #zstyle ':chpwd:*' recent-dirs-max 200
fi

#-----------------------------
# エイリアス
#-----------------------------
alias vi='vim'
# ls等でカラー表示にする
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

alias ll='ls -l'
alias la='ls -A'

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'

# ls -la | lessに置き換わる
alias -g L='| less'

#-----------------------------
# プラグイン
#-----------------------------
if [[ -f $HOME/.zsh/antigen/antigen.zsh ]]; then
    source $HOME/.zsh/antigen/antigen.zsh
    antigen bundle zsh-users/zsh-syntax-highlighting
    antigen bundle zsh-users/zsh-completions src
    antigen apply
else
    echo "Antigen not installed."
    echo "1) create directory:$HOME/.zsh"
    echo "   $HOME/.zsh"
    echo "2) clone antigen from github."
    echo "   git clone https://github.com/zsh-users/antigen.git"
fi

#-----------------------------
# 補完機能を有効化
#-----------------------------
autoload -Uz compinit
compinit
# 2個以上接続選択肢があった場合プロンプトによる選択を行う
zstyle ':completion:*default' menu select=2
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# 補完候補のメニュー選択で、矢印キーの代わりにhjklで移動出来るようにする。
zmodload zsh/complist
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'j' vi-down-line-or-history
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
```

## tmux
縦横の分割を行うと罫線がUTF-8の文字幅関係で盛大にバグります。
とりあえずパッチを当てて＋設定で罫線の背景と文字を同じ色にしています。
prefixはscreenでも利用していたctrl+Tにしています

### ビルド
tmuxのビルドにlibeventが必要なのでまずそちらをビルドします

```bash;
curl -L https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz -o libevent-2.0.21-stable.tar.gz
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure
make
sudo make install
```

tmuxをパッチを当ててビルドします。
versionは2.0で2014/12/2時点です。tagから同じのを取るなりpatch改修するなりうまいことやってください。
パッチはこちらの物をベースに2.0用に修正しました。
http://emonkak.hatenablog.com/entry/2011/12/30/131055

```bash
git clone http://git.code.sf.net/p/tmux/tmux-code tmux
cd tmux
patch -p0 < ../tmux_jp.patch
sh autogen.sh
./configure
make
sudo make install
```

patchの内容は以下の通り

```diff;tmux_jp.patch
diff --git tty-acs.c tty-acs.c
index 5d03c3e..ffef82d 100644
--- tty-acs.c
+++ tty-acs.c
@@ -81,7 +81,7 @@ tty_acs_get(struct tty *tty, u_char ch)
 	struct tty_acs_entry *entry;
 
 	/* If not a UTF-8 terminal, use the ACS set. */
-	if (tty != NULL && !(tty->flags & TTY_UTF8)) {
+	if (1) {
 		if (tty->term->acs[ch][0] == '\0')
 			return (NULL);
 		return (&tty->term->acs[ch][0]);
diff --git tty.c tty.c
index 9f57c36..6646575 100644
--- tty.c
+++ tty.c
@@ -50,7 +50,7 @@ void	tty_repeat_space(struct tty *, u_int);
 void	tty_cell(struct tty *, const struct grid_cell *);
 
 #define tty_use_acs(tty) \
-	(tty_term_has((tty)->term, TTYC_ACSC) && !((tty)->flags & TTY_UTF8))
+	(tty_term_has((tty)->term, TTYC_ACSC))
 
 #define tty_pane_full_width(tty, ctx) \
 	((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx)
```

### 設定

```bash;.tmux.conf
#-----------------------------------------------
# 普通の設定
#-----------------------------------------------
# 表示をUTF-8に変更
#set-window-option -g utf8 on
set -g status-utf8 on
# ESCキーのdelayを0にする(vim用)
set -s escape-time 0
# window内の選ばれたプロセスにリネームするのを無効にする
set-window-option -g automatic-rename off
# カーソル移動をVI風に
set-window-option -g mode-keys vi
# ターミナル名を変更
# set -g default-terminal "screen-256color"

#-----------------------------------------------
# Prefixキーを変更
#-----------------------------------------------
unbind C-b
set-option -g prefix C-t
bind C-t send-prefix

#-----------------------------------------------
# 特殊なキーバインド
#-----------------------------------------------
# 設定ファイルをリロード
bind-key C-r source-file ~/.tmux.conf \; display-message "Reloaded."

# コピーモードでvとpでコピペ出来るように
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-selection
unbind -t vi-copy Enter

# | でペインを縦に分割する
bind | split-window -h
#
# - でペインを横に分割する
bind - split-window -v

#-----------------------------------------------
# カラー・ステータスバー設定
#-----------------------------------------------
set -g status-fg cyan
set -g status-bg black

set -g status-left-length 40
set -g status-left '#[fg=black,bg=green][#H]Session: #S #[default]'
set -g status-right '#[fg=black,bg=cyan,bold] [%Y-%m-%d(%a) %H:%M]#[default]'

# window-status-current
setw -g window-status-current-fg black
setw -g window-status-current-bg cyan
setw -g window-status-current-attr bold#,underscore

# pane-active-border
set -g pane-active-border-fg green
set -g pane-active-border-bg green
set -g pane-border-fg colour236
set -g pane-border-bg colour236
```

# チートシート
重要度高いのだけ

## ZSHショートカット
|ショートカット|動作|
|---|---|
|ctrl+f|[カーソル移動] 右へ1文字移動|
|ctrl+b|[カーソル移動] 左へ1文字移動|
|ctrl+a|[カーソル移動] 行頭|
|ctrl+e|[カーソル移動] 行末|
|ctrl+p|コマンド履歴前|
|ctrl+n|コマンド履歴次|
|ctrl+w|直前の単語を消す|

## tmuxコマンド
|コマンド|動作|
|---|---|
|tmux|セッション起動(名前は0...)|
|tmux a|セッションにアタッチ|
|tmux a -t [session]|指定したセッションにアタッチ|
|tmux new -s [session]|名前つけてセッション起動|
|tmux rename -t [orig] [new]|セッション名を変更する|

## tmuxショートカット
prefix(ctrl+T)を押してからキーを押す

|キー|機能|
|:---:|---|
|c|新規ウィンドウの作成|
|n|次のウィンドウに切り替え|
|p|前のウィンドウに切り替え|
|)|次のセッションに切り替え|
|(|前のセッションに切り替え|
|｜|縦分割|
|-|横分割|
|o|ペイン切り替え|
|q|ペインの番号を表示。続いて対応する数字を押すと移動する|
|!|現在のペインを新規ウィンドウに分離|
|[|コピーモードへ移行<br>vで選択開始 yでコピー|
|]|ペースト|
|$|セッション名変更|
|,|ウィンドウ名変更|

##その他・・・
:join-pane