昨日・今日はとても久しぶりに自分のプログラミングをしました。というかなんか、VisualStudioを起動したのが非常に久しぶりな気がします。
――さて、C#の場合コードを書いていて面倒なのは、構造体を作る時、privateフィールドとpublicのアクセサ(プロパティ)を作ること。別にこうしなくても全て変数をpublicにしてしまえばいいんですが、何となく気に入らなくて、ついついやってしまいます。しかしこれが結構めんどくさくて、おかげで構造体を作るのがおっくうになってしまうことも。
そんなわけで、ちょちょっとクリップボードの中身を処理するツールを作成。今回はUWSCをフロントエンドにしてGUI部分を作り、そこからrubyスクリプトを呼び出すという形。UWSCはDOSCMDコマンドで簡単に標準出力がリダイレクトできるので便利です。
DIM _basedir = "(スクリプトフォルダパスを入力)"
DIM _clipboard = GETSTR(0)
DIM _scripts = ""
// スクリプトを選択
WHILE _scripts = ""
GETDIR(_basedir, "*.*", FALSE, 4)
_scripts = SLCTBOX(SLCT_CMB OR SLCT_STR, 0, "使用するスクリプトを選択してください。", GETDIR_FILES, "#更新", "#フォルダを開く")
IFB _scripts = "#更新" OR _scripts = "#フォルダを開く" THEN
// 「フォルダを開く」選択でbasedirを開く。「更新」選択でリスト再表示
IF _scripts = "#フォルダを開く" THEN EXEC("explorer " + _basedir)
_scripts = ""
ENDIF
IF _scripts = -1 THEN EXIT // -1(キャンセル)は抜ける
WEND
// 引数に改行は使えないので、\nに置換
DIM _dest = CHGMOJ(_clipboard, "<#CR>", "\n")
// スクリプトを実行(SLCT_CMBだと複数選択できないが、一応複数スクリプトの連続使用対応)
WHILE _scripts <> ""
_dest = DOSCMD(_basedir + TOKEN("<#TAB>", _scripts) + " <#DBL>" + _dest + "<#DBL>")
WEND
SENDSTR(0, _dest)
SOUND("Default")これで、_basedir配下にrubyなどのスクリプトをおいておくと、起動後にそれらのファイルがリストアップされたコンボボックスが表示され、スクリプトを選択することが出来ます。スクリプトには第一引数としてクリップボードにコピーされた内容がスクリプトに渡り、その標準出力がクリップボードにコピーされるわけです。
ちなみに、rubyスクリプトのほうは、こう。
lines = ARGV[0].gsub("\\n", "\n"); lines.each("\n") do |line| if line.match(/private ([\w\[\]]+) (\w+)/) type = Regexp.last_match[1] name = Regexp.last_match[2] propname = name.sub(/\b\w/) {|word| word.upcase } print <<-"CODE" public #{type} #{propname} { get{ return #{name}; } set{ #{name} = value; } } CODE else print line end end
おまけで、こんなものも作成。private変数のリストを渡すと、それら全部を初期化するコンストラクタコードを作ってくれます。パラメータなどが指定できないのでお間抜けながらメソッド名はConstructorになってます。なので、そこだけあとで書き換える必要あり。
lines = ARGV[0].gsub("\\n", "\n"); paramscode = ""; subscode = ""; lines.each(";") do |line| if line.match(/private ([\w\[\]]+) (\w+)/) m = Regexp.last_match paramscode += "#{m[1]} #{m[2]}, "; subscode += " this.#{m[2]} = #{m[2]};\n"; end end paramscode.sub!(/, \Z/, ""); subscode.sub!(/\n\Z/, ""); print <<"CODE" public Constructor(#{paramscode}) { #{subscode} } CODE
これで構造体をばんばん作っても怖くない かも。
UWSCのスクリプトは簡単なダイアログやメッセージ表示メソッドがあるので、スクリプトののり付け言語としてもなかなか優秀です。ちょっとした必要があればスクリプトも増やしていきたいですねー。
――それにしても、こういうものを書いてることって、考えてみたら結構多いかも。だとするとおんぷ村にもこういうものの公開スペースがあった方が良いかもしれないな・・・。再開発のときに盛り込んでみましょうか。