高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

クリップボード処理スクリプト

昨日・今日はとても久しぶりに自分のプログラミングをしました。というかなんか、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のスクリプトは簡単なダイアログやメッセージ表示メソッドがあるので、スクリプトののり付け言語としてもなかなか優秀です。ちょっとした必要があればスクリプトも増やしていきたいですねー。


――それにしても、こういうものを書いてることって、考えてみたら結構多いかも。だとするとおんぷ村にもこういうものの公開スペースがあった方が良いかもしれないな・・・。再開発のときに盛り込んでみましょうか。