NetBeans インターフェイス

netbeans.jax 翻訳完了。
http://www.kaoriya.net/vimdoc_j/vimdoc_ja-snapshot.tar.bz2

NetBeans インターフェイスって、別に NetBeans 専用じゃなくて、どんな IDE とでも統合できるようにするための汎用インターフェイスだったんだ…
メッセージは行指向のプレインテキストで送られるので、netcat などでも簡単に対話できる。
NetBeans サーバ役(Vim コントローラ)をするスクリプトを適当に書いてみた。

# -*- coding: utf-8 -*-
import socket
import os
import sys
import re

HOST = ''
PORT = 3219

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
conn_f = conn.makefile()

print 'Connected by', addr

def sendToVim(bufID, name, arg=""):
    global sendsecno
    global conn_f
    sendsecno += 1
    message = "%s:%s%s %s" % (bufID, name, sendsecno, arg)
    conn_f.write(message + "\n")
    conn_f.flush()
    print "SEND [%s]\n" % message,

try:
    sendsecno = 0
    while True:
        line = conn_f.readline().rstrip("\r\n")
        print "%s" % (line)
        m = re.match('^(\d+):(\w+)=(\d+)(.*)', line)
        if m:
            # イベント受信
            bufID     = m.group(1)
            eventName = m.group(2)
            seqno     = m.group(3)
            arg       = m.group(4)
            #print "==========> bufID=[%s] eventName=[%s] secno=[%s]" % (m.group(1), m.group(2), m.group(3))
            if eventName == "fileOpened":
                filePath = arg.split()[0]
                print "filePath = [%s]" % filePath
                # bufID をセット
                sendToVim(1, "putBufferNumber!", filePath)
                # バッファの長さを取得
                sendToVim(1, "getLength/")
                # バッファの0バイト目に文字列挿入
                sendToVim(1, "insert/", '0 "Hello from NetBeans!"')
except socket.error:
    pass
finally:
    conn.close()

実行:
1. netbeans.py 起動

$ python netbeans.py

2. gvim 起動

.\gvim -u NONE -N -nb:localhost:3219:mypass

3. gvim 側で手動で vimrc を開く。
バッファに "Hello from NetBeans!" が挿入される。
キーボードから適当に挿入するとその都度イベントが送られる。

Connected by ('127.0.0.1', 2352)
AUTH mypass
0:version=0 "2.4"
0:startupDone=0
0:fileOpened=0 "C:\\ao\\dl\\vim72-kaoriya-w32j\\vimrc" T F
filePath = ["C:\\ao\\dl\\vim72-kaoriya-w32j\\vimrc"]
SEND [1:putBufferNumber!1 "C:\\ao\\dl\\vim72-kaoriya-w32j\\vimrc"]
SEND [1:getLength/2 ]
SEND [1:insert/3 0 "Hello from NetBeans!"]
2 9306
3
1:insert=3 21 "\n"
1:remove=3 21 0
1:insert=3 21 "m"
1:remove=3 21 1
1:insert=3 21 "me"
1:remove=3 21 2
1:insert=3 21 "m"
1:remove=3 21 1
1:insert=3 21 ""
1:remove=3 21 0
1:insert=3 21 "メ"
1:remove=3 21 2
1:insert=3 21 "メッ"
1:remove=3 21 4
1:insert=3 21 "メッセ"
1:remove=3 21 6
1:insert=3 21 "メッセー"
1:remove=3 21 8
1:insert=3 21 "メッセージ"
1:remove=3 21 10
1:insert=3 21 "メッセージは"
1:insert=3 34 ""
1:insert=3 34 "\n"
1:remove=3 21 13
1:remove=3 21 12
1:insert=3 21 "メッセージはU"
1:remove=3 21 13
1:insert=3 21 "メッセージはUT"
1:remove=3 21 14
1:insert=3 21 "メッセージはUTF"
1:remove=3 21 15
1:insert=3 21 "メッセージはUTF-"
1:remove=3 21 16
1:insert=3 21 "メッセージはUTF-8"
1:remove=3 21 17
1:insert=3 21 "メッセージはUTF-8で"

何か面白い使い方を考えたいけど、Vim 側でのコマンド実行をほとんど拾えないので、IDE との統合以外にはあまり使えないような気がする。