WindowsのVimでESSっぽく(?)Rを使う

一昨日のWindowsでVimなどからRを呼ぶ - もうカツ丼でいいよなを書いてから思ってたんだけど,やっぱもうちょっとESSっぽく動いて欲しいし,あらかじめRguiをSDIに設定して立ち上げておかないといけないというのも面倒だ.
「ESSっぽく」というと

  • 範囲選択してコードが実行できる
  • 一行実行して次の行に進める
  • helpが簡単に引ける

くらいの機能が欲しい*1
というわけで一昨日のヤツに手を加えてそれっぽいのを作ってみた.長いので記事の最後に.
ちなみにWordやExcelFirefoxIEなんかでも一部の機能は使えるハズなのでVim使わない人もどーぞ.
(追記: ちょこちょこいじる気がしてきたのでGitHubで管理することにしました GitHub - nozma/AHKScript: Scripts for AutoHotkey)

使い方

  • AutoHotkeyをインストールする
  • 本記事の最後に書いてあるスクリプトをテキストファイルにコピペして,sendtoR.ahkなどの適当な名前(拡張子は.ahk)で保存する.
  • AutoHotkeyが正しくインストールされていれば保存されたファイルをダブルクリックするだけで以下のコマンドが使用可能になる

できること

  • F3: 選択範囲をR Consoleに送る
    • gvim含め大抵のエディタで動く*2
    • 実行後は元のエディタに戻る
  • F4: 現在の行をR Consoleに送って次の行に進む
    • gvimじゃないと動かない*3
  • C-c v: 現在カーソルがある部分のオブジェクト名でヘルプを引く
    • gvimじゃないと動かない*4
    • ヘルプがあればヘルプウィンドウがアクティブに,ヘルプ開けなかったらgvimに戻る
    • C-cC-vではない*5

以上のコマンドは実行時にR ConsoleがSDIで立ち上がっていなければRguiが立ち上がるようになっている.

  • q: helpを閉じる
    • 閉じたときもしgvimのウィンドウが存在していればそこへ飛ぶ
    • F5→q便利
  • C-M-q (Ctrl + Alt + q): R Consoleが立ち上がっていれば閉じる(作業スペース保存しません)

スクリプトや解説ページ見れば分かると思うけど,キーの割当ては簡単に変更できるので好きなキーに変更しましょう.ファンクションキー遠いからね.

注意

AutohotKeyいじりはじめてマジで3日の人間が作ったものなのでじこせきにん.
もしこの書き方はネーヨこれはヤバイという部分があれば指摘していただけると助かります.

すくりぷと

以下のスクリプトRe: [R] a simple trick to get autoclose parenthesis on windows from Jose Quesada on 2009-06-01 (R help archive)に投稿されたものを参考にしています.
追記: 最新版はgithubを参照して下さい: GitHub - nozma/AHKScript: Scripts for AutoHotkey

; F3 選択範囲をR Consoleに送る #WinActivateForce
    F3::
    {
        WinGet, active_id, ID, A
        IfWinActive, ahk_class Vim
            Send y
        else
            Send ^c
        IfWinNotExist, R Console
        {
            Run, rgui --sdi
            WinWait, R Console
        }
        WinActivate, R Console
        sendinput, {Raw}%clipboard%
        sendinput, {enter}
        ;Sleep 1000
        WinActivate, ahk_id %active_id%
    }
return

; F4 現在の行をR Consoleに送って次の行へ. ESSのC-nと同じ. (for gvim)
    #IfWinActive, ahk_class Vim
    F4::
    {
        WinGet, active_id, ID, A
        Send 0y$j
        IfWinNotExist, R Console
        {
            Run, rgui  --sdi
            WinWait, R Console
        }
        WinActivate, R Console
        sendinput, {Raw}%clipboard%
        sendinput, {enter}
        WinActivate, ahk_id %active_id%
    }
return 

; C-c v 現在のカーソル下のオブジェクトのヘルプを引く. (for gvim)
    #IfWinActive, ahk_class Vim
    ^c::
    Input, OutputVar, C I L1 T1, {Esc},v
    if ErrorLevel = Match
    {
        WinGet, active_id, ID, A
        Send yiw
        IfWinNotExist, R Console
        {
            Run, rgui --sdi
            WinWait, R Console
        }
        WinActivate, R Console
        sendinput, {Raw}help(%clipboard%)
        sendinput, {enter}
    }
return

; C-M-q(Ctrl+Alt+q) R Consoleが立ち上がっていれば終了させる
    #IfWinExist, R Console
    !^q::
    {
        WinActivate, R Console
        sendinput, quit(save="no"){enter}
    }
return

; qでRguiのヘルプを閉じたときにgvimのウィンドウがあればアクティブにする
    #IfWinActive, R Help on
    q::
    IfWinExist, ahk_class Vim
    {
        Send, q
        WinActivate, ahk_class Vim
    }
return

*1:ESS使いこなしてないのがばれる…!

*2:Excelの場合はセルを横に選択すると落ちます.

*3:Windowsで行選択をする一般的なコマンドが分かれば他のエディタでもできるようになるので,もし知ってたら教えてください

*4:Windowsで単語選択する一般的なコマンドなんてないよね…?

*5:本当はやりたいんだけどよく分からなかった.