This entry was posted on 木曜日, 3月 13th, 2008 at 13:25:44 and is filed under vim. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.


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)”
Leave a Reply

3月 13th, 2008 at 22:18:18
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()
3月 13th, 2008 at 22:23:36
うう、とぎれたんじゃなくて、Vimスクリプトを投稿しようとするとコードの一部がHTMLの(不正な)タグだと解釈されるみたい。
実行できないスクリプトを残していても何なので、気がまわったらスクリプト部分は消しておいてください…。もうしわけない。
3月 14th, 2008 at 13:45:02
とりあえず一個だけ消しておいた
やりたいのはMayaからVimに結果を投げるのなんだけど
マルチスレッドに対応していないもので待ち受けループ
まわすのってパフォーマンス的に厳しいんじゃないか
って気がしてきた
やっぱりコマンドを送った後の結果だけVImを
待たせてを受け取るようにしてみるか
3月 15th, 2008 at 12:45:30
VIMスクリプトですか!
僕もVIM使ってるんですが、キーバインドに慣れたからもう他の使う気になれないという軟弱な理由で使い続けてる弱小VIM使いです。
設定もほぼデフォです。。
なんかここ診てると、VIMスクリプトでもいろいろやれそうな気がしてくるので、
ちょっと勉強してみます。
Gaucheも面白そうですね!
関数型、Haskellで勉強してはいるんですが、
どうやって実戦投入したらいいか悩んでいるところです。。
それにしてもライフゲームのやつのGUIライブラリが素敵すぎます。
3月 15th, 2008 at 15:17:58
VIMスクリプト上でpython使えるので
ライブラリとか使うと色々できそうですよ