GRINEditの頂点をMeadowで編集
原理は、
- GRINEditでダブルクリックをしたときに
- 最寄り頂点のIDとラベルを取得
- "grinedit"バッファを開いてIDとラベルを書き込むEmacs Lispコードを生成
- gnuservを使ってMeadowに送信
- Meadowに頂点IDやラベルが表示される
- Meadowでラベルを編集
- あらかじめ定義してある関数を実行
- Pythonで書かれたスクリプトを起動する
- カレントバッファの内容を標準入力に流し込む
- スクリプトがXML-RPCでGRINEditを操作する
ダブルクリックをしたときに行う処理の登録は プロトタイプとしてinitMouseMeadiator.pyに直接下のように書きました。
class MO_OpenMeadowWhenDoubleClicked(mo.MouseOperation):
def mouseDoubleClick(self, x, y, i):
target = med.getNearestVertex(x, y);
if target:
label = target.getParams().get("label")
print label
self.openMeadow(target.getId(), label)
def openMeadow(self, vertexId, contents):
import os
sexp = r'(switch-to-buffer \"grinedit\")'
sexp += r'(erase-buffer)'
sexp += r'(insert \"%s\n\")' % vertexId
s = contents.replace("\n", r"\n")
sexp += r'(insert \"%s\")' % s
cmd = "gnudoit -F \"%s\"" % sexp
print cmd
os.system(cmd)
mm.add(_("Test_OpenMeadow"), MO_OpenMeadowWhenDoubleClicked())
os.systemを使ってgnudoitを起動しているわけです。 -Fオプションをつけているのに Meadowにフォーカスがうつらないのは謎。
Meadow側では.emacsに下のようにキーバインドの定義が書かれています。
(defvar GRINEDITPY "c:\\meadow\\grinedit_modVertex.py" "*The command to send query to grinedit") (defun grinedit () (interactive) (call-process-region (point-min) (point-max) GRINEDITPY)) (define-key global-map "\C-cg" 'grinedit)
ようはgrinedit_modVertex.pyを起動し、 バッファの最初から最後までを標準入力に流し込んでいるわけです。
起動されているgrinedit_modVertex.pyの中身は以下。
import xmlrpclib, sys
text = sys.stdin.read()
items = text.split("\n", 1)
vertexId = items[0]
contents = items[1]
server = xmlrpclib.Server("http://localhost:8080/RPC2")
g = server.grinedit
g.modVertex(vertexId, {"label": contents})
改行で分割して、1行目を頂点ID、2行目以降をラベルの値として、 頂点のパラメータを変更するクエリを投げています。
やってみた感想としては、 Meadowが直接XML-RPCのサーバやクライアントになってくれるといいのにな…ということでしょうか。 一応目的のことは実現できてはいるものの、 なんか泥臭いなぁ…と。