Vagrant with Sublime Text on Mac or Windows

===========================================

[Sublime Text](http://www.sublimetext.com/)で嬉しいのはMacやWindowsで利用できることです。
両方のOSで使うなら操作を合わせた方がなにかと便利です。

まずはMacとWindowsのキーバインドをできるだけ合わせます。
([KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja)や[Change Key](http://satoshi.web5.jp/f_soft/dw_win.htm)などを利用します。)

次にGitやPython,Ruby,Node.jsを利用するので、WindowsでUNIXシェルを使えるようにします。
([Cygwin](http://www.cygwin.com/)や[MSYS](http://www.mingw.org/wiki/MSYS)を利用します。それにしてもMacのターミナルは圧倒的に使いやすいです。)

さらにMySQL,Redis,MongoDB,RabbitMQなどミドルウェアを利用するのにWindowsでもよいのですが
非公式だったり最新版がない場合があるのでパッケージの管理が簡単なLinuxにミドルウェアを任せます。
(SSHで接続できるLinuxならグローバルでもローカルでもなんだっていいです。)


今回はVagrantとSublime Textを利用してMacとWindowsの環境を作ります。
大筋はMacとWindowsで利用できる[Vagrant](http://www.vagrantup.com/)で[VirtualBox](https://www.virtualbox.org/)を操作して
ホストOSのSublime TextとゲストOSの[Ubuntu](http://www.ubuntu.com/)でファイルを連携します。


**XcodeやVisual Studioのエディタ・ドリブンが好きなので、OSを意識することなく
エディタを中心に作業がしたいです。**


# Mac

OS XはUNIXベースなので簡単に環境が作れます。
(仮想イメージのダウンロード時間を除けば作業時間は10分程度です。)

## 環境

* Mac OS X Lion
* VirtualBox 4.2.6
* Ruby 1.9.3-p374
* Vagrant 1.0.6

## Vagrant

VirtualBoxの[Downloads](https://www.virtualbox.org/wiki/Downloads)から`for OS X`をインストールします。
GemでVagrantをインストールして、仮想マシンのイメージを追加します。

```bash
$ gem install vagrant
$ vagrant box add precise64 http://files.vagrantup.com/precise64.box
[vagrant] Downloading with Vagrant::Downloaders::HTTP...
[vagrant] Downloading box: http://files.vagrantup.com/precise64.box
[vagrant] Extracting box...
[vagrant] Verifying box...
[vagrant] Cleaning up downloaded box...
```

precise64はUbuntu12.04(64bit版)の仮想マシンのイメージです。

## Virtual Machine

仮想マシンのディレクトリを作り、`vagrant init`コマンドに仮想マシンのイメージを指定します。
`vagrant up`コマンドで仮想マシンを起動して、`vagrant ssh`コマンドでログインします。
（`Vagrantfile`を編集すれば[chef](http://www.opscode.com/chef/)などの素敵な仕組みが利用できます。）

```bash
$ mkdir ubuntu12.04
$ cd ubuntu12.04
$ vagrant init precise64
$ vagrant up
$ vagrant ssh
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-23-generic x86_64)
vagrant@precise64:~$ mkdir notes
```

ホストOSに連携するディレクトリをゲストOSにあらかじめ作成します。
(ゲストOSは***vagrant@precise64:~$***と記します。)


## Sublime Text

仮想マシンとファイルを連携するのに[Sublime SFTP](http://wbond.net/sublime_packages/sftp)を利用します。
**Sublime SFTPは有料($16)のプラグインです。**

```bash
$ mkdir notes
$ touch notes/foo
$ subl notes/
```

ちなみに`subl`コマンドはSublime TextのCLIです。

### sftp-config.json

Sublime Textのサイドバーの`SFTP/FTP -> Map to Remote`で**sftp-config.json**ファイルを出力します。
`host`,`user`,`port`,`ssh_key_file`,`remote_path`の値をVagrantと連携するように編集します。

```json
{
    "type": "sftp",

    "save_before_upload": true,
    "upload_on_save": true,
    "sync_down_on_open": false,
    "sync_skip_deletes": false,
    "confirm_downloads": false,
    "confirm_sync": true,
    "confirm_overwrite_newer": false,
    
    "host": "127.0.0.1",
    "user": "vagrant",
    "port": "2222",
    "ssh_key_file": "~/.vagrant.d/insecure_private_key",

    "remote_path": "/home/vagrant/notes",
    "ignore_regexes": [
        "\\.sublime-(project|workspace)", "sftp-config(-alt\\d?)?\\.json",
        "sftp-settings\\.json", "/venv/", "\\.svn", "\\.hg", "\\.git",
        "\\.bzr", "_darcs", "CVS", "\\.DS_Store", "Thumbs\\.db", "desktop\\.ini"
    ],
 
    "connect_timeout": 30,
 }
 ```

## Sync

ファイルを同期は特に意識しなくてもSublime Textで編集を保存するだけでゲストOSに自動で反映されます。
（`upload_on_save`の`true`が保存で同期する設定です。）


Sublime Textでfooファイルにberと入力して保存すると、ゲストOSの指定したディレクトリにfooファイルが作成されます。

```bash
vagrant@precise64:~$ cat notes/foo 
ber
```

VirtualBoxの共有フォルダーをマウントする機能もあるのですが
ファイルディスクリプタなど使い難かったのでSFTPにしました。

----

# Windows

WindowsはUNIX,Linuxとは違い独特な所があるので合わせるのに工夫が必要です。
(仮想イメージのダウンロード時間を除けば作業時間は20分程度です。)


## 環境

* Windows 7
* VirtualBox 4.2.6
* Ruby 1.9.3-p374
* Vagrant 1.0.6


## Mintty

ターミナルはMacと同じ様に背景の透過ができる[Mintty](http://code.google.com/p/mintty/)を使います。
Unixシェルは[Cygwin](http://www.cygwin.com/)ではなく[MSYS](http://www.mingw.org/wiki/MSYS)を使います。
[MinGW](http://www.mingw.org/)の[Downloads](http://sourceforge.net/projects/mingw/files/)から`mingw-get-inst`をインストールします。
MinGWのシェルで`msys-mintty`をインストールします。

```bash
$ mingw-get update
$ mingw-get upgrade
$ mingw-get install msys-mintty
```

`mintty.exe`のショートカットを作成してリンク先(T)に` /bin/bash --login`を追記します。
(`mintty.exe`は`\MinGW\msys\1.0\bin\`にインストールされます。)

### mintty設定

minttyを起動してオプションを設定します。

なるべくMacと同じフォントを使いましょう！
例では[Ricty](http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/ricty.html)のフォントを設定しています。

```
Looks:Transparency = High
Text:Font = Ricty,14-point
Text:Locale = C
Text:Character set = UTF-8
```

## Vagrant

VirtualBoxの[Downloads](https://www.virtualbox.org/wiki/Downloads)から`for Windows`をインストールします。
Rubyは[Ruby for Windows](http://rubyinstaller.org/)で安定版をインストールします。

```bash
$ gem install vagrant
$ vagrant box add precise32 http://files.vagrantup.com/precise32.box
```

precise32はUbuntu12.04(32bit版)の仮想マシンのイメージです。

## Virtual Machine

Macと同じ様に`vagrant up`コマンドで仮想マシンを起動して、`vagrant ssh`コマンドをすると
`vagrant ssh`コマンドはWindowsでは使えないと***悲しい***メッセージが表示されます。

```bash
$ mkdir ubuntu12.04
$ cd ubuntu12.04
$ vagrant init precise32
$ vagrant up
$ vagrant ssh
`vagrant ssh` isn't available on the Windows platform.
```

### ssh

`ssh`コマンドは使えるのでsshでログインはできるので後は接続情報があれば
と思ったら`vagrant ssh-config`コマンドがありました。(さすがっす！)

```bash
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ...
```

### alias

sshのオプションにファイルを指定するエイリアスを作成します。
`vagrant-ssh`コマンドになりましたが、これでログインできます。

```
$ vagrant ssh-config > .ssh-config
$ echo 'alias vagrant-ssh="ssh default -F .ssh-config"' >> ~/.bash_profile
$ source ~/.bash_profile
$ vagrant-ssh
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-23-generic-pae i686)
vagrant@precise34:~$ mkdir notes
```


## Sublime Text

後はSublime SFTPでゲストOSと連携と思ったらWindowsの秘密鍵はPuTTYと[FAQ](http://wbond.net/sublime_packages/sftp/faq)に記載されています。

Vagrantの秘密鍵を[PuTTY Key Generator](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)でコンバートします。
(Vagrantの秘密鍵を探すのが面倒ならCドライブの直下にコピーすると便利です。)

```bash
$ cat ~/.vagrant.d/insecure_private_key > /c/insecure_private_key
```

### sftp-config.json

Macとは`ssh_key_file`の値だけが違います。

```json
{
    "type": "sftp",

    "save_before_upload": true,
    "upload_on_save": true,
    "sync_down_on_open": false,
    "sync_skip_deletes": false,
    "confirm_downloads": false,
    "confirm_sync": true,
    "confirm_overwrite_newer": false,
    
    "host": "127.0.0.1",
    "user": "vagrant",
    "port": "2222",
    "ssh_key_file": "C:\\Users\\user\\.ssh\\vagrant.ppk",

    "remote_path": "/home/vagrant/notes",
    "ignore_regexes": [
        "\\.sublime-(project|workspace)", "sftp-config(-alt\\d?)?\\.json",
        "sftp-settings\\.json", "/venv/", "\\.svn", "\\.hg", "\\.git",
        "\\.bzr", "_darcs", "CVS", "\\.DS_Store", "Thumbs\\.db", "desktop\\.ini"
    ],
 
    "connect_timeout": 30,
 }
 ```


## Sync

これでMacと同じ様にSublime Textでファイルを編集して保存すると、ゲストOSの指定したディレクトリにファイルが同期されます。

```bash
vagrant@precise32:~$ cat notes/foo 
ber
```

[Browser Refresh for Sublime Text 2](http://gcollazo.github.com/BrowserRefresh-Sublime/)など自動で再起動してくれる
アプリケーションを組み合わせるとさらに作業が楽になります。

# Tips

Windowsでも[msysgit](http://msysgit.github.com/)をインストールすると[Sublime Text 2 plugin: git](https://github.com/kemayo/sublime-text-2-git)でSublime Textから
ブランチを切替えたり`commit`や`push`が使えるので便利です。