neocomplcache のプラグインの作り方を見ていて、java でもっと楽に補完できないかなぁと思案(楽にできるならとっくに誰かがやってるのは置いておく)。
vimproc を使ってソケット通信してみる。例えば「java.util.ArrayList」を渡すと、そのインスタンスメソッドの一覧を返すようにしたい。
try let s:socket = vimproc#socket_open('localhost', 20000) call s:socket.write("java.util.ArrayList\n") let s:methods = s:socket.read_line() call s:socket.close() for s:val in split(s:methods , ",") echo s:val endfor catch echo v:exception endtry
jruby のサーバを立てる
java だったら jruby 使ったら楽じゃね?(クラス名から Class を取得する方法がよく分からなかった)
include Java require 'socket' server = TCPServer.open(20000) while true socket = server.accept m = (eval socket.gets).instance_methods.join(",") puts m socket.send "#{m}\n" , 0 socket.close end server.close
結果
RangeCheck ensureCapacity clone read_object subList fast_remove fastRemove write_object trim_to_size iterator retainAll removeAll contains_all list_iterator retain_all remove_all ・ ・ ・
ruby のメソッドが混ざるのであまりよろしくない
java でサーバを立てる
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.DataOutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import java.lang.reflect.Method; import java.util.List; import java.util.ArrayList; public class Server { public static void main(String[] args) throws Exception { ServerSocket servSock = new ServerSocket(20000); while (true) { Socket socket = servSock.accept(); InputStream is = socket.getInputStream(); InputStreamReader reader = new InputStreamReader(is); BufferedReader br = new BufferedReader(reader); String line = br.readLine(); Class clazz = Class.forName(line); Method[] methods = clazz.getMethods(); List list = new ArrayList(); for (Method m : methods) { String name = m.getName(); if (!list.contains(name)) { list.add(name); } } StringBuilder sb = new StringBuilder(); for (int i = 0 ; i < list.size() ; i++) { if (i != 0) { sb.append(","); } sb.append(list.get(i)); } System.out.println(sb.toString()); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.writeBytes(sb.toString() + "\n"); br.close(); reader.close(); is.close(); out.close(); socket.close(); } } }
結果
add get clone indexOf clear isEmpty lastIndexOf contains addAll size toArray remove set ensureCapacity trimToSize equals hashCode iterator ・ ・ ・
なげえ・・・。けど、欲しいものは取れた。
じゃあ、補完するの簡単じゃね?
なわけない。文脈を読むのが糞めんどくさい・・・。
レスポンスは問題なさそうなんだけどなぁ。