CoffeeScript
ATOM
自動化

Atomでソース全体にauto indentを適用する

概要

Atomのauto indentは「いちいち全選択」しないとソース全体へ適用してくれない.
一方で,Atomにはinit.coffeeやkeymap.csonが用意されている.これを編集することで,以下のような恩恵がある.

  • init.coffeeでソース全体をauto indentするためのプログラムを作れる
  • keymap.csonでプログラムに対してショートカットキーを割り当てられる
  • つまりショートカット1発で全行auto indentさせる自動化が可能

1行書く度に調整を強いられることがつらいから作った.

init.coffee: 全行auto indent用プログラム

"File"タブ > "Init Script..."で開く.
Atom's APIに無いから 大人の事情で,「カーソルを先頭行に吹っ飛ばして1行ずつ下がりながら全行にauto indentを適用し,再び元の位置にカーソルを戻す」という頭悪そうな処理構成になった.

全行とか言いながら先頭行には効いてないかも.

以下のソースをinit.coffeeに追記.
処理名はとりあえず「all-text-indent」とした(2行目:'custom:all-text-indent').

init.coffee
# 全行auto indentプログラム
atom.commands.add 'atom-text-editor','custom:all-text-indent',->
  editor=atom.workspace.getActiveTextEditor()
  lastRow=editor.getLastBufferRow()
  pos=editor.getCursorBufferPosition()  # 現在のカーソル位置
  editor.moveToTop()
  for i in [1..lastRow]
    editor.moveDown(1)
    editor.autoIndentSelectedRows()  # auto indent処理
  editor.setCursorBufferPosition(pos)  # カーソル位置を戻す

CoffeeScriptは初めて触ったが,Atom公式リファレンスは初心者に厳しかった(Atom's API Essential Classes - TextEditor).

keymap.cson: ショートカットキー割り当て

"File"タブ > "Keymap..."で開く.
構成が単純で理解しやすい.参考:1つのキーバインドで、同時に複数のコマンドを実行する

ついでに「init.coffeeの編集はAtomを再起動しないと有効にならない」ことまで教えてくれた.

以下のソースをkeymap.csonに追記.先ほど作った処理"all-text-indent"にショートカットキーを割り当てる.PyCharmの自動インデントがCtrl+Alt+Lなのでこっちも同様にしてみた.

keymap.cson
# 全行auto indent用ショートカットキー
'atom-text-editor':
  'ctrl-alt-l':'custom:all-text-indent'

エディタ上での動作なのでatom-text-editorで適用している.どうやら上手く使うとファイル操作とか色々できるらしい.

実行例と問題点

PHPファイルで試したが,概ね狙い通り.
PyCharmに慣れていたので同水準に持ってこれて満足.

auto_indent.gif
※実際のコーディングでこんな崩れ方は多分しない.全行にauto indentが適用されているのを見やすくするため意図的に崩している.

困ったことといえば,1行ずつの処理なので「元に戻す(Ctrl+Z)」を半ば諦めざるを得ないことくらい.
変なところで適用すると結構悲惨な目に遭う.

文句(ポエム)

  • そもそも全行auto indentしてくれないのは如何なものか(無料だから仕方ない)
  • CoffeeScript公式リファレンスがわかりにくい.そのへんの日本語解説サイトにはお世話になった
  • 目的とは関係なくなったが,Atom's APIのPointオブジェクト参照で詰まされた.最初の要素で行数と列数を全部返してきたり,2番目の要素には何もなかったり(undefined),自分が今何と戦っているのかわからなくなる.
  • ↑配列のはずなのに要素番号が通じない=もしかして:連想配列?
  • ↑Atom公式リファレンスを良く読むと,辞書名っぽい"row", "column"の文字が(Atom's API Essential Classes - Point
  • ↑辞書型は確かに超便利だが,「名前がわからないと要素番号でいい感じに誤魔化すこともできず詰む」という闇を抱えているので解説も気をつけて欲しいところ(調べる側もどこに注目すべきか勉強になった)