TumblrRSS

tumblr

カテゴリー

アーカイブ






vimからmayaにコマンドを送るプラグイン(2)


コマンド一時保存してsourceコマンドのみを送る仕様に変えてみた
vim2Maya.vim:

function! GetSelRange()
:let tmp = @@
:silent normal gvy
:let selected = @@
:let @@ = tmp
return selected
endfunction

function! Vim2Maya()
python << EOF
import socket
import sys, vim, string

tempPath = "C:/temp/"

fileId= open(tempPath+"v2m.mel","w")
fileId.write(vim.eval("GetSelRange()"))
fileId.close()

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',8383))
s.send("source \""+tempPath+"v2m.mel\"")
s.close()
EOF
endfunction

これだと4kbの壁も関係なくなった。

で、今度はMayaからVimに結果を送るプラグインを書いてみようと思った。
pythonでsocketモジュールのrecvメンバを使用すればコマンドを受け取ることができるのだけれど、
vimはシングルスレッドなのでrecvしている間応答なしになってしまうわけです。
そのためには非同期通信を行う必要があるわけですが、うーむよくわからんぞ

<追記1>
問題を整理すると
●やりたいこと
 Maya->Vimに出力結果をバッファに送りたい
●問題点
 Vimはシングルスレッドなので、socketを待ち受け状態にするとタスクをとられてしまい(応答なし)状態になり、再描画すら行われなくなり結果も確認できない。
●解決案
 ・非同期通信を行う
  pythonではselectモジュールを使用してI/Oの監視が可能。なので
まずI/Oをselectによって判別する。ソケットからの入力であれば受信し、標準入力であればバッファに文字を表示する
ただし、window版のPythonでは、selectはソケット入力しか使用できないので他の方法が必要
 で、残りはtwistedを使ってみるかな



5 Responses to “vimからmayaにコマンドを送るプラグイン(2)”

  1. mynz Says:

    MayaにcommandPortなる命令があったんだね。これは勉強になる。
    自分もRuby Bindingを使って実装してみた。(Pythonはなれてないので)
    エラー処理はしていないけど、フィードバック付き。
    実行したいMELを選択して、:Mel で発行。もしくはF9でも可。

    思うに、VimからMayaにコマンドを投げっぱなしじゃなくて、レスポンスを待つのであれば下手に非同期にせずにvimを待たせるべきなんじゃないかと。どんなスクリプトでもそうだけど、1分も、2分も後になって突然返ってきてもらってもビックリするし、人間自体が非同期に対応していないしね。

    function! SendMELCommand() range
    let src = tempname()
    silent execute “: ” . a:firstline . “, ” a:lastline . “w ” . src
    silent execute “:pedit! ” . “Maya feedback”

    ” forcus on the preview windonw.
    wincmd P
    setlocal buftype=nofile
    setlocal noswapfile
    setlocal syntax=none
    setlocal bufhidden=delete

    ruby :call SendMELCommand()

  2. mynz Says:

    うう、とぎれたんじゃなくて、Vimスクリプトを投稿しようとするとコードの一部がHTMLの(不正な)タグだと解釈されるみたい。

    実行できないスクリプトを残していても何なので、気がまわったらスクリプト部分は消しておいてください…。もうしわけない。

  3. 管理人 Says:

    とりあえず一個だけ消しておいた

    やりたいのはMayaからVimに結果を投げるのなんだけど
    マルチスレッドに対応していないもので待ち受けループ
    まわすのってパフォーマンス的に厳しいんじゃないか
    って気がしてきた

    やっぱりコマンドを送った後の結果だけVImを
    待たせてを受け取るようにしてみるか

  4. tai Says:

    VIMスクリプトですか!
    僕もVIM使ってるんですが、キーバインドに慣れたからもう他の使う気になれないという軟弱な理由で使い続けてる弱小VIM使いです。
    設定もほぼデフォです。。

    なんかここ診てると、VIMスクリプトでもいろいろやれそうな気がしてくるので、
    ちょっと勉強してみます。

    Gaucheも面白そうですね!
    関数型、Haskellで勉強してはいるんですが、
    どうやって実戦投入したらいいか悩んでいるところです。。

    それにしてもライフゲームのやつのGUIライブラリが素敵すぎます。

  5. あきを Says:

    VIMスクリプト上でpython使えるので
    ライブラリとか使うと色々できそうですよ

Leave a Reply