OS X Mavericks にまっさらな状態から環境設定してみる


アップグレードすると挙動がよくわからくなりそうだったので、まっさらにして新しくOSを入れ直してみました。その時にいろんな記事を見たのですが、すでに古くなっていたりとかしたので、結構時間がかかりました。
そんなわけで環境設定の備忘録です。

## この記事で行うこと

+ OS初期状態からのhomebrewを軸にした環境設定
+ iterm2 - tmux - zsh - vimの環境設定
+ anyenvを使った開発環境設定


## この記事でわからないこと

+ boxenの使い方

## 方針決定

最初に考えていたのは、[boxen](https://github.com/blog/1345-introducing-boxen)を使った自動インストールでした。

+ [Mac OS Xの設定や管理を自動化するGitHub Boxen](http://www.infoq.com/jp/news/2013/02/GitHub-Boxen)
+ [Boxen使わなくても許されるのは2012年までだよね
](http://qiita.com/yuku_t/items/c6f20de0e4f4c352046c)
+ [もうすぐ 2014 年だけど boxen を独りで使ってみる](http://inokara.hateblo.jp/entry/2013/12/31/184645)

OSをインストールして、さて入れようかと思ってもう少し記事を漁っていたところ、boxenよりもこちらがいいという記事がいくつか見つかりました。

+ [BoxenやめてBrewfile+homebrew-caskにした](http://nomnel.net/blog/boxen-to-brewfile/)
+ [私もBoxen止めてBrewfile+brew-caskにした](http://masutaka.net/chalow/2014-01-25-1.html)

どうも、boxenは個人で管理するには少しオーバースペックっぽいので、私もBrewfileによる管理でとりあえず進めることにします。

※振り返って考えると、以下の作業をboxenとして全部設定するのがいいのかな…？

## ステップ１（homebrew bundleによるアプリインストール）

homebrewを使ってまず必要なものをざっとインストールします。homebrew以前に準備しないといけないものも合わせていれます。

以下の順番で進めます。

+ app storeからxcodeをインストール
+ アプリケーション->ユーティリティ->ターミナルを起動
+ コマンドラインツールインストール

```
$ xcode-select —install 
```
+ homebrewインストール

```
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)" 
```
+ homebrewが正常に動作するかどうか確認

```
$ brew doctor 
```
+ ~/dotfiles フォルダを作成
+ ~/dotfiles/Brewfileを作成

```Brewfile
tap homebrew/binary
tap phinze/homebrew-cask
install ack
install autoconf
install binutils
install git
install gnu-sed
install heroku-toolbelt
install openssl
install postgresql
install w3m
install wget
install tmux
# zshは/etcを参照しないようにする(参考：brew info zsh)
install zsh --disable-etcdir
install fontforge
install reattach-to-user-namespace

# macvimを入れる
tap supermomonga/homebrew-splhack
install --HEAD cmigemo-mk
install --HEAD ctags-objc-ja
install gettext-mk
install --HEAD macvim-kaoriya
linkapps

# powerline用フォントを作成する
tap sanemat/font
install --powerline --vim-powerline ricty

# 以下mac用アプリを入れる
install brew-cask
cask install dropbox
cask install google-chrome
cask install skype
cask install vagrant
cask install virtualbox
cask install hipchat
cask install iterm2
cask install kobito
cask install bettertouchtool
cask install alfred
cask alfred link
cask install KeyRemap4MacBook
```
+ brew caskでインストールするアプリが /Applicationsに入るようにする

```
$ export HOMEBREW_CASK_OPTS="--appdir=/Applications"
```
+ brewfileを使う。しばらく待つ。

```
$ brew bundle ~/dotfiles/Brewfile
```

参考記事：[BrewfileとHomebrew-caskでmacのセットアップ](http://qiita.com/macoshita/items/09c730e5a281897365eb), [homebrew-caskが良さそうなので導入してみた](http://blog.digital-bot.com/blog/2013/09/08/homebrew-cask/)

## ステップ２（iterm2設定、アプリによる操作カスタマイズ）
iterm2というターミナルアプリはカスタマイズしやすくていいのですが、最初にいくつか設定しておかないと、快適環境にならないです。あわせてキーボードの操作についても、設定していきます。

以下の順番で進めます。

+ brew bundleが成功していれば、パッチがあたったRictyフォントができているので、フォントファイルをコピーする。その後、フォントのキャッシュを作成する。

```
$ cp -f /usr/local/Cellar/ricty/3.2.2/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf
```
+ iterm2の環境設定を行う
 * vimでpowerlineを使うために、フォントの変更 (iTerm->Preferences->Profiles->Text) Regular FontとNon-ASCII FontをRitch Regular for Powerlineに変更
 * カラフルな表現にするために、ターミナル種別の変更(iTerm->Preferences->Profiles->Terminal) Report Terminal Typeをxterm-256colorに変更
 * 矢印キーをvimで使うために、キーのプリセットを変更(iTerm->Preferences->Profiles->Keys) Load Presetで、xterm Defaultsを押下参考文献：[iTermでVimを使うと矢印キーでカーソル移動できない](http://tech.portalshit.net/2010/10/26/iterm-arrow-key-issue/)
 * zshでMETAキーを使うために、キーの設定を変更(iTerm->Preferences->Profiles->Keys) Left option key acts as を+ESCに変更 参考文献：[zshでよく使うキーバインドまとめ](http://qiita.com/takc923/items/08792b7188b5c11e0f21)
 * ※（バッドノウハウ）背景を変更(iTerm->Preferences->Profiles->Colors) Basic Colors->Backgroundを修正する 参考文献：[iTerm2上で256色のvimを使う](http://qiita.com/muniere/items/e6c5c48a541401ee5af3) 
 * tmux上からコピー&ペーストを可能にするために、ターミナル<->クリップボードのアクセスを許可する※（セキュリティ面注意）(iTerm->Preferences->General) Selection->Allow clipboard access to terminal appsのチェックをONにする　参考文献：[iTerm2のクリップボードインテグレーション(OSC 52/PASTE64)のつかいかた](http://qiita.com/kefir_/items/1f635fe66b778932e278)

※バッドノウハウについて以下に引用しておきます。[iTerm2上で256色のvimを使う](http://qiita.com/muniere/items/e6c5c48a541401ee5af3) 
 
> iTerm2は色の設定を変更するまで再読み込みが行われないようで、ターミナルの種類を変更しただけでは256色になりません(本当の原因は不明です)。

 + KeyRemap4MacBookでESCキーのカスタマイズを行う
  * [Vimを使う上でのIME(日本語入力)の取り扱い](http://rcmdnk.github.io/blog/2013/06/20/computer-mac-keyremap4macbook-vim/)を参考にして設定します。
  * 操作方法が書いてないので補足すると、KeyRemap4MacBookのPreference->Misc & Uninstall の　Custom Setting->Open private.xmlボタンを押下すると、Finderが開くので、private.xmlを編集して保存するとOKです。何も設定がない状態から追加した設定が以下になります。

```private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>ESC to IME off (to English) + Esc + Esc</name>
    <appendix>Enable for all but HHK</appendix>
    <identifier>private.vim.ime_off_ESC</identifier>
    <only>TERMINAL, VI</only>
    <inputsource_only>JAPANESE</inputsource_only>
    <autogen>
      __KeyToKey__ KeyCode::ESCAPE, ModifierFlag::NONE,
      KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
      KeyCode::VK_CHANGE_INPUTSOURCE_JAPANESE,
      KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
      KeyCode::ESCAPE, KeyCode::ESCAPE
    </autogen>
  </item>
  <item>
    <name>Control + BRACKET_LEFT to IME off (to English) + Esc + Esc</name>
    <identifier>private.vim.ime_new</identifier>
    <only>TERMINAL, VI</only>
    <inputsource_only>JAPANESE</inputsource_only>
    <autogen>
      __KeyToKey__ KeyCode::BRACKET_LEFT,
      MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL|ModifierFlag::NONE,
      KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
      KeyCode::VK_CHANGE_INPUTSOURCE_JAPANESE,
      KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
      KeyCode::ESCAPE, KeyCode::ESCAPE
    </autogen>
  </item>
</root>
```

## ステップ３（zshへの切り替え）

いままではデフォルトのシェル(bash)を使っていましたが、zshに切り替えます。
brew bundleでインストールしたファイルは、/usr/local/bin以下に入っていますが、シェルやパスについてはそのままなので変更する必要があります。

ステップ３からは、ターミナルをiterm2に変更しています。


参考記事：[zsh の設定](http://www.gfd-dennou.org/member/uwabami/cc-env/ZshConfig.html)

+  /etc/shellsの一番下に/usr/local/bin/zshを追加

```
$ sudo vi /etc/shells
```

```/etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
```
+ 利用するシェルを変更

```
$ chsh -s /usr/local/bin/zsh
```
+ ~/dotfiles/.zsh フォルダを作成
+ ~/dotfiles/.zshenv ファイルを作成

``` ~/dotfiles/.zshenv
#! /usr/bin/env zsh
export ZDOTDIR=${HOME}/dotfiles/.zsh
source ${ZDOTDIR}/.zshenv
```
+ シンボリックリンクをホームディレクトリに置く

```
$ ln -s ~/dotfiles/.zshenv ~/.zshenv
```
+ ~/dotfiles/.zsh/.zshenv、~/dotfiles/.zsh/.zshsh を作成する

```~/dotfiles/.zsh/.zshenv
#! /usr/bin/env zsh
# -*- mode: sh; coding: utf-8; indent-tabs-mode: nil -*-
#
export LANG=ja_JP.UTF-8

path=(
  {/usr/local,/usr,}{/bin,/sbin}(N-/)
)
typeset -gxU path
manpath=(
    {/usr,/usr/local}/share/man(N-/)
)
typeset -gxU manpath

[ -z "$ld_library_path" ] && typeset -xT LD_LIBRARY_PATH ld_library_path
[ -z "$include" ] && typeset -xT INCLUDE include
typeset -xU ld_library_path include

## function: auto-zcompile & source
function _auto_zcompile_source  () {
    local A; A=$1
    [[ -e "${A:r}.zwc" ]] && [[ "$A" -ot "${A:r}.zwc" ]] ||
    zcompile $A >/dev/null 2>&1 ; source $A
}

[ -f $ZDOTDIR/proxy ] && \
    _auto_zcompile_source $ZDOTDIR/proxy

[ -d $HOME/bin ] && path=( $HOME/bin $path )

### duplicate cleaning
typeset -gxU path cdpath fpath manpath ld_library_path include

export HOMEBREW_CASK_OPTS="--appdir=/Applications"
```
```zsh:~/dotfiles/.zsh/.zshsh
#! /usr/bin/env zsh
#
umask 022                   # default umask
bindkey -e                  # keybind  -> emacs like
setopt no_beep              # beep を無効化

setopt auto_pushd           # cd 時に Tab 補完
setopt pushd_to_home        # pushd を引数無しで実行した時に pushd ~ とする
setopt pushd_ignore_dups    # ディレクトリスタックに重複する物は古い方を削除

DIRSTACKSIZE=20
limit coredumpsize 0

setopt correct              # コマンドのスペル訂正
setopt rc_quotes            # '' で ' を表現(エスケープをちょっとだけ省く)
unsetopt correct_all        # 全ての引数のスペル訂正: 無効化

setopt auto_resume          # リダイレクトしてない suspend job を同じ操作で再開
setopt bg_nice              # bg の nice を低くして実行
setopt notify               # バックグラウンドジョブの状態変化を即時報告する
setopt nohup                # default は nohup

## functions treat as array
typeset -Uga chpwd_functions
typeset -Uga precmd_functions
typeset -Uga preexec_functions

## utilities
autoload -Uz colors; colors  # 色指定を $fg[red] 等で行なえるように.

HISTFILE=$ZDOTDIR/history/${USER}-zhistory
HISTSIZE=100000
SAVEHIST=HISTSIZE

setopt extended_history                # コマンドの開始時刻と経過時間を登録
unsetopt share_history                   # ヒストリの共有 for GNU Screen
setopt inc_append_history              # 履歴を直ぐに反映
setopt hist_ignore_space               # コマンド行先頭が空白の時登録しない
unsetopt hist_ignore_all_dups            # 重複ヒストリは古い方を削除
setopt hist_reduce_blanks              # 余分なスペースを削除
setopt hist_no_store                   # historyコマンドは登録しない
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
function history-all { history -E 1}   # 履歴の一覧を出力

export LSCOLORS=ExFxCxdxBxegedabagacad
export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
export ZLS_COLORS=$LS_COLORS
export CLICOLOR=true
## Options
setopt auto_list              # 補完候補を一覧で表示
setopt auto_param_slash       # 補完候補がディレクトリの場合, 末尾に / を追加
setopt auto_param_keys        # カッコの対応も補完
setopt list_packed            # 補完候補をできるだけ詰めて表示
setopt list_types             # 補完候補のファイル種別を識別
unsetopt list_beep            # 補完の beep を無効化
setopt rec_exact              # 曖昧補完を有効化
setopt interactive_comments   # コマンドでも # 以降をコメントとみなす
setopt magic_equal_subst      # = 以降も補完(--prefix= 等)
setopt complete_in_word       # コマンドの途中でもカーソル位置で補完
setopt always_last_prompt     # カーソル位置を保持してファイル名一覧を補完

## style
zstyle ':completion:*' menu select=2 # カーソルによる補完候補の選択を有効化
# 色指定に LS_COLORS を使用
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# 種別を別々に表示させるため, グループを空白に
zstyle ':completion:*' group-name ''
# ディレクトリ名の補完
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
zstyle ':completion:*' keep-prefix
# リモートディレクトリも補完
zstyle ':completion:*' remote-access true
zstyle ':completion:*' completer \
    _oldlist _complete _match _ignored _approximate _list _history
## 補完候補の追加
[ -d $ZDOTDIR/modules/completions ] && \
    fpath+=( $ZDOTDIR/modules/zsh-completions/src $fpath)
# [ -d $ZDOTDIR/functions ] && \
#   fpath+=( $ZDOTDIR/functions $fpath)
typeset -gxU fpath
# autoload $ZDOTDIR/functions/*.zsh
# 初期化

setopt prompt_subst      # プロンプト定義内で変数置換やコマンド置換を扱う
setopt prompt_percent    # %文字から始まる置換機能を有効に
unsetopt promptcr        # 被る時は右プロンプトを消す
setopt transient_rprompt # コマンド実行後は右プロンプトを消す

autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git bzr svn hg
zstyle ':vcs_info:*' formats '%s:%b'
zstyle ':vcs_info:*' actionformats '%s:%b%a'
zstyle ':vcs_info:(svn|bzr)' branchformat '%b:r%r'
zstyle ':vcs_info:bzr:*' use-simple true
function prompt_vcs_info(){
    LANG=C vcs_info
    if [[ -n "$vcs_info_msg_0_" ]]; then
        ps_vcs_info="[%B%F{red}$vcs_info_msg_0_%f%b]"
    else
        ps_vcs_info=''
    fi
}
precmd_functions+=prompt_vcs_info

function count_prompt_chars (){
    print -n -P -- "$1" | sed -e $'s/\e\[[0-9;]*m//g' | wc -m | sed -e 's/ //g'
}
# precmd のプロンプト更新用関数
function update_prompt (){
    ## プロンプト: 1段目左
    local ps_user="%(!,%B%F{magenta}%n%b,%n)"
    local ps_host="%m"
    [[ -n ${SSH_CONNECTION} ]] && ps_host="%F{yellow}%m%f"
    local prompt_1st_left="[$ps_user@$ps_host$chroot_info]"
    ## プロンプト: 1段目右
    local prompt_1st_right="[%F{white}%(5~,%-2~/.../%1~,%~)%f]"
    ## 1段目行の残り文字列の計算
    local left_length=$(count_prompt_chars $prompt_1st_left)
    local right_length=$(count_prompt_chars $prompt_1st_right)
    local bar_rest_length=$[ COLUMNS - left_length - right_length -1 ]
    ## 1段目に水平線を引く
    local prompt_1st_hr=${(l:${bar_rest_length}::-:)}
    ## PROMPT の設定
    # @see Zshをかわいくする.zshrcの設定
    # URL: http://qiita.com/kubosho_/items/c200680c26e509a4f41c
    # 横幅等を調整.
    local ps_status="[%j]%(?.%B%F{green}.%B%F{blue})%(?!(*'-')%b!(*;-;%)%b)%f "
    local ps_mark="%(!,%B%F{magenta}#%f%b,%%)"
    PROMPT="$prompt_1st_left$prompt_1st_hr$prompt_1st_right-"$'\n'"$ps_status$ps_mark "
    PROMPT2='|%j]> '
    SPROMPT="[%j]%B%F{red}%{$suggest%}(*'~'%)?<%b %U%r%u is correct? [n,y,a,e]:%f "
    # 右プロンプト
    RPROMPT="$ps_vcs_info"
}
precmd_functions+=update_prompt

export MANPAGER='less -s'
export PAGER='less -R'
if whence lv >/dev/null ; then
    export PAGER=lv ;  export LV="-c -T8192 -l"
else
    alias lv=$PAGER
fi
whence vim >/dev/null && alias vi=vim
export EDITOR=vi

## ls
alias sl='ls'  #fxxk!!
export TIME_STYLE=long-iso
export LS_OPTIONS="-N -T 0 --time-style=$TIME_STYLE"
alias ls='ls -FG'
alias la='ls -haFG'
alias ll='ls -hlFG'
alias lla='ls -hlaFG'
alias lsd='ls -ld *(-/DN)'
alias man='LANG=C man'
alias vim=/Applications/MacVim.app/Contents/MacOS/Vim
alias vi=vim
PATH="/Applications/MacVim.app/Contents/MacOS:$PATH"

if [ ! -f $ZDOTDIR/.zshenv.zwc -o $ZDOTDIR/.zshenv -nt $ZDOTDIR/.zshenv.zwc ]; then
  zcompile $ZDOTDIR/.zshenv
fi
if [ ! -f $ZDOTDIR/.zshrc.zwc -o $ZDOTDIR/.zshrc -nt $ZDOTDIR/.zshrc.zwc ]; then
  zcompile $ZDOTDIR/.zshrc
fi
```

挙動として、zsh起動時は、~/.zshenvが読み込まれ、環境変数ZDOTDIR(~/dotfiles/.zsh)が設定されます。
それ以降は、~/dotfiles/.zsh/.zshrc, ~/dotfiles/.zsh/.zshenvが読み込まれることになります。

※ .zshenvと.zshrcを分ける理由は、[zsh, plenv(rbenv), parallel](http://qiita.com/rg_gs/items/5795fa777cac90d1359b)という記事が詳しいです。

## ステップ４（anyenv導入）
homebrewでは、rubyやrbenv等のパッケージは入れませんでした。xxenv系を調べているときに、[anyenv](https://github.com/riywo/anyenv)という複数の言語のバージョン管理をまとめて行える便利なものを見つけたので、こちらを採用することにします。

参考記事：[anyenvという**env系の簡易マネージャを作った](http://blog.riywo.com/2013/06/22/155804), [Installed anyenv](http://kazuomabuo.hatenablog.jp/entry/2013/09/01/144037)

+ ~/.anyenvにanyenvをインストールする

```
$ git clone https://github.com/riywo/anyenv .anyenv
```
+ ステップ２で作成した~/dotfiles/.zsh/.zshrc, ~/dotfiles/.zsh/.zshenvを修正する

```~/dotfiles/.zsh/.zshenv(path部分を修正)
path=(
  $HOME/.anyenv/bin
  {/usr/local,/usr,}{/bin,/sbin}(N-/)
)
```
```~/dotfiles/.zsh/.zshrc(追加)
eval "$(anyenv init -)"
```
+ さきほどの修正を起動中のシェルに反映させる

```
$ exec $SHELL -l
```

+ rbenv(ruby), plenv(perl), pyenv(python), ndenv(node)をインストール

```
$ anyenv install rbenv
$ anyenv install plenv
$ anyenv install pyenv
$ anyenv install ndenv
$ exec $SHELL -l
```
+ 必要なバージョンをそれぞれインストール

```
$ rbenv install 2.0.0-p353
$ rbenv rehash
$ rbenv global 2.0.0-p353
$ plenv install 5.16.3
$ plenv rehash
$ plenv global 5.16.3
$ pyenv install 2.7.6
$ pyenv rehash
$ pyenv global 2.7.6
$ ndenv install v0.10.25
$ ndenv rehash
$ ndenv global v0.10.25
```
これでインストールされました。

※ (はまったところ) 例えばrubyで、

```
$ gem install jekyll
```
としてモジュールをインストールした後に実行してもファイルがないと怒られました。env系の挙動がよくわかってなかったのですが、改めて、

```
$ rbenv rehash
```
を実行しなければ反映されません。面倒な場合の解決策は、[rbenv で gem を使った時に rbenv rehash しなくて良くする](http://rhysd.hatenablog.com/entry/20120226/1330265121)が参考になりました。

## ステップ４までのまとめ

ここまでのディレクトリ構成をまとめておきます。

```
~ (ホームディレクトリ)
+ .zshenv (※1のシンボリックリンク)
+ .anyenv/
+ dotfiles/
  + Brewfile
  + .zshenv (※1)
  + .zsh/
     + .zshrc
     + .zshenv
```

## ステップ５（Vimのインストール）

Vimをインストールします。インストール方針としてこんな感じです。

+ NeoBundleでモジュール管理する
+ .vimrc１ファイルですべてを記述せずに、依存関係毎にファイルを分ける

参考文献：[.vimrcファイルを分割する](http://yuzuemon.hatenablog.com/entry/2013/11/17/005517) 、[「source ~/.vim/*.vim みたいなことをしたい」とあんちぽさんに質問された話](http://blog.glidenote.com/blog/2013/09/20/source-vim-files-with-runtime/)

最終的な構成はこのようになります。

```
~ (ホームディレクトリ)
+ .zshenv (※1のシンボリックリンク)
+ .vimrc (※2のシンボリックリンク)
+ .anyenv/
+ dotfiles/
  + Brewfile
  + .zshenv (※1)
  + .zsh/
    + .zshrc
    + .zshenv
  + .vimrc (※2)
  + .vim/
    + .vimrc
    + bundle/
    + conf.d/
       + : (以下、設定ファイル）
```

順番に作成していきます。

+ ~/dotfiles/.vimrcを作成

```~/dotfiles/.vimrc
" 最初に読み込む
source ~/dotfiles/.vim/.vimrc
" conf.d内にあるファイルを全部読み込む
set runtimepath+=~/dotfiles/.vim/
runtime! conf.d/*.vim
```
+ シンボリックリンクをホームディレクトリに置く

```
$ ln -s ~/dotfiles/.vimrc ~/.vimrc
```

+ ~/dotfiles/.vim、~/dotfiles/.vim/conf.d、~/dotfiles/.vim/bundle　ディレクトリを作る
+ NeoBundleをインストールします。

```
$ git clone https://github.com/Shougo/neobundle.vim ~/dotfiles/.vim/bundle/neobundle.vim
```

+ ~/dotfiles/.vim/.vimrcを作成します。これが最初に読み込まれるので、NeoBundleが読み込まれるようにします。

```vim:~/dotfiles/.vim/.vimrc
set nocompatible
set number
set expandtab
set tw=0
set tabstop=2
set shiftwidth=2
set softtabstop=2
set list
set listchars=tab:▸\
filetype off

if has('vim_starting')
  set runtimepath+=~/dotfiles/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('~/dotfiles/.vim/bundle/'))

filetype plugin indent on

" Installation check.
if neobundle#exists_not_installed_bundles()
  echomsg 'Not installed bundles : ' .
        \ string(neobundle#get_not_installed_bundle_names())
  echomsg 'Please execute ":NeoBundleInstall" command.'
  "finish
endif

"git clone git://github.com/Shougo/neobundle.vim ~/dotfiles/.vim/bundle/neobundle.vim
NeoBundle 'Shougo/neobundle.vim'
```

+ 色の設定をします。

```vim:~/dotfiles/.vim/conf.d/colors-solarized.vim
NeoBundle 'altercation/vim-colors-solarized'
let g:solarized_termcolors=256
let g:solarized_termtrans=0
let g:solarized_hitrail=1
let g:solarized_visibility=1
syntax enable
set background=light
colorscheme solarized
```
+ vim-powerlineの設定をしようと思ったんですが、最近は、lightlineがよさげということで、lightlineを導入します。参考文献： [lightline.vim作りました - プラグインの直交性について](http://d.hatena.ne.jp/itchyny/20130824/1377351527)

```vim:~/dotfiles/.vim/conf.d/lightline.vim
NeoBundle 'itchyny/lightline.vim'

let g:lightline = {
      \ 'colorscheme': 'landscape',
      \ 'mode_map': { 'c': 'NORMAL' },
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ] ]
      \ },
      \ 'component_function': {
      \   'modified': 'MyModified',
      \   'readonly': 'MyReadonly',
      \   'fugitive': 'MyFugitive',
      \   'filename': 'MyFilename',
      \   'fileformat': 'MyFileformat',
      \   'filetype': 'MyFiletype',
      \   'fileencoding': 'MyFileencoding',
      \   'mode': 'MyMode',
      \ },
      \ 'separator': { 'left': '⮀', 'right': '⮂' },
      \ 'subseparator': { 'left': '⮁', 'right': '⮃' }
      \ }

function! MyModified()
  return &ft =~ 'help\|vimfiler\|gundo' ? '' : &modified ? '+' : &modifiable ? '' : '-'
endfunction

function! MyReadonly()
  return &ft !~? 'help\|vimfiler\|gundo' && &readonly ? '⭤' : ''
endfunction

function! MyFilename()
  return ('' != MyReadonly() ? MyReadonly() . ' ' : '') .
        \ (&ft == 'vimfiler' ? vimfiler#get_status_string() :
        \  &ft == 'unite' ? unite#get_status_string() :
        \  &ft == 'vimshell' ? vimshell#get_status_string() :
        \ '' != expand('%:t') ? expand('%:t') : '[No Name]') .
        \ ('' != MyModified() ? ' ' . MyModified() : '')
endfunction

function! MyFugitive()
  if &ft !~? 'vimfiler\|gundo' && exists("*fugitive#head")
    let _ = fugitive#head()
    return strlen(_) ? '⭠ '._ : ''
  endif
  return ''
endfunction

function! MyFileformat()
  return winwidth(0) > 70 ? &fileformat : ''
endfunction

function! MyFiletype()
  return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype : 'no ft') : ''
endfunction

function! MyFileencoding()
  return winwidth(0) > 70 ? (strlen(&fenc) ? &fenc : &enc) : ''
endfunction

function! MyMode()
  return winwidth(0) > 60 ? lightline#mode() : ''
endfunction
```
+ 補完とスニペット機能を導入します。参考資料： [今しているneocomplcache + neosnippetの設定の自分的おすすめ](http://kazuph.hateblo.jp/entry/2013/01/19/193745)

```vim:~/dotfiles/.vim/conf.d/neocomplcache_snippet.vim
NeoBundle 'Shougo/neocomplcache'
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
  \ 'default' : ''
  \ }

" Plugin key-mappings.
inoremap <expr><C-g>     neocomplcache#undo_completion()
inoremap <expr><C-l>     neocomplcache#complete_common_string()

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return neocomplcache#smart_close_popup() . "\<CR>"
endfunction
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><C-y>  neocomplcache#close_popup()
inoremap <expr><C-e>  neocomplcache#cancel_popup()

NeoBundle 'Shougo/neosnippet'
NeoBundle 'Shougo/neosnippet-snippets'

let g:neosnippet#snippets_directory='~/dotfiles/.vim/bundle/neosnippet-snippets/neosnippets,~/dotfiles/.vim/snippets'
" <TAB>: completion.
" inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr><S-TAB>  pumvisible() ? "\<C-p>" : "\<S-TAB>"

" Plugin key-mappings.
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)

" SuperTab like snippets behavior.
" imap <expr><TAB> neosnippet#jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"
imap <expr><TAB> pumvisible() ? "\<C-n>" : neosnippet#jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
smap <expr><TAB> neosnippet#jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"

" For snippet_complete marker.
if has('conceal')
  set conceallevel=2 concealcursor=i
endif
```
+ Vimを立ち上げます。

```
$ vim
```
+ Vim上で、:NeoBundleInstallを実行します。
+ 素敵画面になればひとまず導入完了です。

![vim.png](https://qiita-image-store.s3.amazonaws.com/0/32778/d8004618-257b-d64b-3788-f0ca406d7b53.png "vim.png")

##  ステップ６（tmuxのインストール）

tmuxをインストールします。インストール方針としてこんな感じです。

+ powerlineは導入しない
+ 色はVimにあわせる　参考文献：[Solarize color theme tmux configuration](https://github.com/altercation/solarized/tree/master/tmux) 
+ iterm2 - vim - tmuxで、コピー＆ペーストができるように設定する。参考文献：[tmuxのおすすめ設定](http://qiita.com/catatsuy/items/db0a471bf1eabaa21c36)
+ tmux上のvimでYankした時にクリップボードにコピーする、クリップボードからペーストする
+ tmuxinatorを導入する 参考文献：[Tmuxinatorで開発・運用を便利に](http://rrreeeyyy.com/blog/2013/02/25/14-tmuxinator/)

以下進めていきます。

+ ~/dotfiles/.tmux.confを作成する

```~/dotfiles/.tmux.conf
unbind C-b
set-option -g prefix C-t

bind r source-file ~/.tmux.conf
bind e setw synchronize-panes on
bind E setw synchronize-panes off

# Base
set-window-option -g utf8 on
set -g status-utf8 on

set-window-option -g mode-keys vi
set-option -g mouse-select-pane on
set-window-option -g mode-mouse on
set -s escape-time 0

# Windows
set-option -g base-index 1
bind-key c new-window
bind Space choose-window

# Panes
bind b break-pane

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

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

bind L resize-pane -R 10
bind J resize-pane -D 10
bind K resize-pane -U 10
bind H resize-pane -L 10

# Use vim keybindings in copy mode
setw -g mode-keys vi

#Views
set-option -g default-terminal "screen-256color"
set-option -g default-command "reattach-to-user-namespace -l zsh"

set -g set-titles on
set -g set-titles-string '#20(whoami)@#H:#20(pwd)'

#### COLOUR (Solarized 256)

# default statusbar colors
set-option -g status-bg colour235 #base02
set-option -g status-fg colour136 #yellow
set-option -g status-attr default

# default window title colors
set-window-option -g window-status-fg colour244 #base0
set-window-option -g window-status-bg default
#set-window-option -g window-status-attr dim

# active window title colors
set-window-option -g window-status-current-fg colour166 #orange
set-window-option -g window-status-current-bg default
#set-window-option -g window-status-current-attr bright

# pane border
set-option -g pane-border-fg colour235 #base02
set-option -g pane-active-border-fg colour240 #base01

# message text
set-option -g message-bg colour235 #base02
set-option -g message-fg colour166 #orange

# pane number display
set-option -g display-panes-active-colour colour33 #blue
set-option -g display-panes-colour colour166 #orange

# clock
set-window-option -g clock-mode-colour colour64 #green


set-option -g status-interval 10
set-option -g status-justify "centre"
set-option -g status-left-length 60
set-option -g status-right-length 90

# 設定リロード
bind r source-file ~/.tmux.conf
```
+ シンボリックリンクをホームディレクトリに置く

```
$ ln -s ~/dotfiles/.tmux.conf ~/.tmux.conf
```

+ ~/dotfiles/.zsh/.zshrcにpbcopyの設定を追加する　参考文献：[tmux で作業している時だけ zsh の設定を変えたいあなたに](http://qiita.com/catatsuy/items/dcd06d81fef7f7236ff5)

```zsh:~/dotfiles/.zsh/.zshrc(追加)
if [ -n "$TMUX" ]; then
  alias pbcopy="reattach-to-user-namespace pbcopy"
fi
```
+ ~/dotfiles/.vim/conf.d/にclipboard用の設定を追加する 参考文献：[【Vim】【Mac】Vimのヤンクでクリップボードにコピーする](http://sea-mountain.hatenablog.jp/entry/20110421/1303362772)

```vim:~/dotfiles/.vim/conf.d/clipboard.vim
set clipboard=unnamed,autoselect
```

+ tmuxinatorをインストールする。(rbenvからなので必要であれば、rehashする）

```
$ gem install tmuxinator
$ rbenv rehash
```

+ ~/dotfiles/.zsh/.zshrcにtmuxinatorの設定を追加する

```zsh:~/dotfiles/.zsh/.zshrc(追加)
 [[ -s $HOME/dotfiles/.tmuxinator/scripts/tmuxinator ]] && source $HOME/dotfiles/.tmuxinator/scripts/tmuxinator
```
+ ディレクトリの追加と、シンボリックリンクの作成を行う

```
$ mkdir ~/dotfiles/.tmuxinator/ 
$ ln -s ~/dotfiles/.tmuxinator/ ~/.tmuxinator
```

+ 設定ファイルを作成する（muxは、tmuxinatorの別名）

```
$ mux new default
```
```~/dotfiles/.tmuxinator/default.yml
# ~/.tmuxinator/default.yml

name: default
root: ~/

# Optional tmux socket
# socket_name: foo

# Runs before everything. Use it to start daemons etc.
# pre: sudo /etc/rc.d/mysqld start

# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions.
# pre_window: rbenv shell 2.0.0-p247

# Pass command line options to tmux. Useful for specifying a different tmux.conf.
# tmux_options: -f ~/.tmux.mac.conf

# Change the command to call tmux.  This can be used by derivatives/wrappers like byobu.
# tmux_command: byobu

windows:
  - editor:
      layout: main-vertical
      panes:
        - guard
        - guard
        - guard
```

+ tmuxをtmuxinator経由で起動する

```
$ mux start default
```
+ レイアウトされた画面が出てきたら完了。おつかれさまでした。

![tmux.png](https://qiita-image-store.s3.amazonaws.com/0/32778/ecbc45b3-1866-8b69-cb1e-9fd76fef5f08.png "tmux.png")



## まとめ（雑感）
簡単にまとめるはずが、やたらと長くなってしまいました。生産性という面では環境設定にかける時間は少ないほどいいはずなので、自動化必須ですね。

数年前に比べると、コンパイルしないといけないものが減って、gitから直接インストールできるものが増えて、導入は楽になってる分、見た目や出来ることの幅が広がっている印象があります。

また、nodeとか、急に環境整備が進んでパッケージマネージャー含めて導入していかないといけないものとかも出てきてますね。

いまは最適だと思っていても、半年ぐらい経つともっと便利とか、すでに使ってないとか、流行り廃りが早いので、都度見直し必須かなと思いました。まずは2014年初頭の備忘録ということで。