Atomエディタでスクリプトの実行結果を貼り付ける
今日はRubyのEnumerableモジュールのメソッドを全体的に概観してブログにまとめようと思って、
Rubyコード書く → AtomのScriptパッケージで実行 → 結果をコードの下にコメントとして貼り付け
っていう地道な作業をしていたんだけど、早々に面倒臭くなって、Atomの簡単なスクリプトで自動化できないかと思ってやってみた。
Atomのスクリプトを書いた経験はほぼ無いけど、ScriptパッケージにScript: Copy Run Results
という名の、実行結果をクリップボードに貼り付ける機能があったので、
Script: Run
を実行Script: Copy Run Results
を実行- クリップボードにコピーされたテキストの各行先頭に、コメント記号(と実行結果を表す矢印)'#=> 'を付加
- エディタのカーソル位置に書き込む
だけできればいいんじゃないかと思った。
できたもの
init.coffeeに以下を追加した。コマンドパレットを開いてUser: Run And Paste Result
で実行。
atom.commands.add 'atom-text-editor', 'user:run-and-paste-result': -> editor = atom.workspace.getActiveTextEditor() atom.workspaceView.trigger 'script:copy-run-results' # deprecated text = atom.clipboard.read() editor.insertText(text.replace(/^/gm, '#=> '))
いろいろと妥協の塊。
まず、上で書いた手順1〜4のうちの1は、含めなかった。というのも、Script: Run
はコードの一部を選択して呼び出せば、その部分だけ実行してくれて、実際自分もこれを多用していたけれど、このノリでコードを選択した状態でUser: Run And Paste Result
を呼び出して結果をカーソル位置に貼り付けるとコードを上書きしてしまうのだ。(あたりまえ)
だったら上記手順の4の前に選択を解除してカーソルを動かしてやればいいんだけど、Atom力が低すぎたので見送った。
なので、まずScript: Run
を実行してから、こいつを呼び出すことにする。(そうなると今気づいたけどUser: Run And Paste Result
のRun And
はおかしいな…)
あと、'script:copy-run-results'
をトリガーしている箇所の、atom.workspaceView.trigger
はdeprecatedらしい。
でも新しいAPIで同様のこと(コマンドのトリガー)をどうやるのかわからなかったので、仕方なくこうしてる。
(4/22追記)
トリガー方法、上のリンクに普通に載ってた。ちゃんと確認しようおれ…
直したバージョンがこれ。
atom.commands.add 'atom-text-editor', 'user:paste-results-as-comment': -> editor = atom.workspace.getActiveTextEditor() editorElement = atom.views.getView(editor) atom.commands.dispatch editorElement, 'script:copy-run-results' text = atom.clipboard.read() editor.insertText(text.replace(/^/gm, '#=> '))
(追記終わり)
つかってみる
この行を選択してScript: Run
を実行、
puts 'foobar'
そして(コメントを貼り付けたい位置にカーソルを移動して)今回作ったUser: Run And Paste Result
を実行すると
puts 'foobar' #=> foobar #=> [Finished in 0.054s]
こうなる。
いちおう動く。
まとめ
- 最近APIが大きく刷新されたようで、ググってもノウハウがあんまり見つからない
- 日本語の情報はなおさら
- Atomのドキュメントのサイトが重くてやる気なくなった
- でも楽しいのでそのうちパッケージとか書いてみたい
- JSやCoffeeは多少知ってるしビューはDOM操作でいじれる
- でも優先順位は低い
余談
本来書こうとしてたEnumerableモジュールのメソッド概観。ここまででくじけた。
# all? # 全ての要素が真の場合にtrue # 偽の要素が一つでもあればfalse ## Array p [2, 4, 8].all? {|v| v % 2 == 0 } p [2, 4, 9].all? {|v| v % 2 == 0 } #=> true #=> false ## Hash p ({foo: 1, bar: 2 }).all? {|k, v| v > 0 } #=> true # any? # 全ての要素が偽の場合にfalse # 真の要素が一つでもあればtrue ## Array p [1, 3, 8].any? {|v| v % 2 == 0 } p [1, 3, 9].any? {|v| v % 2 == 0 } #=> true #=> false
忍耐力なし!