Macを使うにあたっての落とし穴回避(Linuxユーザ向け?)

どうもこんばんわ。Macユーザです。  

Macは素敵なマシンだと思いますが、そのまま何も考えずに使うとハマることが多々あります。  
なまじ基本的なUnix環境が揃っていたりするあたり、特にLinuxユーザの方の場合は微妙な違いや妙な動作に
イライラすることがあるかもしれません。  
当エントリでは、それらのうち僕がハマったいくつかと、その対処法についてまとめようかと思います。

`# 6/18 virtualenvについてを追加`
`# 6/21 iterm編追加`
`# 7/17 MacVim編に追記`


なお、僕の使うツール類などは

 - homebrew

 - iTerm2

 - vim

 - zsh

 - tmux


で、僕は主にPythonを使って開発をしています。  
また、各ツールの導入やなんかは他にいくらでも記事があるので割愛します。


## homebrew編 ##

ググって導入用のスクリプトを叩いてください。  
なお、formulaごとのオプションや有用な忠告がみれたりするので、導入パッケージについてはこまめに`brew info`するくせをつけると良いかもしれません。

~ homebrew編終了 ~

  

## iTerm2編 ##

iTermの方が色々いい感じっぽいのでiTermを使います。
公式からインストールしてください。

#### 暴発しやすいキーを無効化 ####

恐らく、皆さんは常時CUIを立ち上げていると思います。
なので`⌘+w`は、暴発を招いてモニターを殴りつける原因になるだけの邪悪なキーバインドです。消しましょう。
メニューから、`Preference -> Keys`を開きます。Global Shortcut Keysに⌘+wや⌘+qとかを追加して、ignoreにしておきましょう。

#### metaキーの有効化 ####

Macは、Altとあわせていろんなキーを叩くことで、わけわかんない記号を出せます。
コーディング中に記号達の出番はほぼないので、折角だしmetaキーとして使えるようにします。これでemacserの貴方も安心ですね。

`Preference -> Profiles` で貴方の使いたい設定を開きます。
よくわかんないって言う人は、とりあえずsolarizedでググってiTerm2用のテーマをImportするといいと思います。  
あとはKeysを開いて、`Left option key acts as:` を+Escにします。

端末を再起動してみましょう。alt+dで単語を削除とか、そういった感じで動くと思います。
やりましたね！

  

## zsh編 ##

zshじゃないと生きられない身体にされてしまっているので、zshを導入します。  
ただし、Appleが標準で`/etc`以下に用意しているくそったれのzshスクリプトが悪さをするので、そいつをどうにかしないといけません。

自分で直接`/etc/zshenv`を書き換えるか、`brew install --disable-etcdir zsh`としてインストールするか、どちらかで対処しましょう。  
上記の詳細は`brew info zsh`とすればそれなりに丁寧に書いてあります。

導入が完了したら、http://tukaikta.blog135.fc2.com/blog-entry-195.html あたりを参考にしてログインシェルを変更してください。
  

次に、zshの補完関数群をロードするようにします。  
`brew install zsh-completions`で導入出来ます。次にfpathの設定を行います。

```zsh
fpath = (
        #zsh-completions
        /usr/local/share/zsh-completions(N-/)

        #homebrew
        /usr/local/share/zsh/functions(N-/)
        )
export fpath
```

上記みたいな感じです。  
気になる人はbrew --prefixとか使いましょう。  
古いエントリなどでは、brew用の補完関数などを別途シンボリックリンクで持ってきたりしていますが、現在ではzsh-completionsにいいやつが存在するので無用です。
  


## 基本コマンド編 ##

MacOSに標準で入っているコマンドは、古いBSD由来のものらしく、オプションが違ったり挙動がおかしかったりと大変ストレスなので入れ替えましょう。

"openssl", "readline", "git", "coreutils", "gnu-sed", "wget", "gawk", "ctags", "sl"あたりは導入しておきましょう。


上に書いたcoreutilsですが、普通に入れるとgを接頭につけたコマンド名を打つ必要が出てきます。  
`brew info`を参考に、PATHとMANPATHの設定を行います。  
また、ついでにhomebrewのツールを優先するようにしましょう。

```zsh

BREW_PATH=`/usr/local/bin/brew --prefix`
typeset -U path
path=(
    # 自分のスクリプトとか、自分でビルドしたやつとか
    $HOME/Dropbox/bin/mac(N-/)
    $HOME/Dropbox/bin(N-/)
    $HOME/bin(N-/)

    # homebrewで導入したのを優先させる
    $BREW_PATH/bin(N-/)

    ## homebrewでpythonを入れると同時にpipも入れてくれる
    ## 下記のPATHに入る、が、コマンドに関しては/usr/local/binに自動でシンボリックリンクを
    ## 張ってくれるようになったので以下は追加しなくて良くなったっぽい。詳しくはbrew info python
    #$BREW_PATH/share/python(N-/)

    #デフォルトのコマンドをGNUコマンドで
    $(brew --prefix coreutils)/libexec/gnubin(N-/)

    /usr/bin(N-/)
    /bin(N-/)
    #sbin
    /usr/local/sbin(N-/)
    /usr/sbin(N-/)
    /sbin(N-/)
    )
export path

alias sed='gsed'
```

最初の部分とかはお好みでやってください。  
とりあえず、coreutilsを優先させることで挙動やオプションがGNUのものと同等になるはずです。  
これでLinuxで動いたシェルスクリプトが動かねー！ なんてこともなくなりますね（多分）
  


## tmux編 ##

iTerm2をはじめ、Macの端末エミュレータはtmux上ではクリップボードとうまく連携出来ないようです。  
これはVimを使っていて、`set clipboard=unnamed`を有効にしていると、MacVimを含めて端末のVimは一切ペーストが出来ないという悲劇的な状況を生み出します。

上記を回避するために`reattach-to-user-namespace`をbrewからインストールしてください。  

次に、上記ツールと連携した状態でtmuxを起動するためのスクリプトを https://gist.github.com/elasticdog/1462391 あたりを参考に導入してください。

最後に、"tmux save-buffer - | reattach-to-user-namespace pbcopy" とか "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"
といった動作を、tmuxの適当なバインドにひっつけておけばtmuxのレジスタをクリップボードと連携させることも可能です。

あとそういえば、iTerm用に調整されている感じのtmuxがあったりしますが、あんま意味なさそうな感じなんでhomebrewのでいいと思います。
  
　　

## Python編 ##

Mac標準のPythonはよくないのでbrewで入れましょう。
homebrewで入れたopensslを使わせたいので`brew install python --with-brewed-openssl`と明示的に指定しておきます。

### virtualenv編 ###

素のままでvirtualenvを使うと、MacデフォルトのPythonが優先されたりと具合が悪いのでごにょごにょします。

まず、上記の基本コマンド編で行ったPATH設定によって、homebrewのpythonとpipが優先されていることを確認します。
`which python` `which pip`

次に、virtualenvとvirtualenvwrapperを入れます。僕はpip使うマンです。

導入後、.zprofileに以下の設定を書き込んでください。

```zsh
# --- virtualenv
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages --python=/usr/local/bin/python'
## virtualenv should use Distribute instead of legacy setuptools
# setuptoolsが更新されたようなので
#export VIRTUALENV_DISTRIBUTE=true
source /usr/local/bin/virtualenvwrapper.sh
#--- pip
# cache pip-installed packages to avoid re-downloading
export PIP_DOWNLOAD_CACHE = $HOME/.pip/cache
```

なお、本来は`VIRTUALENVWRAPPER_PYTHON`を設定すればよしなにしてくれるっぽい気がするのですが、何故か頑に標準のpythonを使いたがるので別途`VIRTUALENVWRAPPER_VIRTUALENV_ARGS`で明示的に設定しています。
ちなみに私のpython戦闘力は農民クラスなのでおかしいところがあったら突っ込んでください。

書き込んだら、zshの設定をリロードしましょう。
  
　　

## Vim編 ##

自分でビルドしてもいいですが、僕はヘタレなのでbrewのを使います。  
`brew install vim --override-system-vi --with-lua --with-ruby --with-python --with-python3`
としておきましょう。勿論、luaやrubyやpython3も先に導入しておきます。特にluaは、最近導入が活発なので入れておくと良いのではないでしょうか。


### MacVim編 ###

以前のMacVimはPythonスクリプトがクラッシュしていたのですが、最新版を入れることで正常に動くようになりました。
また、ShougoWareのif_lua高速化の恩恵を受けるためにも一番いいのを入れましょう。
`brew install macvim --with-lua`
とします。
また、いつの間にかbrewの標準フォーミュラでもluajitがサポートされているようなので、入れたい方は`--with-luajit`としましょう。

詳しいところはこちらのブログ様を参考にしてください。
[最新パッチ＆if_luaなMacVimで高速検索＆補完！](http://supermomonga.com/2013/07/03/macvim-with-lua-features/)

あと、MacVim-Kaoriyaのバイナリもif_lua付きのバイナリが更新されてたりしたんで、そっちでもいいかもしんないですね。


  　

## 最後に ##

思いつつままに適当にあげてみたので、今後追加や修正があるかもしれません。