2011年11月20日

【作ってみた】サクラエディタでRubyをインラインで書いて実行するマクロ

Windowsで普段使っているエディタでもRubyでちょっとしたワンライナーを実行できると素敵ということで、サクラエディタのマクロを作ってみた。

■ダウンロード

windows版rubyのインストール場所に合わせて変数rubybinを変更。Vistaや7を使う場合、変数rubyscrにも適当なファイル名をフルパスで書いたほうがよいかも知れない。 設定を書き込んだら、メニューの外部マクロ設定で読み込む。ついでに右クリックメニューに足しておくと幸せになれると思う。

■コード
Vimスクリプトに比べるといろいろと楽々。サクラエディタは一時ファイルをSJISで書き出すので、エディタで実際に編集している文字コードに関係なく-Ksオプションを足すのが大事。

rubyculc_111120.js
var rubybin = "(Your Ruby Executable) -Ks";
var rubyscr = "script.rb";
var command = rubybin + " " +  rubyscr;

//writeout script
var selected = Editor.GetSelectedString(0);
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fpout = fso.CreateTextFile(rubyscr);

fpout.WriteLine("include Math");
fpout.WriteLine("def vscrEvalDescr() return yield(); end ");
fpout.WriteLine("print vscrEvalDescr(){");
fpout.WriteLine(selected);
fpout.WriteLine("}");

fpout.close();

//execute script
Editor.ExecCommand(command, 3);

参考にした資料

posted by yuji_at_radiance at 22:06| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2011年11月19日

【作ってみた】vimのバッファ内にrubyをインラインで書いて実行するスクリプト

Vimでテキストを打っている時にスクリプト言語や他のアプリケーションを使いたくなる時がある。ちょっとしたパターンを打ち込んだり、文字列をバラしたり、数式を計算したくなったり。大抵は正規表現とパイプを駆使して何とか頑張るが、頑張りたくない私のために。rubyを数行書く→実行→結果をバッファに挿入できるようにしてみた。

■ダウンロード

  • rubyinline_20111119.vim
  • rubyinline_20111120.vim
  • sourceコマンドで読み込んで使う。
    :source rubyinline_20111119.vim
    

    ■使い方:コードブロックとして評価
    rubyスクリプトはrubyの文法が許す限り何を書いてもよい。 visualモードでrubyスクリプトの箇所を選択した状態で(Leader)srbの順にキーを打つ(普通、Leaderはバックスラッシュキーのことらしい)。

    普通のテキスト文書
    ↓ここから
    5.times(){|iter|
      puts iter.to_s
    }
    ↑ここまで
    
    スクリプトは消去されて、標準出力の内容がバッファに追記される。
    普通のテキスト文書
    0
    1
    2
    3
    4
    
    現在のところ、実行結果が挿入される位置が1〜2行ずれる。どうやらr!コマンドでrubyを叩いているのがいけない様子。

    ■使い方:電卓モード(式として評価)
    テキスト上に現れる数式の評価値を知るためにいちいち整ったrubyの構文を書くのは面倒である。そこで、選択範囲のテキストを評価した結果を挿入するモードを作成。 こちらは(Leader)crbと打ち込む。

    たとえば、sin(1.57)*2の計算結果がほしいとしよう
    
    結果はこうなる。
    たとえば、1.99999936586367の計算結果がほしいとしよう
    
    rubyのブロック評価を使って実装しているので、複数の式を選択した場合には最後の式の評価結果が返る。また、定数を使ったりメソッドを宣言したりできない。

    ■コード
    はじめてvimのスクリプトを書いた。なんかvimな人にもrubyな人にも怒られそうな汚いコードだ。(11/20修正:putsじゃなくてprint使えば最後の改行を正規表現で落とす必要ない)

    rubyinline_20111120.vim
    "Private Functions
    :function! s:Rbscr_impl(scriptbody)
      "name of output file
      :let l:tempfile = tempname()
      :try
        "writeout and execute ruby script
        :call writefile(a:scriptbody, l:tempfile)
        :execute "r! ruby " . l:tempfile
      :finally
        "delete file
        :if filewritable(l:tempfile)
          :call delete(l:tempfile)
        :endif
      :endtry
    :endfunction
    
    :function! s:Rbculc_impl(scriptbody)
      :let l:culcPrefix  = ["#!/usr/bin/ruby"]
      call add(l:culcPrefix, "include Math")
      call add(l:culcPrefix, "def vscrEvalDescr() return yield(); end ")
      "変更:putsじゃなくてprint
      call add(l:culcPrefix, "print vscrEvalDescr(){")
    
      :let l:culcPostfix = ["}"]
    
      call extend(a:scriptbody, l:culcPrefix, 0)
      call extend(a:scriptbody, l:culcPostfix)
    
      :let l:tempfile = tempname()
      :try
        "writeout and execute ruby script
        :call writefile(a:scriptbody, l:tempfile)
        :let l:result = system("ruby " . l:tempfile)
        "変更:末尾の置換は要らない
        " :let l:result = substitute(l:result, "\n$", "", "")
        :execute "normal " . "i" . l:result
      :finally
        "delete file
        :if filewritable(l:tempfile)
          :call delete(l:tempfile)
        :endif
      :endtry
    :endfunction
    
    "Public Functions
    :function! Rbscr_visual() range
      :let l:vmode = visualmode()
      :if l:vmode == 'v'
        :let l:save_a = getreg('a')
        :silent :normal! gv"ad
        :let l:selected = split(getreg('a'), "\n")
        :silent :call s:Rbscr_impl(l:selected)
        :call setreg('a', l:save_a)
      :endif
    :endfunction
    
    :function! Rbscr() range
      "Retrive selected text
      :let l:selected = getline(a:firstline, a:lastline)
      "delete selected region
      :silent :execute a:firstline . "," .  a:lastline . " delete"
      "write file and call
      :silent :call s:Rbscr_impl(l:selected)
    :endfunction
    
    :function! Rbculc_visual() range
      :let l:vmode = visualmode()
      :if l:vmode == 'v'
        :let l:save_a = getreg('a')
        :silent :normal! gv"ad
        :let l:selected = split(getreg('a'), "\n")
        :silent :call s:Rbculc_impl(l:selected)
        :call setreg('a', l:save_a)
      :endif
    :endfunction
    
    "Key Mappings
    :execute ":map  srb :call Rbscr()"
    :execute ":vmap srb :call Rbscr_visual()"
    :execute ":vmap crb :call Rbculc_visual()"
    

    参考にした資料

    posted by yuji_at_radiance at 19:30| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

    広告


    この広告は60日以上更新がないブログに表示がされております。

    以下のいずれかの方法で非表示にすることが可能です。

    ・記事の投稿、編集をおこなう
    ・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


    ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。