###自己紹介
cuiとリファクタリングが好きなrailsプログラマです。
awsなどのインフラ周りも触ります。
ジモティーという会社で同名のサービスを作ってます。
会社でvim使っているのは自分だけで、寂しいです。
###zsh tmux vim peco ergodoxのススメ(+α)
cui toolを使いこなすと作業が捗る
###tmuxのススメ(1)
必要な時に、必要な分だけペインを分割して使っていくのが好き
###tmuxのススメ(2)
zsh起動時に自動起動にしておく
# 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を作っておくと良いかも。)
tmuxinatorというgemを使うと自分のレイアウトを登録して起動ができる。
IDEっぽいレイアウトに調整したあと、登録とか、ペインごとに起動時の動作も登録できたと記憶している。
###tmuxのススメ(3)
# 設定ファイルをリロードする
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削除までするように設定している。
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"
#↓マージ済みのローカルブランチを削除する設定
[alias]
delete-merged-branches = !git branch --merged | grep -v \\* | xargs -I % git branch -d %
###zshのススメ(2)
current_branchを打たなくて済む
git push origin B
git pull origin B
function git_current_branch_name()
{
git branch | grep '^\*' | sed 's/^\* *//'
}
alias -g B='"$(git_current_branch_name)"'
###zshのススメ(4)
terminalからコマンド一発でテンプレートを用いたPullRequest発行
git pr
参考:テンプレートを使って指定したbranchに向けてコマンドラインからPull Requestを出す
####gitの設定(commitテンプレートを使う)
[commit]
template = ~/.commit_template
設定しておくと便利、自分が使いやすいように改善サイクルを回したい
####zshのススメ(peco ghq hub)
dirctoryに移動したり、githubを開いたり
$ g
$ gh
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)'
参考:ghq, peco, hubで快適Gitライフを手に入れよう!
###zshのススメ(好きなプラグイン1)
一度移動したdirectoryを覚えて、曖昧なwordでも移動してくれる
$ pwd
/Users/tosMiyake
$ cd my-pr
$ pwd
/Users/tosMiyake/project/node/angular/my-proj
候補が複数ある場合はインクリメンタル検索になる
オプションや、cd以外にbindするようにも出来る
参考:autojump/z から乗り換えよう、cd 拡張プラグイン enhancd
###zshのススメ(好きなプラグイン2)
zsh-users/zsh-history-substring-search
C-rでhistoryをインクリメンタル検索
###zshのススメ(好きなプラグイン3)
zsh-users/zsh-autosuggestions
fish likeな補完
###pecoる(1)
pecoで絞って、branchを切り替える
$ git peco
#! /bin/sh
git checkout `git branch | peco | sed -e "s/\* //g" | awk "{print \$1}"`
###pecoる(2)
railsのrouttesをインクリメンタル検索
$ rake routes > routes.text
$ cat routes | peco
###vimについて
なぜvimか?
keybindが使いやす、text objectという概念がすごく好き。
思考の速度で編集できている気がする。
terminalのtoolと相性がいい(serverにも入っている)
IDEのもっさり感がない
何より設定ファイルに投資した時間を考えると他のediterになかなかいけない
terminalとの行き来がつらいので、macvimは使ってない
###vim でお気に入りplugin(1)
todesking/ruby_hl_lvar.vim
rubyのローカル変数のシンタックスハイライト
地味に好き、typoとかに気きやすい。(neovimで使えなくてしばらくたって、このpluginが恋しくてvimに戻ってきた。)
###vim でお気に入りplugin(2)
任意のcommitの状態でファイルが開けて(昔の消してしまったコードから拝借できる)、
そこでもgit brameできる(変更経緯を細かく追える)。
git blameのウィンドウでEnterを押すとcommitとdiffが見える。
超絶生産性を上げてくれる神plguin
他にも便利なコマンドあり。
(command :Glog :Gblame)
###vim でお気に入りplugin(3)
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
ファイル名のあいまい検索で開いたり、
最近開いたファイルを基準にあいまい検索ができるため、
さっき開いていたcontroller開きたいといった時に、controllerと打てば該当のファイルが開ける。
直近のファイルにすごくアクセスしやすい。
###vim でお気に入りplugin(5)
jistr/vim-nerdtree-tabs
現在開いているファイルと同じ階層で、treeを開いてくれるため、同じ種類のファイルを編集する時に、
地味に便利。
new.html.haml
編集ついでにedit
も編集しておきたいとか。
###便利なGem
interactive_editor
rails consoleなどでちょっとした長いコードを打ちたい時にediterで編集できる。
補完やsnipetなどもediterのを使えるので生産性があがる。
閉じても同じSession内なら、さっき開いたファイルがもう一度開くようです。
pry(main)> vim
# editterが立ち上がる
User.pluck(:name)
# 実行される
pry(main)> vim
[
[ 0] "黒川 美雨",
[ 1] "浅井 佑南",
[ 2] "伊東 安未",
[ 3] "森岡 陸空",
]
###sideci 便利
いろいろな自動規約チェックがあり、Githubにコメントしてくれる。
rubocopのautocorrectをwebのインターフェースでやってくれる機能もある。
###circleci
テストは全部circleciで回し行く。
細かくpushしていればどこで壊れたかが分かる。
TDD的な取り組みも分かりやすい。
###circleci チーム開発でリソースを上手く使う
- rspecで1つでもコケたらテスト失敗にして終了する設定にする
(コケたテスト周りをローカルで調査) - 同じbranchにpushしたらbuild cancelされて新しいcommitに対してbuildが走る設定がある
- [skip ci]コメント
- お金で殴りつけて並列化数を増やす
###ergodoxのススメ(1)
- 肩がこらない
- 真ん中にモノがおける
- 右手を少しずらすとトラックパッドが使える
###ergodoxのススメ(2)
- 左右のL1に切り替える部分をshiftのように押しているときだけ切り替わるようにしている。
- レイヤーが勝手に切り替わることがないので、ストレスがすくない。
- レイヤーは全部で3つ存在して、記号数字が押しやすいもの、マウス操作ができるものという感じ。
###mac便利なアプリ
kiritori
何か(図など)見ながらコーディングしたい時に、スクリーンショットとして全面に出てきてくれる。
###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も
設定関連ココ見ればだいたい乗ってます
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で利用しているスクリプト
#! /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
#! /bin/sh
path=$(git rev-parse --show-toplevel)
file_path="${path}/$1"
rm $file_path
#ありがとうございました。