開発環境で今年変えてみたこと

私の開発環境に関して今年変えてみたことや知ったことをまとめてみたいと思います。


ターミナルから他のアプリケーションを起動する
-----

### よく使うコマンド

私は作業を始めるときに、まずターミナルにて対象システムのディレクトリへ移動します。
そして、そこからGitを操作するSourceTreeやIntellij IDEAを起動します。
そのための`alias`が以下です。

```bash
# gg は以前は git-guiをこのaliasで起動していた名残
alias gg='open -a SourceTree.app'

alias idea='open -a IntelliJ\ IDEA\ CE.app'
```

使い方は以下の通りです。

```bash
$ cd myapp

# このディレクトリのプロジェクトをIntellij IDEAで開く
$ idea .

# このディレクトリのgitリポジトリをSouceTreeで開く
$ gg .

# このディレクトリをFinderで開く
$ open .
```

OSXの `open`コマンドはファイルを開く・アプリを起動するといった"開く"(Finder上で`command + o`)操作を行うコマンドです。
このコマンドは、引数のファイルやディレクトリを`-a`オプションで指定したアプリで開くことができます。
また、アプリを指定しなかった場合は対象がディレクトリであればFinderを開くことができます。
これの起動方法のおかげで、アプリを起動してからアプリ内で対象ディレクトリを開く操作を省くことができます。

### openコマンドで特殊な起動

ついでに`open`を使ったtipsをもう少し。

`open`を使うことでアプリの起動時に引数を渡すことができます。
例えば、Google Chromeは起動時の引数に`--app="<URL>"`と指定すると、
Chromeのウインドウをアプリモード(タブバー、アドレスバーが表示されないモード)で起動できます。
これを使うことで、GmailやChatworkといったアプリ的なWebサイトをデスクトップアプリのように使えます。

```bash
open -n -a "Google Chrome.app" --args --app="https://www.google.com/"
```

### vimからFinderを開く

Vimでファイルを編集しているときに、以下のコマンドでそのファイルが存在するフォルダをFinderで開くことができます。

```
:!open %:h
```

Exコマンドで`!`にて外部コマンドとして`open`を実行します。`%:h`が現在のファイルのディレクトリに展開されます。


Git関連
--------

### gitコミットコメントをMacVimで記述する

以下の環境変数でGitでのコミットコメント記述には`vim`を使っていたのを`MacVim`に変えました。
今までもそうしたかったのですが、mvim起動時に"-f"オプションをつけなければいけないことを知りませんでした。

```bash
# mvim : MacVim起動用コマンド。vimコマンドのMacVim版
#   -f or --nofork フォアグラウンド: GUIを始めるときにforkしない
export EDITOR="mvim -f"
```

### Gitのログを見やすい形式で取得する

アプリのCHANGELOGを書くときに以下のコマンドでgitログを取得すると整理しやすいです。

```bash
$ git log --graph --stat --topo-order origin/master..HEAD | mvim - # パイプ先はお好きなエディタを。
```

こうすると以下のようにfeatureブランチがメインブランチにマージされる流れがわかりやすい表記になります。
この中でメインブランチへの結合点の内容をピックアップしていくとCHANGELOGを作成できます。

```
*   commit ded5a3beee8a11fecd4866bace35038c16c5158e
|\  Merge: 383085d a1e72b3
| | Author: namutaka <namutaka+g@gmail.com>
| | Date:   Sat Aug 20 16:37:57 2016 +0900
| |
| |     Merge branch 'feature1'
| |
| * commit a1e72b31b5651c0feb848bd816d4b0a3969fa8d1
|/  Author: namutaka <namutaka+g@gmail.com>
|   Date:   Sat Aug 20 16:37:21 2016 +0900
|
|       Add something
|
|    example/somefile.js         | 15 ++-------------
|    1 files changed, 10 insertions(+), 28 deletions(-)
|
* commit e1061dd7784518c57424ac2828ad6bf426ea5138
  Author: namutaka <namutaka+g@gmail.com>
  Date:   Sat Aug 13 15:58:08 2016 +0900

      Improved something
```


SSH接続
--------

`sshrc`というツールの紹介記事を見つけて導入してみたのですが、地味に便利でした。

* 紹介記事
  * http://weboo-returns.com/blog/sshrc-for-custom-bashrc-tmuxconf-vimrc/

sshrcは、手元の環境に以下のようなファイルを用意しておけば、sshrcコマンドでssh接続したサーバー内でこのファイルを自動で読み込んで(source)してくれます。
これによって、接続先のサーバー１つ１つに個人の環境設定を行わなくてもよくなります。

```bash:$HOME/.sshrc
# alias
alias ll='ls -l'
alias la='ls -la'
alias rm='rm -i'
alias grep='grep --line-buffered'

# プロンプトにサーバー名を表示
export PS1="[\u@\h \W]\$ "

# vim
# 手元で $HOME/.sshrc.d/.vimrc というファイルで vim設定を用意しておく
export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"
which vim > /dev/null 2>&1 && alias vi=$(which vim)
```

sshrcはsshコマンドの代わりに使うのですが、私はaliasでsshrcをsshとして使うようにしています。

```bash
# sshrc
alias ssh='sshrc'
```

注意として、sshrcでは接続先側でコマンドを実行させたい場合にsshから帰ってこない場合があるので、適宜aliasなしのsshと使い分ける必要があります。

```bash
# ssh を sshrcとする
$ alias ssh='sshrc'

# sshでサーバー内でコマンド実行した結果を取得
$ ssh server1 grep "info" app.log
→ このとき、grepを実行したあとでsshが終了せずサーバーに入ったままになる

# そういう時は、コマンド前に"\"を記述してaliasなしでのsshコマンド実行をする
$ \ssh server1 grep "info" app.log
```


Vim
--------

知っているひとには今更なことがいくつかあると思いますが、まとめておきます。

### 標準入力をUTF-8として開く

vimでは何らかのコマンドの結果をパイプして開くときに、文字コードが latin1 になって文字化けてしまいます。これを回避するために以下の設定を入れました。

```vim:.vimrc
"" 標準入力はUTF-8と見なす
autocmd StdinReadPre * set fileencodings=utf-8
```

使い方

```bash
$ echo "あいう" | vim - # UTF8で開くようになった
```


### 一括で連番を作る

数字の連番を一括で作るのを、`g<C-a>`、`g<C-x>`でできることを知りました。

詳しい説明は以下の記事を参照ください
http://vim-jp.org/blog/2015/06/30/visual-ctrl-a-ctrl-x.html


### vim-quickrunを非同期で実行する

編集中のスクリプトをその場で即座に実行できるという非常に便利なvimプラグインの[vim-quickrun](https://github.com/thinca/vim-quickrun)を以前から使わせていただいています。
ですが、最初にあまり詳しく調べなかったもので、非同期で実行できるのを今更知りました。
vim-quickrunに関する設定は以下のような感じなのですが、`"'runner/vimproc/updatetime' : 60"`という部分を指定することでVimの操作を止めずに実行できるようになりました。

```vim:.vimrc
vim-quickrun
" QuickRun {{{
Plugin 'thinca/vim-quickrun'

let g:quickrun_config = {}
let g:quickrun_config['_'] = {
\  'split' : '',
\  'runner' : 'vimproc',
\  'runner/vimproc/updatetime' : 60
\}
```


### Unite のファイル検索を ag(The Silver Searcher) を使う

Vimの操作を補助してくれる [unite.vim](https://github.com/Shougo/unite.vim)の検索を、[ag](https://github.com/ggreer/the_silver_searcher)を使うようにしました。
設定方法はどなたかの紹介記事からそのままなのですが、どこだったかを忘れてしまいました。
設定としては以下のような感じです。

```vim:.vimrc
Plugin 'Shougo/unite.vim'

" The prefix key.
nnoremap    [unite]   <Nop>
nmap    <C-q>  [unite]

" grep検索
nnoremap <silent> [unite]g  :<C-u>Unite grep:. -buffer-name=search-buffer<CR>
" カーソル位置の単語をgrep検索
nnoremap <silent> [unite]gr :<C-u>Unite grep:. -buffer-name=search-buffer<CR><C-R><C-W>
" grep検索結果の再呼出
nnoremap <silent> [unite]gg  :<C-u>UniteResume search-buffer<CR>

" unite grep に ag(The Silver Searcher) を使う
if executable('ag')
  let g:unite_source_grep_command = 'ag'
  let g:unite_source_grep_default_opts = '--nogroup --nocolor --column'
  let g:unite_source_grep_recursive_opt = ''
endif
```


### テキスト整形を Align から easy-align に切り替えた

これまで、CSVなどを区切り文字に沿って表形式に整形するのに[Align](http://www.vim.org/scripts/script.php?script_id=294)を使っていました。
ですが、最近になって類似の物がないかを調べて[vim-easy-align](https://github.com/junegunn/vim-easy-align)に変えてみました。

Align で十分使えていたのですが、以下のような点で少し不便さを感じていました。

  * 処理がやけに遅い(行が増えると顕著)
  * 整形後にカーソルが変な位置に飛ぶ
  * Markdownの表組みのような先頭と終端に区切り文字がある場合に整形後に先頭と終端に空白が入る

そこでeasy-alignに変えてみたところ、概ね上記の問題が解消しました。

公式の説明では、以下の interactive mode での起動を最初に紹介していますが、使い方がVimとしては独特なのでちょっと操作に慣れるまで戸惑いそうです。

```vim:.vimrc
nmap ga <Plug>(EasyAlign)
xmap ga <Plug>(EasyAlign)
```

それよりも、Exコマンドとして使う方がVim的な感じで使いやすそうな気がします。
範囲選択後に`:EasyAlign */<区切り文字>/[Enter]`で整形できます。