« ねそける日記 |Main| 乾燥日記 »

« MeadowからGRINEditを操作する | GRINEdit | ESPer2006の懇親会の3次会で語った内容 »

GRINEditの頂点をMeadowで編集

西尾泰和のブログ: howmで書く日記4日目西尾泰和のブログ: MeadowからGRINEditを操作する で紹介した要素を組み合わせれば理屈の上ではできると思っていたのですが、 やってみたらやっぱりできました。

デモ

原理は、

  • 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のサーバやクライアントになってくれるといいのにな…ということでしょうか。 一応目的のことは実現できてはいるものの、 なんか泥臭いなぁ…と。

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/441

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.