light log

学んだこととか

Atomエディタでスクリプトの実行結果を貼り付ける

今日はRubyのEnumerableモジュールのメソッドを全体的に概観してブログにまとめようと思って、

Rubyコード書く → AtomのScriptパッケージで実行 → 結果をコードの下にコメントとして貼り付け

っていう地道な作業をしていたんだけど、早々に面倒臭くなって、Atomの簡単なスクリプトで自動化できないかと思ってやってみた。

Atomスクリプトを書いた経験はほぼ無いけど、ScriptパッケージにScript: Copy Run Resultsという名の、実行結果をクリップボードに貼り付ける機能があったので、

  1. Script: Runを実行
  2. Script: Copy Run Resultsを実行
  3. クリップボードにコピーされたテキストの各行先頭に、コメント記号(と実行結果を表す矢印)'#=> 'を付加
  4. エディタのカーソル位置に書き込む

だけできればいいんじゃないかと思った。

できたもの

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 ResultRun Andはおかしいな…)

あと、'script:copy-run-results'をトリガーしている箇所の、atom.workspaceView.triggerはdeprecatedらしい。

Upgrading Your Package

でも新しい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

忍耐力なし!

参考