ターミナルと開発環境(@五反田.rb)

###自己紹介

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/d94e2af1-5b32-848b-0bdb-02be0da0bbab.png)


cuiとリファクタリングが好きなrailsプログラマです。
awsなどのインフラ周りも触ります。

ジモティーという会社で同名のサービスを作ってます。
会社でvim使っているのは自分だけで、寂しいです。

---
###zsh tmux vim peco ergodoxのススメ(＋α)

cui toolを使いこなすと作業が捗る

---
###tmuxのススメ(1)
必要な時に、必要な分だけペインを分割して使っていくのが好き

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/b089b1b9-85fe-17a9-eff8-0f6d5483c206.png)

---
###tmuxのススメ(2)
zsh起動時に自動起動にしておく

```zsh:.zshrc
# tmux自動起動
if [ -z "$TMUX" -a -z "$STY" ]; then
  if type tmuxx >/dev/null 2>&1; then
    tmuxx
  elif type tmux >/dev/null 2>&1; then
    if tmux has-session && tmux list-sessions | /usr/bin/grep -qE '.*]$'; then
      tmux attach && echo "tmux attached session "
    else
      tmux new-session && echo "tmux created new session"
    fi
  elif type screen >/dev/null 2>&1; then
    screen -rx || screen -D -RR
  fi
fi

```
iterm2との組み合わせでワーキングDirを設定しておくと、
ペインを分割した時に作業場所が最初から開いていると便利。
(作業場所ごとにitermのprofileを作っておくと良いかも。)

profileの設定
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/b802b64d-1649-e8fc-dba7-1fb5fb8ed0bc.png)


[tmuxinator](https://github.com/tmuxinator/tmuxinator)というgemを使うと自分のレイアウトを登録して起動ができる。
IDEっぽいレイアウトに調整したあと、登録とか、ペインごとに起動時の動作も登録できたと記憶している。

---
###tmuxのススメ(3)

```conf:.tmux.conf
# 設定ファイルをリロードする
bind r source-file ~/.tmux.conf \; display "Reloaded!"
# プレフィックスキー C-bをC-qに変える
unbind C-b
set-option -g prefix C-t
# キーストロークのディレイを減らす
# set -sg escape-time 1
# ESCキーの効きを改善
# set -s escape-time 0
# ペインを立てに分割する
bind v split-window -h
# bind -n C-v split-window -h
# ペインを横に分割する
bind s split-window -v
# bind -n C-s split-window -v

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


# Vimのキーバインドでペインをリサイズする
bind -r < resize-pane -L 1
bind -r > resize-pane -R 1
bind -r - resize-pane -D 1
bind -r + resize-pane -U 1
# ステータスバーの色を設定する
set -g status-fg white
set -g status-bg black
# ウィンドウリストの色を設定する
setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim
# アクティブなウィンドウを目立たせる
# setw -g window-status-current-fg white
# setw -g window-status-current-bg red
# setw -g window-status-current-attr bright
# アクティブなペインを目立たせる
set-option -g pane-border-fg white
set-option -g pane-active-border-fg red
# コマンドラインの色を設定する
set -g message-fg white
set -g message-bg black
set -g message-attr bright
# ステータスバーを設定する
## 左パネルを設定する
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
## 右パネルを設定する
set -g status-right "#[fg=cyan][%Y-%m-%d(%a) %H:%M]"
## ステータスバーのUTF-8サポートを有効にする
## set -g status-utf8 on
## リフレッシュの間隔を設定する(デフォルト 15秒)
set -g status-interval 60
## ウィンドウリストの位置を中心寄せにする
set -g status-justify centre
## ヴィジュアルノーティフィケーションを有効にする
# setw -g monitor-activity on
# set -g visual-activity on
## ステータスバーを上部に表示する
set -g status-position top
#bind : command-prompt

# 256色端末を使用する
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'
# # コピーモードを設定する
# ## viのキーバインドを使用する
setw -g mode-keys vi
# ## クリップボード共有を有効にする
set-option -g default-command "reattach-to-user-namespace -l zsh"
#
# ## コピーモードの操作をvi風に設定する
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
#
# キーバインド（コピーモード）
#
bind Space copy-mode
bind p paste-buffer

# vでマーク開始
# bind -t vi-copy v begin-selection

# Vで行の先頭からマーク開始
bind -t vi-copy V select-line

# C-vで矩形選択の切り替え
bind -t vi-copy C-v rectangle-toggle

# yでヤンク
# bind -t vi-copy y copy-selection

# Yで1行ヤンク
bind -t vi-copy Y copy-line

```
---
###zshのススメ(1)

1文字aliasとても便利で生産性があがる。
mを押すと
`git fetch -p`
`git checkout master`
`git pull origin master`
最後にマージ済みのlocal branch削除までするように設定している。

```zsh
alias t="tig"
alias s="tig status"
alias m="f && git co master && git pull origin B && git delete-merged-branches"
alias gl="git log --decorate"
alias glo="git log --oneline"
alias f="git fetch --prune"

```

#↓マージ済みのローカルブランチを削除する設定
```config:~/.gitconfig
[alias]
  delete-merged-branches = !git branch --merged | grep -v \\* | xargs -I % git branch -d %
```

[参考:一文字エイリアスはいいぞ！](http://qiita.com/fujimura/items/97d894ef29d4a01b1802)


---
###zshのススメ(2)

current_branchを打たなくて済む

```zsh
git push origin B
git pull origin B
```

```zsh:.zshrc
function git_current_branch_name()
{
  git branch | grep '^\*' | sed 's/^\* *//'
}
alias -g B='"$(git_current_branch_name)"'
```

---
###zshのススメ(4)

terminalからコマンド一発でテンプレートを用いたPullRequest発行

```zsh
git pr
```

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/c2e5843c-1f0c-f816-8ed3-4d11e658792d.png)

[参考:テンプレートを使って指定したbranchに向けてコマンドラインからPull Requestを出す](http://qiita.com/piyohiko/items/a68e69fc54ae2d14c783#_reference-7ed482c622019afef66a)

---
####gitの設定（commitテンプレートを使う）

```config:.git/config
[commit]
  template = ~/.commit_template
```
設定しておくと便利、自分が使いやすいように改善サイクルを回したい

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/e16687b6-aca0-d213-0184-d79c98d205e6.png)

---
####zshのススメ(peco ghq hub)

dirctoryに移動したり、githubを開いたり

```zsh
$ g
$ gh
```

```zsh:zshrc
alias g='cd -G' #enhancdが設定されている時
# alias g='cd $(ghq root)/$(ghq list | peco)'
alias gh='hub browse $(ghq list | peco | cut -d "/" -f 2,3)'
```

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/4a0ffce3-1451-86a9-136a-b0a62f7307f4.png)

[参考:ghq, peco, hubで快適Gitライフを手に入れよう！](http://qiita.com/itkrt2y/items/0671d1f48e66f21241e2)


---
###zshのススメ(好きなプラグイン1）

一度移動したdirectoryを覚えて、曖昧なwordでも移動してくれる
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/508565e5-ab66-1d88-a78d-84e49b5c5ec0.png)

```zsh
$ pwd
/Users/tosMiyake
$ cd my-pr
$ pwd
/Users/tosMiyake/project/node/angular/my-proj
```
候補が複数ある場合はインクリメンタル検索になる
オプションや、cd以外にbindするようにも出来る

[参考:autojump/z から乗り換えよう、cd 拡張プラグイン enhancd](http://qiita.com/b4b4r07/items/4b97c2348af4dba29a03)

---
###zshのススメ(好きなプラグイン2）

[zsh-users/zsh-history-substring-search](https://github.com/zsh-users/zsh-history-substring-search)
C-rでhistoryをインクリメンタル検索
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/6cf647a1-8cd2-7a8b-74b0-f2fd980c701b.png)

---
###zshのススメ(好きなプラグイン3）
[zsh-users/zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
fish likeな補完
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/dc687068-84cc-8fa1-77a1-68f5444f0533.png)

---
###pecoる(1)

pecoで絞って、branchを切り替える

```zsh
$ git peco
```
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/9dd696dc-6714-c794-a91f-04fa8f7e17b9.png)

```zsh:~/bin/git-peco
#! /bin/sh
git checkout `git branch | peco | sed -e "s/\* //g" | awk "{print \$1}"`
```

---
###pecoる(2)

railsのrouttesをインクリメンタル検索

```bash:
$ rake routes > routes.text
$ cat routes | peco
```

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/4d04e803-a097-e4c3-2e26-272dc8dd6755.png)

---
###vimについて

なぜvimか?
keybindが使いやす、text objectという概念がすごく好き。
思考の速度で編集できている気がする。
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/6c18f6d4-acf7-e5b9-5b63-46ccc756b6fb.png)

terminalのtoolと相性がいい(serverにも入っている)

IDEのもっさり感がない

何より設定ファイルに投資した時間を考えると他のediterになかなかいけない

terminalとの行き来がつらいので、macvimは使ってない

---
###vim でお気に入りplugin(1)
[todesking/ruby_hl_lvar.vim](https://github.com/todesking/ruby_hl_lvar.vim)

rubyのローカル変数のシンタックスハイライト
地味に好き、typoとかに気きやすい。（neovimで使えなくてしばらくたって、このpluginが恋しくてvimに戻ってきた。）
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/01393d0a-fceb-3e30-7c16-aa5d2bdebbb7.png)

---
###vim でお気に入りplugin(2)

[tpope/vim-fugitive](https://github.com/tpope/vim-fugitive)

任意のcommitの状態でファイルが開けて(昔の消してしまったコードから拝借できる)、
そこでもgit brameできる(変更経緯を細かく追える)。
git blameのウィンドウでEnterを押すとcommitとdiffが見える。
超絶生産性を上げてくれる神plguin
他にも便利なコマンドあり。
(command :Glog :Gblame)
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/291c6011-0156-b154-96ee-a9d283aa6264.png)


---
###vim でお気に入りplugin(3)

[tpope/vim-rails](https://github.com/tpope/vim-rails)

railsの規約に沿った移動が便利
controller <=> view
controller <=> spec
model <=> spec

`gf`でいい感じにファイル移動できる
rubocopなどの結果をファイルにはき、ファイルパスでアクセスできる
roubocop > ru.text
gf

url_helperの上でgfすると、
routingされているcontrollerのactionを開いてくれる、驚き！！

---
###vim でお気に入りplugin(4)
[ctrlpvim/ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim)

ファイル名のあいまい検索で開いたり、
最近開いたファイルを基準にあいまい検索ができるため、
さっき開いていたcontroller開きたいといった時に、controllerと打てば該当のファイルが開ける。
直近のファイルにすごくアクセスしやすい。

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/42091433-3014-fbad-100f-4497ecd15270.png)


---
###vim でお気に入りplugin(5)

[jistr/vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs)
現在開いているファイルと同じ階層で、treeを開いてくれるため、同じ種類のファイルを編集する時に、
地味に便利。
`new.html.haml`編集ついでに`edit`も編集しておきたいとか。
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/9ec8cfcd-6d04-b121-c03f-1b5a82382e03.png)


---
###便利なGem
[interactive_editor](https://github.com/jberkel/interactive_editor)

rails consoleなどでちょっとした長いコードを打ちたい時にediterで編集できる。
補完やsnipetなどもediterのを使えるので生産性があがる。
閉じても同じSession内なら、さっき開いたファイルがもう一度開くようです。

```ruby:pry
pry(main)> vim
```
```ruby
# editterが立ち上がる
User.pluck(:name)
```

```ruby:pry
# 実行される
pry(main)> vim
[
    [ 0] "黒川 美雨",
    [ 1] "浅井 佑南",
    [ 2] "伊東 安未",
    [ 3] "森岡 陸空",
]
```

---
###sideci 便利
いろいろな自動規約チェックがあり、Githubにコメントしてくれる。
rubocopのautocorrectをwebのインターフェースでやってくれる機能もある。

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/e43abe26-0cce-b662-e177-33fd5dc5e657.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/b25f299b-04ec-2344-fe06-fc9a3f9c3b7f.png)


---
###circleci

テストは全部circleciで回し行く。
細かくpushしていればどこで壊れたかが分かる。
TDD的な取り組みも分かりやすい。

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/a910eebb-ae01-a436-b62f-cfe813bcec2a.png)

---
###circleci チーム開発でリソースを上手く使う

- rspecで1つでもコケたらテスト失敗にして終了する設定にする
(コケたテスト周りをローカルで調査)
- 同じbranchにpushしたらbuild cancelされて新しいcommitに対してbuildが走る設定がある
- [skip ci]コメント
- お金で殴りつけて並列化数を増やす

---
###ergodoxのススメ(1)

- 肩がこらない
- 真ん中にモノがおける
- 右手を少しずらすとトラックパッドが使える

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/684e7eb5-07f5-0953-a209-50e444d46d9d.png)

---
###ergodoxのススメ(2)

- 左右のL1に切り替える部分をshiftのように押しているときだけ切り替わるようにしている。
- レイヤーが勝手に切り替わることがないので、ストレスがすくない。
- レイヤーは全部で３つ存在して、記号数字が押しやすいもの、マウス操作ができるものという感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/7fbd56a2-9a48-95cf-27f5-c6ba4fbdc3b2.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/9ecaa612-3be0-3bfe-0a2e-dcf86c34e352.png)


---
###mac便利なアプリ

[kiritori](https://itunes.apple.com/jp/app/kiritori/id585126594?mt=12)
何か（図など）見ながらコーディングしたい時に、スクリーンショットとして全面に出てきてくれる。


![image](https://qiita-image-store.s3.amazonaws.com/0/31015/d316570c-1058-1ed5-7cb2-227990cb887a.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/31015/38b786b1-0b7d-1aa0-52ac-0bc6f6cad565.png)


---
###tigのススメ(1)

gitの操作がcuiでtoolですごく簡単

git rebase -i
git reset soft
git cherry-pick
該当コミットのPullRequestを確認
git stashの管理
git add reset操作がし易い
git add -p
git add 1行単位の操作

---
### tig 操作demo

---
###tigのススメ(2)

[WIP]説明を追加したい
すごく便利なので是非使って欲しい。
[参考:tigでgitをもっと便利に！ addやcommitも](http://qiita.com/suino/items/b0dae7e00bd7165f79ea)
[設定関連ココ見ればだいたい乗ってます](http://jonas.nitro.dk/tig/manual.html)

```tig:.tigrc
set diff-options = -m --first-parent
set main-view = id date author commit-title:graph=yes,refs=yes

# open-prというshellを実行(この変更が載っているgithub pull requestを開くshell)
bind generic p @open-pr %(commit)
# ↓かんたん rebase -i 設定
bind diff R !git rebase -i %(commit)
bind main S none
# コミットを基準にリセットしてやりなおす（変更はcommitされてない状態で残る）
bind main S !git reset --soft %(commit)
# ディレクトリ階層関係なくファイル削除できるスクリプト（yes/no聞かないサクサク消す）
bind status D @delete_git_file %(file)

```
---
###tigで利用しているスクリプト

```zsh:open-pr
#! /bin/zsh
merge_commit=$(ruby -e 'print (File.readlines(ARGV[0]) & File.readlines(ARGV[1])).last' <(git rev-list --ancestry-path $1..master) <(git rev-list --first-parent $1..master))
if git show $merge_commit | grep -q 'pull request'
then
  pull_request_number=$(git log -1 --format=%B $merge_commit | sed -e 's/^.*#\([0-9]*\).*$/\1/' | head -1)
  url="${$(hub browse -u)}/pull/${pull_request_number}"
fi
open $url
```

```zsh:delete_git_file
#! /bin/sh
path=$(git rev-parse --show-toplevel)
file_path="${path}/$1"
rm $file_path
```
---

#ありがとうございました。