slimv

先月はガベコレ当番だった。この地では約2年に一度の割合で(リアルな)ごみ箱の回りの 清掃当番が割り当てられるようだ。任期は1ッ月。ごみ回収車が回収しなかったごみを分別 したり、缶とかペットボトル用のボックスを用意したりするのが任務。

この業務から開放されたと思っていたら、今度は任期1年の組長さんを拝命しちゃったよ。 組長さんの任務は、みかじめ料の取立てと、お上からの御触れを組員に配布する事。

前組長さんの話では、みかじめ料の取立てが大変との事。渋る人がいるらしい。上部団体の 遊興費に使われるんじゃ、たまったもんじゃないよね。そんなんで渋るらしい。

はて、どうなりますやら? 今年一年、憂鬱なスタートとなってしまいました。 せめて仮想世界で楽しく遊びましょっと!

slimv

どうもquackとslimeの相性が悪いみたいで、両方をenableにすると、slimeの方でエラーが出てしまう ようだ。最初それに気がつかずに随分悩んだけど、何とか履歴を辿って原因に行き着いた。

そんな訳なんで、lispでもclojureでもschemeでもまとめて面倒見ちゃうと言う slimv.vim : Superior Lisp Interaction Mode for Vim (SLIME for Vim) ってのを試してみる。これ、去年からの積み残しなんだけどな。。。

動かすにはvimが入るとな。それもPythonを呼び出せるように準備されたやつとな。vimと言えば、 2011年テキストエディタ界の動向まとめと、来年次のvimエディタ普及に向けた対策資料 なんてのが上がっていたし、いまさら聞けないVim なんて言うシリーズ物も出てたから、ちょいと遊んでみるにはいいかも。

性懲りも無く、Windows7でやってみる。KaoriYaさんの 所から落としてきたgvimを使う事にする。

落としてきたslimvXX.zipを、_vimfiles の中に放り込む。それから徐に、docの下の説明書に 目を通す。その結果分かった事は、_vimrc に、起動コマンドを書いておけとな。

lisp

そんじゃ、早速sbclを動かしてみるか。vimrcの設定は次のようにした。

set nobackup
let lisp_rainbow = 1
set guioptions-=T
set runtimepath+=~/_vimfiles/

filetype plugin on
filetype indent on
let g:slimv_python = 'C:/Python27/python.exe'
let g:slimv_swank_cmd = '!start "C:\app\sbcl-1.0.51\sbcl.exe" --load "C:\homes\.emacs.d\slime\start-swank.lisp"'

バックアップを取らないよ、括弧コッカの色付けは鮮やかに、お仕着せなツールバーは要らない子、 vimのコマンド群が入ってる検索パスに個人用のやつを追加。

ファイルタイプによってコマンドやインデントの制御が出来るように設定。蛇が住んでる場所を 明示するよ。(自動検出するみたいだけど)そして、sbclを使ってslimeサーバーを起動する 方法を指示。

こんな感じで良いはずなんだけど、エラーになってしまう。SlimvInitBufferと言う関数が無い んだって。そんな事言われたって、どうやって調べたらいいのやら。。。。FAQが出てた。

- Q: The Slimv plugin is not loaded for a .lisp (or .clj, etc) file.
- A: Filetype plugins should be enabled, check it via the :filetype command.
     If needed, put this in your .vimrc file:
         filetype plugin on
         filetype indent on
     You can check the scripts loaded with the :scriptnames command,
     filetype.vim and ftplugin.vim should be listed in order to load other
     filetype plugins.
     The source buffer filetype should be lisp (or clojure, etc), check it via
         :set ft?
     The Slimv files should be in Vim's runtime path, check the path via
         :set rtp?
     slimv.vim should be in the ftplugin directory in the runtimepath,
     there should be an ftplugin/lisp subdirectory containing slimv-lisp.vim.
     Also make sure that no other ftplugin/lisp.vim is loaded that prevents
     loading of the Slimv scripts.

scriptnamesなんて言うコマンドがvimにあるのね。こやつで調べてみると

 39: ~\_vimfiles\ftplugin\lisp\slimv-lisp.vim

こんな具合にSlimvInitBufferが定義されてるslimv.vimは読み込まれていなかった。しょうがない ので、つらつらとslimv-lisp.vimを見て、冒頭部分をコメントアウトしたよ。更にしつこく、slimv.vim の冒頭もコメントアウト。

"  Load Once:
"if exists("b:did_ftplugin")
"    finish
"endif

これ、2重起動防止策なんで、複数のLispファイルを読み込んじゃうとおかしな事に なりそうだけど、まずは動かさないと始まらないのでしばし眼を瞑る事にする。

これでやっとgvimのメニューにslimvの項目が出てきた。続いてreplの所からconnectすると 、暫く待った後で、画面が割れてREPLが出てきた。

SBCL 1.0.51.33.mswinmt.950-b168a3f  Port: 4005  Pid: 9908
; SWANK 2011-09-13
CL-USER> (* 123 456) 
56088
CL-USER> 

REPL画面でマウスをクリックしてカーソルを移し、インサートモードに切り替えてからS式を 入力。リターンを叩くとS式がsbclに送られて、評価結果が返ってくる。どうやら動き出した みたいだ。関数名の補間も効いて、とっても楽ちん。

clojure

次は、clojureだな。swank-clojure.batは、以前 lein plugin install slime して遊んだ時に 出来上がっていた起動用バットを使う。こやつ辺鄙な所に隠れていたよ。下記を_vimrcに 付け足した。

let g:slimv_swank_clojure = '!start "C:\Users\sakae\.lein\bin\swank-clojure.bat" ' 

が、動かないんだ。大体、スクリプトであるslimv-clojure.vimを読み込んでいない。感を働かせて ftdetect/clojure.vimを見てみる。

au BufNewFile,BufRead *.clj setf clojure

これって、*.clj と言うバッファーが作られた時か読み込まれた時にアクションを起すって 事だな。システムワイドなfiletype.vimに追加すれば、嫌でも読み込んでくれるだろう。 後は、Lispの時と同じように、ftplugin/clojure/slimv-clojure.vimの冒頭をコメント アウトした。

そしたら、動き出したよ。正月早々、疲れるわい。

scheme

お次はschemeだな。代表にgaucheを選んでみる。ネットをうろうろしてたら有志の方が swank-gaucheなんてのを公開してくれていたから。 それに、こんなのも

"Gaucheはハワイ製なので放射線の影響は少なくRubyより安全らしい"

github上にあるswank-gauche.scmはモジュールになっているので、shareの中のsite中に入れてから 下記のような簡単な起動スクリプトを書いた。

;;;; gauche slime for vim
(use swank-gauche)

;;; To start a server do:
(start-swank (swank #f))

そして、そのスクリプトを叩く設定を、_vimrcに追加した。

let g:slimv_swank_scheme = '!start "C:\app\Gauche\bin\gosh.exe"  "C:\app\Gauche\bin\run-gauche.scm"' 

起動すると、別ターミナルが開いて

Listening on port: 127.0.0.1:4005
Client:127.0.0.1:63853 Start

gauche側の準備が整った事を確認出来るんだけど、gvim側にはREPLが開かない。意思の疎通が どうも出来ないみたいだ。コードを調べろって言われそうだけど、おいらちょいと先を急ぎ ますんで又の機会に。。。鶏さんにも玉子からのslimeが有った事を思い出した。

gaucheと同じようにモジュールを叩く2行スクリプトを用意してから、_vimrcに下記を追加

let g:slimv_swank_scheme = '!start "C:\app\chicken\bin\csi.exe"  "C:\app\chicken\bin\run-csi.scm"' 
Chicken Scheme 4.7.0  Port: 4005  Pid: 6352
; SWANK nil
CSI> 
CSI> (* 123 456) 
56088
CSI> 

今度はちゃんと動いた。相方のターミナルには、gvim側と鶏さん側とのやり取りが出てきたよ。

READ 00002d(:emacs-rex (swank:connection-info) nil t 1)
WRITE "00007D(:return (:ok (:pid 6352 :package (:name CSI :prompt CSI) :lisp-implementation (:type \"Chicken Scheme\" :version \"4.7.0\"))) 1)"
READ 00002d(:emacs-rex (swank:create-repl nil) nil t 2)
WRITE "00001F(:return (:ok (\"CSI\" \"CSI\")) 2)"
READ 43(:emacs-rex (swank:swank-require (quote swank-fuzzy)) nil :repl-thread 3

WRITE "000015(:return (:ok nil) 3)"
READ 38(:emacs-rex (swank:operator-arglist "*" "CSI") nil t 4)
WRITE "00001B(:return (:ok \"C_times\") 4)"
READ 38(:emacs-rex (swank:operator-arglist "*" "CSI") nil t 5)
WRITE "00001B(:return (:ok \"C_times\") 5)"
READ 48(:emacs-rex (swank:listener-eval "(* 123 456) \n") "CSI" :repl-thread 6)
WRITE "000023(:return (:ok (:values \"56088\")) 6)"

vim側には通信機能が無いのでPythonにお願いしてるのね。そのあたりどんな具合になってるんだろう? vimの変態仕様なスクリプトでも読んでみるかな。