詳解 fishでモダンなシェル環境の構築(fish,tmux,powerline,peco,z,ghq,dracula)


![2015_04_12_13_57.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/1401ca1d-bc3e-f4e4-11c6-8e4a3f38ffb0.jpeg "2015_04_12_13_57.jpg")

はじめに
========

もともと`zsh`を15年ぐらい使っていたのですが、カスタマイズすればするほどモッサリとした動きになる点を悩んでいて、サクサク動いてモダンな`fish`シェルに乗り換えてみました。ついでに見た目も今風なオシャレな感じに仕上げたいと思います。：）


環境
========

- OSX 10.10.3
- iTerm2 2.0.0.20141103
- fish 2.1.2
- tmux 1.9a
- python
- powerline
- peco 0.3.0
- z 1.8
- python 2.7.9
- pip 6.0.8
- git 2.3.2
- go 1.4.2
- ghq 0.6


fishの構築
========

![Kobito.yG9kwd.png](https://qiita-image-store.s3.amazonaws.com/0/4943/5cd6ec85-0654-04eb-03c1-f792115e6a72.png "Kobito.yG9kwd.png")



[fish shell](https://github.com/fish-shell/fish-shell/)のインストール
--------------

`fish`を`brew`でインストールします。


```shell
$ brew install fish
$ fish -v
fish, version 2.1.2
```

[oh-my-fish](https://github.com/oh-my-fish/oh-my-fish)のインストール
--------------

`oh-my-fish`をインストールします。

```shell
$ curl -L https://get.oh-my.fish | fish
```


`fish`のコンフィグファイルは以下のパスになります。`bash`や`zsh`の慣例と異ります。

`~/.config/fish/config.fish`

`oh-my-fish`をインストールすると`fish`のコンフィグファイルを置き換えます。
内容は以下のようになります。シンプルですね。

```shell
$ cat ~/.config/fish/config.fish
# Path to Oh My Fish install.
set -gx OMF_PATH $HOME/.local/share/omf

# Customize Oh My Fish configuration path.
#set -gx OMF_CONFIG $HOME/.config/omf

# Load oh-my-fish configuration.
source $OMF_PATH/init.fish
```

[agnostr](https://github.com/bpinto/oh-my-fish/tree/master/themes/agnoster)fishテーマ
-----

`oh-my-fish`の`theme`を変更します。`agnostr`というテーマを利用しています。


```~/.config/fish/config.fish 
set fish_theme agnoster
```

編集したコンフィグファイルをリロードします。

```
$ . ~/.config/fish/config.fish
```


`agnostr`は`Powerline fonts`が必要なのでインストールします。フォントをインストールしないと記号が文字化けしてしまします。

```shell
$ ghq get powerline/fonts
or 
$ git clone git@github.com:powerline/fonts.git

$ cd path/to/install
$ ./install.sh
```

インストールしたフォントを`iTerm2`に設定します。設定画面のフォント名を以下のように変更します。フォントサイズはお好みで。

![2015_04_12_15_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/690cab18-483f-a4b2-3024-6bde4fad17a1.jpeg "2015_04_12_15_10.jpg")


ドラキュラテーマ
=======


![zenorocha_dracula-theme.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/18d19a18-b837-11c7-9e3f-161d2272c235.jpeg "zenorocha_dracula-theme.jpg")

fishのテーマに加えて[Dracula](https://github.com/dracula/dracula-theme)テーマを利用しています。パステルなパープル調で妖艶に画面を飾ってくれます。多様な開発ツールのテーマに対応しているので、全体の統一感を得られるのも魅力です。


https://github.com/dracula/dracula-theme

* Code Editors
  * [Atom](https://github.com/zenorocha/dracula-theme#atom)
  * [Sublime Text](https://github.com/zenorocha/dracula-theme#sublime-text)
  * [TextMate](https://github.com/zenorocha/dracula-theme#textmate)
  * [Vim](https://github.com/zenorocha/dracula-theme#vim)
  * [Xcode](https://github.com/zenorocha/dracula-theme#xcode)
* Terminal
  * [iTerm](https://github.com/zenorocha/dracula-theme#iterm)
  * [Terminal.app](https://github.com/zenorocha/dracula-theme#terminalapp)
  * [Zsh](https://github.com/zenorocha/dracula-theme#zsh)
* Misc
  * [Alfred](https://github.com/zenorocha/dracula-theme#alfred)
  * [Chrome DevTools](https://github.com/zenorocha/dracula-theme#chrome-devtools)
  

### ダウンロード

```shell
$ ghq get zenorocha/dracula-theme
or 
$ git clone git@github.com:zenorocha/dracula-theme.git
```

### iTerm2


![1__tmux___Users_susieyy_bin__tmux_.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/764c235b-c0d9-1d48-bfc3-36f6c2778134.jpeg "1__tmux___Users_susieyy_bin__tmux_.jpg")

インストールは`itermcolors`を開いた後に、`Prfernces`のLoad Presetsで`Dracula`を選択します。


```shel
$ open ./iterm/Dracula.itermcolors
```

![全画面_2015_04_12_15_32.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/434868f8-9b28-39a5-a75e-0752030ae175.jpeg "全画面_2015_04_12_15_32.jpg")



### Alfred

お洒落でかつ視認性も高く気に入っています。

![Kobito.Qq32AF.png](https://qiita-image-store.s3.amazonaws.com/0/4943/a895ae69-b146-67f1-30e1-81911eeabc5b.png "Kobito.Qq32AF.png")


インストールは`alfredappearance`を開いた後に、`Alfred`の設定画面から`Dracula`を選択します。


```shell
$ open ./alfred/Dracula.alfredappearance
```

![2015_04_12_14_32.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/dd9b0e96-e210-531a-c2fc-c454b81d3151.jpeg "2015_04_12_14_32.jpg")


【オプション】tmux & powerlineの構築
=====

![1__tmux___Users_susieyy_bin__tmux_.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/296047f7-558f-d1d7-3bb5-e5fd815f9470.jpeg "1__tmux___Users_susieyy_bin__tmux_.jpg")


コンソールの画面分割

tmuxのインストール
------

```shell
$ brew install tmux
```

powerlineのインストール
--------

```shell
$ brew install python
$ pip install git+git://github.com/Lokaltog/powerline
$ pip install psutil
```

`tmux.conf`に`powerline`を設定します。`powerline`がインストールされてパスを確認します。以下のコマンドで`/usr/local/lib/python2.7/site-packages`にインストールされていることがわかります。


```
$ pip show powerline-status
You are using pip version 6.0.8, however version 6.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
---
Name: powerline-status
Version: 2.1.dev9999+git.1fad6f4b52e4be10f448b0e539ba61734da400fd
Location: /usr/local/lib/python2.7/site-packages
Requires:
```

パスを上記に合わせて、`tmux.conf`に追記します。

```
$ vi ~/.tmux.conf
source /usr/local/lib/python2.7/site-packages/powerline.conf
```

`Powerline fonts`が必要なのでインストールします。
`agnostr`fishテーマの項で既にインストールした場合はこの作業は不要です。

```shell
$ ghq get powerline/fonts
or 
$ git clone git@github.com:powerline/fonts.git

$ cd path/to/install
$ ./install.sh
```


【オプション】peco & z & ghqの構築
=====

![1__fish___Users_susieyy__peco_.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/5db7eeb2-8f16-9371-1049-b51cef3d2b74.jpeg "1__fish___Users_susieyy__peco_.jpg")

`peco`でコマンド履歴とディレクトリ移動先の検索を行えるようにします。まずは`peco`をインストールします。


```shell
$ brew install peco
```



履歴検索
------------

設定ファイルのプラグインの項目に`peco`を追加してバインドを定義します。`Ctrl+r`に割り当てています。

```~/.config/fish/config.fish
set fish_plugins theme peco

function fish_user_key_bindings
  bind \cr peco_select_history # Bind for prco history to Ctrl+r
end
```

編集したコンフィグファイルをリロードします。

```shell
$ . ~/.config/fish/config.fish
```


ディレクトリ移動先検索
------------

Pluginがないので自作します。

### zのインストール

`z`は`cd`で移動した履歴を保存してくれて、`z`コマンドで移動しやすくするツールです。
まずは`z`をインストールします。

```shell
$ brew install z
```

今回は保存した移動履歴を`peco`の検索対象に含めるようにして活用します。


![1__tmux___Users_susieyy_bin__tmux_.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/c04ff67e-aff0-1279-8c64-f385dfd6efcb.jpeg "1__tmux___Users_susieyy_bin__tmux_.jpg")

### ghqのインストール

リモートリポジトリを`ghq`を使って`clone`することで、`golang`のディレクトリレイアウト作法に合わせてリポジトリ（ソースコード）を管理するツールです。

`ghq`で管理することで、リポジトリのパスが自明になり、`peco`と合わせることでリポジトリのディレクトリに移動しやすくなります。


```shell
$ brew install go
$ go get github.com/motemen/ghq
```

`ghq`のお作法でダウンロードしたリポジトリ（ソースコード）は`ghq list -p`コマンドでパスを確認することができます。この一覧をディレクトリ移動先の候補として活用します。

```shell
$ ghq list -p
/Users/susieyy/src/code.google.com/p/cascadia
/Users/susieyy/src/code.google.com/p/go.tools
/Users/susieyy/src/github.com/Ahmed-Ali/JSONExport
/Users/susieyy/src/github.com/GoogleCloudPlatform/appengine-nginx-hello
...
```

### ファンクションの作成

`~/.config/fish/functions/`のディレクトリ以下に`fish`ファイルを配置すると自動的にロードされるようになります。`peco_change_directory.fish`という名前でファイルを作成しファンクションを記述します。

```~/.config/fish/functions/peco_change_directory.fish
function _peco_change_directory
  if [ (count $argv) ]
    peco --layout=bottom-up --query "$argv "|perl -pe 's/([ ()])/\\\\$1/g'|read foo
  else
    peco --layout=bottom-up |perl -pe 's/([ ()])/\\\\$1/g'|read foo
  end
  if [ $foo ]
    builtin cd $foo
  else
    commandline ''
  end
end
function peco_change_directory
  begin
    echo $HOME/Documents
    echo $HOME/Desktop
    echo $HOME/.config
    ls -ad */|perl -pe "s#^#$PWD/#"|egrep -v "^$PWD/\."|head -n 5
    sort -r -t '|' -k 3 ~/.z|sed -e 's/\|.*//'
    ghq list -p
    ls -ad */|perl -pe "s#^#$PWD/#"|grep -v \.git
  end | sed -e 's/\/$//' | awk '!a[$0]++' | _peco_change_directory $argv
end
```

`Desktop`や`Documents`, `CURRENT_DIRECTORY`などお好みでディレクトリ移動先の候補を追加します。

このファンクションは[fishのディレクトリ移動コマンド](http://qiita.com/osamu2001/items/04b0e0fb4744cfeff947)を参考にさせて頂きました。

### バインドの設定

`Ctrl+]`に割り当てています。

``` ~/.config/fish/config.fish
function fish_user_key_bindings
  bind \c] peco_change_directory # Bind for prco change directory to Ctrl+]
end
```

編集したコンフィグファイルをリロードします。

```shell
$ . ~/.config/fish/config.fish
```


【オプション】fishのプラグインを追加する
---------


お好みでプラグインを追加しましょう。

```~/.config/fish/config.fish
set fish_plugins theme git rbenv rails brew bundler gem osx pbcopy better-alias gi peco z tmux
```


最後に
=========

普段はMacBookPro15インチで解像度を2880x1800に変更して以下のような画面で開発しています。


![全画面_2015_04_12_17_27 のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/b461d7c8-e442-d381-2bc6-02e429b0375d.jpeg "全画面_2015_04_12_17_27 のコピー.jpg")

(qiitaで1MB以上のファイルをUPできなかったので75%に縮小しています)


Refs
=====

- [ターミナルマルチプレクサ tmux をカスタマイズする](http://qiita.com/b4b4r07/items/01359e8a3066d1c37edc)
- [達人に学ぶ.tmux.confの基本設定](http://qiita.com/succi0303/items/cb396704493476373edf)
- [fishのディレクトリ移動コマンド](http://qiita.com/osamu2001/items/04b0e0fb4744cfeff947)
- [tmuxとMacのクリップボードを共有する（copy-mode, vim）](http://qiita.com/upinetree/items/cd80bc7865c52091be10)
- [【Vim × tmux】Pane（tmux） - Window（Vim）の移動をシームレスに](http://qiita.com/izumin5210/items/92fd7425999980f9516d)
- [Mac OS X Mavericks で Powerline を導入して tmux で表示するまで](http://qiita.com/yewton@github/items/10359de0a9912ab3a834)