一昨日のWindowsでVimなどからRを呼ぶ - もうカツ丼でいいよなを書いてから思ってたんだけど,やっぱもうちょっとESSっぽく動いて欲しいし,あらかじめRguiをSDIに設定して立ち上げておかないといけないというのも面倒だ.
「ESSっぽく」というと
- 範囲選択してコードが実行できる
- 一行実行して次の行に進める
- helpが簡単に引ける
くらいの機能が欲しい*1.
というわけで一昨日のヤツに手を加えてそれっぽいのを作ってみた.長いので記事の最後に.
ちなみにWordやExcel,FirefoxやIEなんかでも一部の機能は使えるハズなのでVim使わない人もどーぞ.
(追記: ちょこちょこいじる気がしてきたのでGitHubで管理することにしました GitHub - nozma/AHKScript: Scripts for AutoHotkey)
使い方
- AutoHotkeyをインストールする
- Download: AutoHotkey
- よく分かる日本語の解説ページ: 流行らせるページ跡地
- 本記事の最後に書いてあるスクリプトをテキストファイルにコピペして,sendtoR.ahkなどの適当な名前(拡張子は.ahk)で保存する.
- AutoHotkeyが正しくインストールされていれば保存されたファイルをダブルクリックするだけで以下のコマンドが使用可能になる
できること
- F3: 選択範囲をR Consoleに送る
- F4: 現在の行をR Consoleに送って次の行に進む
- C-c v: 現在カーソルがある部分のオブジェクト名でヘルプを引く
以上のコマンドは実行時に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