Vimはもっと外の世界につながろうプラグイン作りました

無駄に壮大なタイトルの記事ですが、内容は単純。
(それなりに)汎用な外部プロセスとの対話プラグインを作りましたというお話。


以前この記事ではVim上からGaucheのREPLといちゃいちゃするためのプラグイを紹介しました。
今回紹介するプラグインはGoshREPLプラグインを汎用化したものです。
このプラグインを利用してGaucheだけにとどまらずいろんなプログラムといちゃいちゃしましょう。


いろいろなプログラムといちゃいちゃしている例


上から順に

必要なもの

このプラグインは最初に紹介したGoshREPLを改造したものです。
リポジトリvim_goshreplのままですが、Gaucheがインストールされていなくても問題なく動作することが出来ます。
外部プロセスと通信するためにvimprocを利用しているので、かならずvimprocをインストールしてください。

設定方法


GaucheのREPLはプラグインをインストールすると自動的に使えるようになりますが
ほかのプログラムと対話するためには少し設定を書く必要があります。

ghciの設定例

"ghciとの対話環境を開く関数定義
function! Open_ghci()
  call ieie#open_interactive({
      \ 'caption'  : 'ghci',
      \ 'filetype' : 'haskell',
      \ 'buffer-open' : '12:sp',
      \ 'proc'     : 'ghci',
      \})
endfunction

"ghciを開くコマンド定義
command! -nargs=0 Ghci :call Open_ghci()

"おまけ
"ghciに対してテキストを送るコマンド定義
command! -nargs=1 GhciSend :call ieie#send_text(function('Open_ghci'), 'ghci', <q-args>)
"選択しているテキストをghciに送るキーマップ定義
vmap <F12> :call ieie#send_text_block(function('Open_ghci'), 'ghci')<CR>

設定例の中で重要なのはOpen_ghci関数の中のieie#open_interactive(...)です。
ieie#open_interactive関数が、引数で渡された設定を元に外部プロセスを起動し、別バッファを開き、読み込み、書き込み、バッファ出力...などいろいろと行ってくれます。
引数の設定を変えることで全体の動作をカスタマイズすることできます。


ついでにRuby(irb)とPython用の設定も書いておきます。

"Ruby(irb)と対話するための設定
command! -nargs=0 Irb :call ieie#open_interactive({
      \ 'caption' : 'ruby',
      \ 'filetype' : 'ruby',
      \ 'buffer-open' : '10:sp',
      \ 'proc' : 'irb',
      \ 'pty'  : 1,
      \})

"Pythonと対話するための設定
command! -nargs=0 Python :call ieie#open_interactive({
      \ 'caption' : 'python',
      \ 'filetype' : 'python',
      \ 'buffer-open' : '10:sp',
      \ 'proc' : 'python',
      \ 'pty'  : 1,
      \})

設定を見てみると、caption/filetype/procがそれぞれの環境向けに変更されているのがわかると思います。
実際、別な環境向けの新しい設定を作成するときに変更するのはこの三つぐらいでしょう。
ですが一つだけptyという設定が増えています。irbpythonに関してはpty設定がないと正しく動作しません。
新しい設定を作成してみるときはまずはptyなしで確認してみて、起動後何も表示されないようならptyを追加して試してみてください。


最後にちょっとだけ

このプラグインは前回紹介したviseで書いています(もともとVimScriptだったのを書き直しました)。
viseでどのようにプログラムが組めるのかという例としてもちょこっと見てやってください。