オレオレ.bashrc

自身の.bashrcに書いている内容について。

https://github.com/sasaplus1/dotfiles/

```bash:.bash_profile
# load .bashrc
source "$HOME/.bashrc" 2>/dev/null
```

OS Xだと.bashrcが読み込まれないので.bash_profileから.bashrcを読み込むようにしている。

これでOS Xでも.bash_profile経由で.bashrcが読み込まれる。

```bash:.bashrc
# /usr/local/bin moved to first if brew command installed
brew=/usr/local/bin
type brew >/dev/null 2>&1 && export PATH=$brew:${PATH//$brew:/}
```

brewコマンドが存在する場合のみhomebrewへのパスを通す。変数展開している箇所は、PATHが重複しないように消している。（PATHの先頭に追加して、後方に同じパスがあった場合は後方のパスを置換で削除している）

typeコマンドで有無を確認しているが、whichで確認していたときよりターミナルの起動が大分速くなった。やっぱりwhichだとプロセスが立ち上がるからビルトインコマンド強しってことなのかな。

```bash:.bashrc
# bash-completion for OS X or Ubuntu
if [ -z "$BASH_COMPLETION" ]
then
  if [ -r "$HOME/Binary/bash-completion/etc/bash_completion" ]
  then
    bash_completion=$HOME/Binary/bash-completion/etc/bash_completion
  elif [ -r "/etc/bash_completion" ]
  then
    bash_completion=/etc/bash_completion
  fi

  [ -r "$bash_completion" ] &&
    BASH_COMPLETION=$bash_completion &&
    BASH_COMPLETION_DIR=${bash_completion}.d &&
    BASH_COMPLETION_COMPAT_DIR=$BASH_COMPLETION_DIR

  # bash-completion
  source "$BASH_COMPLETION" 2>/dev/null
fi
```

bash-completionの読み込み。

Ubuntuだと初期インストールから/etc/bash_completionがあるはずなのでそれを使う。$HOME/Binaryに自分でインストールしたものがあれば、そちらを優先的に使うが。

```bash:.bashrc
# ctags
ctags=$HOME/Binary/ctags
[ -d "$ctags" ] &&
  ctags_manpath=$ctags/share/man &&
  ctags_path=$ctags/bin &&
  export MANPATH=$ctags_manpath:${MANPATH//$ctags_manpath:/} &&
  export PATH=$ctags_path:${PATH//$ctags_path:/}
```

自分でインストールしたexuberant-ctagsの読み込み。manもたまに使うのでMANPATHも通す。

```bash:.bashrc
# git
git=/usr/local/git
[ -d "$git" ] &&
  git_manpath=$git/share/man &&
  git_path=$git/bin &&
  export MANPATH=$git_manpath:${MANPATH//$git_manpath:/} &&
  export PATH=$git_path:${PATH//$git_path:/}

# git-completion
source "$git/contrib/completion/git-completion.bash" 2>/dev/null
```

OS X向けのインストーラで入れたgitへパスを通したり、補完のファイルを読み込んだりとか。

```bash:.bashrc
# heroku
heroku=/usr/local/heroku
[ -d "$heroku" ] &&
  heroku_path=$heroku/bin &&
  export PATH=$heroku_path:${PATH//$heroku_path:/}

# tig
tig=$HOME/Binary/tig
[ -d "$tig" ] &&
  tig_manpath=$tig/share/man &&
  tig_path=$tig/bin &&
  export MANPATH=$tig_manpath:${MANPATH//$tig_manpath:/} &&
  export PATH=$tig_path:${PATH//$tig_path:/}

# vcprompt
vcprompt=$HOME/Binary/vcprompt
[ -d "$vcprompt" ] &&
  vcprompt_manpath=$vcprompt/man &&
  vcprompt_path=$vcprompt/bin &&
  export MANPATH=$vcprompt_manpath:${MANPATH//$vcprompt_manpath:/} &&
  export PATH=$vcprompt_path:${PATH//$vcprompt_path:/}
```

適当にいろいろ読み込んだりとか。

```bash:.bashrc
# z
z=$HOME/Binary/z
[ -d "$z" ] &&
  export PATH=$z:${PATH//$z:/}
touch $HOME/.z
source $z/z.sh 2>/dev/null
precmd() {
  _z --add "$(pwd -P)"
}
```

zを読み込んだりzの設定したりとか。zは普通にzのまま使ってる。たまにcdにした方がいいかなとか思うが。でも他人のターミナル使えなくなりそうだからやめとく。

```bash:.bashrc
# jq
jq=$HOME/Binary/jq
[ -d "$jq" ] &&
  export PATH=$jq:${PATH//$jq:/}
```

適当にjq読み込んだりとか。

```bash:.bashrc
# nginx / CocProxy
nginx=$HOME/Binary/nginx
[ -d "$nginx" ] &&
  export PATH=$nginx/sbin:$PATH

# redis
redis=$HOME/Binary/redis
[ -d "$redis" ] &&
  export PATH=$redis/bin:$PATH

# go
go=$HOME/Binary/go
[ -d "$go" ] &&
  go_path=$go/bin &&
  go_gopath=$HOME/.go &&
  go_gopath_bin=$go_gopath/bin &&
  export GOROOT=$go &&
  export GOPATH=$go_gopath &&
  export PATH=$go_path:${PATH//$go_path:/} &&
  export PATH=$go_gopath_bin:${PATH//$go_gopath_bin:/}

# goenv
GOENVTARGET=$HOME/.goenvtarget
[ -d "$GOENVTARGET" ] &&
  export GOENVTARGET &&
  export PATH=$GOENVTARGET:${PATH//$GOENVTARGET:/}

# nodebrew
nodebrew=$HOME/.nodebrew/current/bin
[ -d "$nodebrew" ] &&
  export PATH=$nodebrew:${PATH//$nodebrew:/}

# npm-completion
source "$HOME/.npm_completion" 2>/dev/null

# bower-completion
source "$HOME/.bower_completion" 2>/dev/null

# grunt-completion
type grunt >/dev/null 2>&1 && eval "$(grunt --completion=bash)"

# rbenv
rbenv=$HOME/.rbenv/bin
[ -d "$rbenv" ] &&
  export PATH=$rbenv:${PATH//$rbenv:/}
type rbenv >/dev/null 2>&1 && eval "$(rbenv init -)"

# pgvm
pgvm_home=$HOME/.pgvm
pgvm_home_bin=$pgvm_home/bin
pgvm_home_env=$pgvm_home/environments/current/bin
[ -d "$pgvm_home" ] &&
  export pgvm_home &&
  export PATH=$pgvm_home:${PATH//$pgvm_home:/} &&
  export PATH=$pgvm_home_bin:${PATH//$pgvm_home_bin:/} &&
  export PATH=$pgvm_home_env:${PATH//$pgvm_home_env:/}
```

いろいろ適当に読み込んだり。

```bash:.bashrc
# vim
vim=$HOME/Binary/vim
[ -d "$vim" ] &&
  vim_manpath=$vim/share/man &&
  vim_path=$vim/bin &&
  export MANPATH=$vim_manpath:${MANPATH//$vim_manpath:/} &&
  export PATH=$vim_path:${PATH//$vim_path:/} &&
  export EDITOR=vim
```

自分でコンパイルしたVimへのパスを通したり、EDITORを指定したり。`type vim >/dev/null 2>&1 && export EDITOR=vim`にした方が良いかもしれない。最近自分でコンパイルしないでMacVim使ってるし。

```bash:.bashrc
# MacVim
macvim=/Applications/MacVim.app/Contents/MacOS
[ -d "$macvim" ] &&
  export PATH=$macvim:${PATH//$macvim:/}
[ -x "$macvim/Vim" ] &&
  alias vim="$macvim/Vim \"\$@\""
```

MacVimへパスを通すとか。これをしないとMac標準の古いVimが使われてしまって悲しいので。

```bash:.bashrc
# screen
screen=$HOME/Binary/screen
[ -d "$screen" ] &&
  screen_manpath=$screen/share/man &&
  screen_path=$screen/bin &&
  export MANPATH=$screen_manpath:${MANPATH//$screen_manpath:/} &&
  export PATH=$screen_path:${PATH//$screen_path:/}

# tmux-MacOSX-pasteboard
tmux_macosx_pasteboard=$HOME/Binary/tmux-MacOSX-pasteboard
[ -d "$tmux_macosx_pasteboard" ] &&
  export PATH=$tmux_macosx_pasteboard:${PATH//$tmux_macosx_pasteboard:/}

# tmux and libevent
tmux=$HOME/Binary/tmux
libevent=$HOME/Binary/libevent
[ -d "$tmux" -a -d "$libevent" ] &&
  tmux_manpath=$tmux/share/man &&
  tmux_path=$tmux/bin &&
  export MANPATH=$tmux_manpath:${MANPATH//$tmux_manpath:/} &&
  export PATH=$tmux_path:${PATH//$tmux_path:/}

# tmux
type tmux >/dev/null 2>&1 &&
  alias tmux="LD_LIBRARY_PATH=$libevent/lib tmux"
```

screenとかtmuxへパスを通したりなど。screenはもう使ってないけど、サーバにtmux入れられない時でも標準でscreenが入ってることがあるので一応書いてある。
tmuxとかlibeventは自分でコンパイルしてる。あとpasteboardも入れてる。

```bash:.bashrc
# ssh-agent {{{
ssh_agent=/usr/bin/ssh-agent
ssh_agent_info=$HOME/.ssh-agent-info

source "$ssh_agent_info" 2>/dev/null

ssh-add -l >/dev/null 2>&1

if [ "$?" -eq 2 -a -x "$ssh_agent" -a -z "$SSH_AGENT_PID" ]
then
  eval "$ssh_agent | grep -v 'echo' > $ssh_agent_info" 2>/dev/null
  source "$ssh_agent_info" 2>/dev/null
fi
# }}}
```

ssh-agentの設定とか。OS XとUbuntuで微妙に挙動が違ったりして苦労した記憶がある。
OS Xだったらキーチェーンががんばってくれるので要らない気もするが。

```bash:.bashrc
# alias {{{
case "$(uname)" in
  Darwin)
    alias ls='ls -G'
    alias grep='grep --color=auto'
  ;;
  Linux)
    alias crontab='crontab -i'
    alias ls='ls --color=auto'
    alias grep='grep --color=auto'
    alias pbcopy='xsel --clipboard --input'
    alias pbpaste='xsel --clipboard --output'
  ;;
esac # }}}
```

エイリアスの設定。強調表示してもらったりとか。なんでcrontabのエイリアスLinuxの時だけなんだろ。OS Xは-iがないのか。

```bash:.bashrc
# history {{{
[ -z "$LOADED_BASHRC" ] && export HISTSIZE=10000
[ -z "$LOADED_BASHRC" ] && export HISTTIMEFORMAT='%Y/%m/%d %T '

#share_history() {
#  history -a
#  history -c
#  history -r
#}
#shopt -u histappend
#PROMPT_COMMAND='share_history'
# }}}
```

履歴関連の設定。履歴最大記憶数を増やしたり、細かい日付を指定したり。
tmuxの全ウィンドウで履歴を共有しようとがんばったけど、履歴番号を指定してコマンド実行としたら番号ずれまくったのでやめた。共有できてもあんまりうれしくなかったし。

```bash:.bashrc
# stop flow mode (disable C-s)
stty stop undef

# print repository type and branch name of current dir
print_repos_info() {
  type vcprompt >/dev/null 2>&1 && vcprompt -f '(%n:%b:%r)'
}

# change to urxvt fontsize
# from https://gist.github.com/anekos/5938365
type urxvt >/dev/null 2>&1 && set_urxvt_font_size() {
  old_name=`grep -i '^\s*urxvt.font' $HOME/.Xdefaults | cut -d: -f2-`
  new_name=`echo "$old_name" | sed 's/:\(pixel\)\?size=[0-9]\+/'":\1size=$1/"`

  [ -n "$TMUX" ] && printf '\ePtmux;\e'
  printf '\e]50;%s\007' "$new_name"
  [ -n "$TMUX" ] && printf '\e\\'
}

# mkdir and cd
mkcd() {
  mkdir "$1" && cd $_
}

# /current/dir (hg/git/svn:branch)
# username@hostname$ _
export PS1=\
'\[\033[01;32m\]\w\[\033[00m\] '\
'\[\033[01;36m\]$(print_repos_info)\[\033[00m\]\n'\
'\u@\h\$ '
```

フロウモードはC-s押したときに描画が止まってターミナル固まったと勘違いすること多かったので停止した。履歴の検索もこのキーのせいで出来なかったし。C-qで解除だっけ？(´・ω・｀)知らんがな

ターミナルがurxvtの時だけフォントサイズを変更する関数を作る。これで動的にフォントサイズを変更できる。
urxvt軽くて半透明に出来てアンチエイリアスも聞いてお気に入りなんだけど、最近はOS Xばかり使っているのでほとんど使えてない。OS X上で使おうと試したけどMacUIMとかいろいろ面倒でやめた。標準のターミナルもそこそこ速くなってきた感があるし、Terminal.app使ってる。

mkcdあんまり使ってない。

PS1を二段にしていろいろ表示されるようにした。ついでにvcpromptでリポジトリ情報を出したりとか。まー、svnとかhgのディレクトリに入ることは圧倒的に少ないのでgit付属の何かだけで良かったのかも知れないけど。vcpromptはバイナリだから速くて気にならない速度だからいいんだ。

ちなみにターミナルは以下のような感じになる。

```shell-session:Terminal
~/Repos/git/dotfiles (git:master:76bb5cfd8d1f)
sasaplus1@Maverics-OSX-MacBookAir$
```

二段にしてパスを一段目に表示すると、コマンドを入力する位置がずれなくなるのでよかった。確かUbuntuだと$の直前くらいにパスが入るので、ディレクトリ移動すると入力位置ずれまくりで若干見づらかった気がする。

```bash:.bashrc
# load .bashrc.local
source "$HOME/.bashrc.local" 2>/dev/null

# proxy settings {{{

# export ftp_proxy=ftp://proxy:port
# export FTP_PROXY=$ftp_proxy

# export http_proxy=http://proxy:port
# export HTTP_PROXY=$http_proxy

# export https_proxy=https://proxy:port
# export HTTPS_PROXY=$https_proxy

# export no_proxy=127.0.0.1,localhost
# export NO_PROXY=$no_proxy

# }}}

# set load guard
export LOADED_BASHRC=1
```

プロキシの設定のメモとか。今はプロキシ書かかなくていい環境なので大変ラクチン。
.bashrc.localというファイルにプロキシの設定を書く想定をしている。環境固有の設定を含めたくないので。含めるとまずい場合もあるしね。

```bash:.bashrc
# always use terminal multiplexer {{{
if [ "$TERM" != 'screen' -a "$TERM" != 'dumb' ]
then
  if type tmux >/dev/null 2>&1
  then
    tmux attach || tmux
  elif type screen >/dev/null 2>&1
  then
    screen -rx || screen -D -RR
  fi
fi # }}}

# vim:ft=sh:fdm=marker:fen:
```

tmuxかscreenがあったら常に使うように。常に最初に起動したセッション？にアタッチされるのだけど、2つ以上のセッション使うこと少ないからいいかなと思う。フルスクリーンにしてたのに新しいの起動するとtmuxがご丁寧にもフルスクリーンの方の表示領域小さくしてくれるのどうにかなんないのかなとは思うけど。

2つ以上のセッション使うときはC-a dしてtmuxしてる。あ、screenに慣れすぎたのでtmuxでもプレフィックスキーはC-aで、出来るだけscreenに似せたキーバインドにしてあります。screen似のキーバインドの設定ファイルが用意してあったけど、全然足りなくて調べつついろいろ追加した気がする。

```bash:.bash_logout
# load .bash_logout.first
source "$HOME/.bash_logout.first" 2>/dev/null

# shutdown ssh-agent
[ -n "$SSH_AGENT_PID" ] && eval `/usr/bin/ssh-agent -k`

# delete ssh-agent env
rm -f "$HOME/.ssh-agent-info"
```

主にssh-agentの後始末。.bash_logout.firstとかいうのを読み込むように書いてあるが、今は終了時に特別行いたい処理もないので消しても良いかもしれない。