カテゴリー

アーカイブ






Archive for the 'vim' Category

05 6th, 2008

前回のコードを単純にvimのbufferから読むようにしただけ
以下ソース
vim2wp.vim

function WP_post()
python << EOF
username=username
password=XXXXXXX
# xmlrpc.phpのある場所を指定しておく
blog_url=http://xxxxx/xmlrpc.php

import vim
import xmlrpclib

wp = xmlrpclib.ServerProxy(blog_url)

content=unicode(\n.join(vim.current.buffer[:]), utf-8)
title=unicode(vim.eval("input(’title :’)"), utf-8)
if title == :
    print "cancel post."
else:
    category=vim.eval("input(’category :’)")
    post={title:title,description:content}

    categoryList = dict([(x['categoryName'], x['categoryId']) for x in wp.wp.getCategories(0,username,password)])
    postID = wp.metaWeblog.newPost(,username,password,post,1)
    if category in categoryList.keys():
        wp.mt.setPostCategories(postID, username, password,[{'categoryId':categoryList[category]}])
    print "Finish post."
EOF
endfunction

:so vim2wp.vim

で、読み込んで

:call WP_post()

で、実行

title:

と聞かれるのでエントリーのタイトルを入力
何も入力しないとキャンセル

category :

次にカテゴリーを聞いてくるので入力
何も入力しないとデフォルトカテゴリーが適用される



vimでftp

Author: あきを
05 5th, 2008

久しぶりにVimメモ

vimからftpに接続する場合、netrwプラグインが有効ならば

:vi ftp://ftp.xxx.com/

で接続できるけどログインするためには.netrcファイルを作成しておくと便利
書式は以下のような形

machine ftp.xxx.com
login username
password xxxxxxxx

ところが.netrcはreadableだと機能しないらしいので

chmod 700 .netrc

としておく必要がある。



vimで関数リスト

Author: あきを
03 26th, 2008

vimでMELの関数リストを作るコマンド

:vimgrep '.*proc.*' %|cwin

ctags+taglist.vimを使えばよいのだけど、1行で済んだので
procという変数名がある場合、拾ってしまうのが難点
コマンド作って使ってます

command Funclist :vimgrep '.*proc.*' %|cwin

pythonなら

:vimgrep '^def.*:$' %|cwin

バッファに直でパイプ渡しする前にvimScriptでいろいろ加工すれば
もう少し面白くできそう



コマンド一時保存して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を使ってみるかな



そんなスクリプトはないのかと
「vim maya」でぐぐったら当ブログが出てきてびびった。
で、一から書いてみた
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

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',8383))
src = vim.eval("GetSelRange()")

# delete line break character
srcT = src.split("\n")
src = string.join(srcT)

s.send(src)
EOF
endfunction

参考:
Digital Matrix
名無しのVIm使い
+python もしくは +dyn/PythonでコンパイルされたVimでしか使えません。
pythonでソケットを作ってコマンドを飛ばします。
改行文字を消しているのは、改行部分でスクリプトが細切れになるのでfor文等が実行できないためです。
vimのpluginフォルダにVim2Maya.vimをおき、VIMを起動。
Mayaの方は以下のMELでコマンドポートを開けておきます

commandPort -n ":8383";

で、VIM上でMayaに送りたい部分を選択して以下のコマンドを入力

:call Vim2Maya()

とすると、Maya上でMELが実行されます。

欲しいなぁと思ってた機能だけど実際はあんまり使えませんね。
アプリケーションが切り替わる感じが個人的にはまだしっくりこない感じです。

選択したスクリプトを直接飛ばしているのだけど
これだとソケットの仕様上4KB(4096B)までしか送れません。
一時バッファとしてどこかに保存にして、MELにはsourceコマンドを飛ばす方法にしたほうが
いい気がします。
あとMayaの出力をVimのバッファに持ってこれたらいいんですけどね

次回に続きます