感情的ドリル

Ruby県から飛び出して関東にきたオタク

何をやっても使う開発環境

なにするひと?

Railsを中心にRubyで開発をする人です。普通の人間。
2ヶ月〜半年スパンで案件が変わりつづけて6年目、決まり切った開発環境があるので晒す。きっかけはこれ。

開発周り

一番最初に入れるもの

zsh

bashより馴染んだコマンドシェル。ここは個人の自由だと思うけどzshrc(設定ファイル)の例がアホほど転がっているので便利だと思う。多分魚(fish)も便利だと思うけど知らない。最近Macのデフォルトがzshになったのでzsh公用語なのでは?適当言ってます。
ディレクトリ名でcdできたりブランチ名の表示がなんかあったりとか便利なので便利だと思います。

gitの一番新しいやつ

大抵「開発環境のOSはなんでもいいです」って言われて「じゃあCentosいれますね〜」ってやるのでyum install -y gitしてその後新しいgitを入れ直す。手順に関しては毎回ggrか自分の構築ログ見てやる。
数年前作った構築ログはQiitaにある。

peco

ちょ〜〜〜〜〜便利なやつなんですけど正式名称? 分類は知らない。上司が最初のbox(開発環境をVagrantで作ってboxにして配布する現場にいた)にしれっと入れていたので知った。適当なショートカットにインタラクティブサーチ的ななにがしをブチ込めるので便利。最後の方に汚いコードを晒す。

そのほか

案件によってDB入れたりRuby入れたりgemいれたりする。rails sが無事に動いてrails dbでDB見れてrails cでレコード操作できるようになったらもうなんでもいい。

設定周り

設定ファイル

.zshrc

デフォルトは少し凝ったzshrcでdifffにつっこんで出てきた設定はこれ。

# 好きな見た目にする
export LSCOLORS=cxfxcxdxbxegedabagac

# 覚えてないし何をしているのかも知らない(上司が突っ込んだ説がある)
autoload -Uz history-search-end
zle -N history-beginning-search-backward-end history-search-end
bindkey "^o" history-beginning-search-backward-end

# set rbenv for ruby(まあないと死ぬので)
export PATH="$HOME/.rbenv/shims:$PATH"
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"

# キーバインド
typeset -fuz zkbd

if [[ -f ~/.zkbd/$TERM-${DISPLAY:-$VENDOR-$OSTYPE} ]]; then
  source ~/.zkbd/$TERM-${DISPLAY:-$VENDOR-$OSTYPE}
    [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
    [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
else
  echo "Key definition not found."
fi
[[ -n "${key[Home]}"   ]] && bindkey "${key[Home]}"   beginning-of-line
[[ -n "${key[End]}"    ]] && bindkey "${key[End]}"    end-of-line
[[ -n "${key[Insert]}" ]] && bindkey "${key[Insert]}" overwrite-mode
[[ -n "${key[Delete]}" ]] && bindkey "${key[Delete]}" delete-char

# 起動した瞬間からRailsのプロジェクトに移動する
cd ~/xxxxxxxxx

zshがなんかいい感じにdelete認識してくれなくてストレスなのでキーバインドの設定をしている。
その他pecoの設定がわんさかある。後述。

alias

alias edit="vi ~/.zshrc"
alias update="source ~/.zshrc"

alias rails="bundle exec rails "
alias rake="bundle exec rake "
alias migrate="bundle exec rake db:migrate "
alias rs="rails s"
alias bi="bundle install"
alias pj="cd ~/xxxxxxx"
alias be="bundle exec "
alias rspec="bundle exec rspec "

be全然使ってないな。けそう。pjは~/.sshとかに行って迷子になった時にシュッとプロジェクトのディレクトリに飛ぶ時に使うけどほとんど使ってないです。
editとupdateは散々設定ファイルをいじくりまわしている時に最終的に気が触れて設定したalias。
ちなみにaliasコマンドで今現在のaliasの設定が見れます。便利。

function

function setcom(){
  if [[ -n "$*" ]]; then
    eval "__precmd_for_subsh() { print -z '$* ' }"
  else
    eval "__precmd_for_subsh() { print -z '' }"
  fi

  autoload -Uz add-zsh-hook
  add-zsh-hook precmd "__precmd_for_subsh"
}

これはどこかでみた必ずgitが入るって言うやつの派生系でプロセスに限り必ず冒頭になんかをセットするって言うやつです。
何をやってもgitが入る。これはひたすらbundle exec ...とかgit cherry-pickする時とかにも使う。便利。
名前がクソなのは自分で作ったからです。これは自分で環境を作って配布する時にしれっと入れるけど同僚が一回しか使ってくれなかった。でも便利です。
git専用のターミナルとかを作る人には便利です。便利でしょ?stとかaliasはる必要なくなるから便利でしょ?

.gitconfig

[alias]
    st = status
    ls = status
    dd = diff upstream/master HEAD
    fu = remote update
    d = diff
    co = checkout
    git = !git
    ds = diff --staged
    l = log --oneline --decorate -15
    po = push origin HEAD
    cb = checkout -b
    re = rebase upstream/master
    bals = reset --hard HEAD
    coa = commit --amend
    pof = push origin +HEAD
    pop = stash pop
    rollback = reset --soft HEAD~
    m = checkout master
    save = commit -m 'save'
    br = branch
    ref = reflog --oneline
    bn = branch --no-merged
    fixup = commit --fixup
[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less
[interactive]
    diffFilter = diff-highlight
[diff]
    compactionHeuristic = true

変なやつについて解説すると以下。

  • git dd
    リモートのmasterブランチとのdiffをとる。便利。
  • git ls
    ひたすらsetcom gitした後にlsを打ってしまう時期があって、無駄すぎたのでstatusを見れるようにしたらgit stをつかわなくなった。git lsを見ています。
  • git fu
    fetch upstreamが面倒になってfuにしてた時期があったけど複数remoteをfetchする必要が出てきてあ〜〜〜〜ってなってremote updateに中身を変えた。
  • git po, git pof
    push origin HEADをいちいちやりたくなかったので略した。
  • git bals
    バルス!!!!!!!する
  • git save, rollback
    ゲームのデータみたいにsave してrollbackしたかった。
  • git !git
    setcom gitの副作用で必ずgitが含まれてしまうので、丁寧にgit statusとか打つ時にgit git statusとかみたいになってバグるのを回避するやつ。日本語が変。
  • git fixup, git pop
    頻出サブコマンドをaliasシリーズ

  • diff-highlight
    使ってないの?便利だよ?文字単位でdiffがハイライトされます。
    私の説明よりこちらが詳しい。diff-highlightでGitのdiffを見やすくする
    最近はそのまま使えるわけではないのでこちらを参照してなんかいい感じにコンパイルしてほしい。 Ubuntu 18.04 で git diff-highlight へのパスを通す(リンク)

peco(.zshrc)

ヒストリ

pecoの王道の用途。ヒストリをいい感じにするやつ。

function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi

    BUFFER=$(\history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history

cd

なんかディレクトリとかに移動できるやつ。上司が作って上司が設置して上司しか使っていなかったのがかわいそうで消していない。

########################################
# Peco with find file or cd
# http://hotolab.net/blog/peco_select_path/
export EDITOR=vim # 好きなエディタ

function peco-path() {
  local filepath="$(find . | grep -v '/\.' | peco --prompt 'PATH>')"
  [ -z "$filepath" ] && return
  if [ -n "$LBUFFER" ]; then
    BUFFER="$LBUFFER$filepath"
  else
    if [ -d "$filepath" ]; then
      BUFFER="cd $filepath"
    elif [ -f "$filepath" ]; then
      BUFFER="$EDITOR $filepath"
    fi
  fi
  CURSOR=$#BUFFER
}

zle -N peco-path
bindkey '^o' peco-path # Ctrl+o で起動

+ git コミットハッシュをシュッととる

git fixupする時に使う。Ctrl+gで現在のブランチのコミットハッシュをシュッと取れるので便利。(fixupの良し悪しについては不問)

function peco-git-hash() {
    local commit_hash="$(git log --oneline | peco | awk '{print $1}')"
    BUFFER="$LBUFFER $commit_hash"
    CURSOR=$#BUFFER
}

zle -N peco-git-hash
bindkey '^g' peco-git-hash # Ctrl+o で起動

+git ブランチ名を取得するやつ

ブランチをいい感じに取得するやつ、自分で適当に書き直しているので辛い。
いい感じにcheckoutできます。便利。

# https://qiita.com/sachaos/items/34946c0085e4e391628c
function peco-git-branch() {
    local branch="$(git branch --no-merged | peco | tr -d ' ' | tr -d '*')"
    if [ -n "$branch" ]; then
      if [ -n "$LBUFFER" ]; then
        local flbuffer=$(echo $LBUFFER | sed -e 's/[ \t]*$//' | sed -e "s/.*/'&'/g")
        if [ ${flbuffer} = "'git'" ]; then
          local new_left="${LBUFFER%\ } co $branch"
        else
          local new_left="${LBUFFER%\ } $branch"
        fi
      else
        local new_left="$branch"
      fi
      BUFFER=${new_left}${RBUFFER}
      CURSOR=${#new_left}
    fi
}
zle -N peco-git-branch
bindkey '^B' peco-git-branch # Ctrl+o で起動

ルーチン

3つくらいvagrant sshして1つ目にsetcom git, (git )fu、2つ目にrs、3つ目は放置って感じにする。
こうするとgit専用、rails server専用、遊撃手(必要な時にrails cする)が生まれて便利。