Vimshell で erl コマンドを実行する

Erlang 基礎勉強会で、Emacs 使いの方々が少し羨ましかったので、真似して MacVim 上で Vimshell から erl コマンドを実行してみました。

ちなみに、今回使用したのは MacVim-KaoriYa の 20090802 版です。

Vimshell の準備

MacVim-KaoriYa 20090802 版は、テストリリース版と異なり vimproc.vim が同梱されていないので、下記から vimproc.vim を取得します。
Shougo's vimproc at master - GitHub
取得した vimproc.vim は、/Applications/MacVim.app/Contents/Resources/vim/runtime/autoload/ 配下に設置します。*1

OSX 10.4 を利用している場合、/usr/lib 配下に libutil.dylib が存在しないため、MacVim 起動時に proc.so のロードに失敗します。*2
libutil.dylib が提供する関数は、libSystem.dylib が提供してくれるので、下記のようにシンボリックリンクを作成するなどで回避します。

ln -s /usr/lib/libSystem.dylib /usr/lib/libutil.dylib

ここまで準備できた所で、下記から Vimshell を取得します。
Shougo's vimshell at master - GitHub
取得したファイルは、~/.vim 配下などに設置します。

最後に、Vimshell の非同期実行を有効とするため、.vimrc などに let g:VimShell_EnableInteractive=1 という行を追加します。
MacVim のみで使用する場合は、.gvimrc を下記のように設定します。

" ..snip..
if has('gui_macvim')
  " ..snip..
  let g:VimShell_EnableInteractive=1
elseif has('mac')
  " ..snip..
else
  " ..snip..
endif
" ..snip..

erl コマンドを実行する

MacVim を起動し、:VimShell で Vimshell を起動します。
インタラクティブシェル*3の実行は、iexe で行います。
erl コマンドの実行を行う場合は、下記の通りです。

vimshell% iexe erl -sname foo

MacPort から erl をインストールしている場合、/opt/local/bin 配下に erl コマンドは存在しますが、MacVim.app を直接実行すると /opt/local/bin には PATH が通っていないため、erl コマンドの実行に失敗します。

その場合、/Developer/Applications/Utilities 配下にある Property List Editor を使用し、下記のような ~/.MacOSX/environment.plist を作るなどで回避できます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>PATH</key>
        <string>/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/cooldaemon/bin</string>
</dict>
</plist>

environment.plist を書き換えた場合、設定を反映させるには、ログインしなおす必要があります。

Vimshell の設定

tabstop を 8 以外に設定していると ls の出力が崩れるので /path/to/.vim/after/ftplugin/vimshell.vim に「setlocal tabstop=8」を加えます。
また、Erlang Shell で neocomplcache に頼った辞書補完とバッファ補完を行なうために、下記を .vimrc に追加します。

let g:NeoComplCache_DictionaryFileTypeLists = {
  \ 'int_erl' : $HOME . '/.vim/dict/erlang.dict'
  \}

let g:NeoComplCache_SameFileTypeLists = {
  \ 'int_erl' : 'erlang,man'
  \}

ちなみに、perlsh や irb も同様の事が可能です。

現在、調査中の内容

  • 「iexe erl」を実行した後、int_erl のバッファに必ず始めに「...」が表示されてしまうそろそろ、応答あったかな?という時点で Enter を押す*4
  • 「インサートモード > ノーマルモード > カーソル移動 > インサートモード」とするとカーソルが行末に移動してしまう最新版で対処済み。おかげで、erl コマンドを vimshell 経由で使う率が 8割を超える予感*5
  • Ctrl-G を入力するため、Ctrl-VG と入力するが、JCL に移行せずに Erlang Shell が再起動する*6

*1:PATH は環境により異なります

*2:10.6 では、不要の手順です

*3:erl, irb, mysql など

*4:あまり気にしてない

*5:かなり切実

*6:多分、erlang 側の問題