Android Studio最速入門~効率的にコーディングするための使い方

第41回 コードフォーマット

この記事を読むのに必要な時間:およそ 10.5 分

コードフォーマット

今回のド本命です。コードスタイルの設定は「Preferences / Code Style」で言語ごとに細かく指定することができます。

それぞれの設定項目の詳細については次回まとめて紹介します。今回はコードフォーマットの使い方と予備知識を中心に説明します。

コードフォーマットはメニューバーの「Code → Reformat Code...」から実行します。コマンドを実行すると先ほど紹介した「インポートの最適化」と似たようなダイアログが表示されます。

図7 ⁠Reformat Code」ダイアログ

図7 「Reformat Code」ダイアログ

こちらもインポートの最適化同様,コマンドを実行した場所によってダイアログの内容が若干変わります。使い道としては「Projectツールウィンドウ」のコンテキストメニューから実行する事のほうが多いのでは?と思います。

インポートの最適化と違う点は,エディタ上で範囲選択してからコマンド("Reformat Code...")を実行すると,その選択範囲のみをコードフォーマットの対象とすることができます(ダイアログの「Selected Text」が選択できるようになります。Eclipseの「ソース → 要素のフォーマット」と同等です⁠⁠。

「Reformat Code」ダイアログ下側のチェックボックスを見てもわかるとおり,このコマンドから「インポートの最適化(Optimize imports⁠⁠」と「アレンジメント(Rearrange entries⁠⁠」も一度に実行することができます。また「Only VCS changed text」をONにすると,バージョン管理下で変更を行ったファイルのみを処理の対象とすることができます……のハズですが,実際に試すと変更してないファイルも処理されました(バグでしょうか?0.4.4で確認しました⁠⁠。

インポートの最適化の「Optimize Imports」ダイアログにもあった「Do not show this dialog in the future」ですが,これをONにすると,以降 "Optimize Impors..."や"Reformat Code..."コマンドを実行しても,事前にダイアログが出なくなります。これを元に戻したい場合は,図8のように「Preferences / Editor」の2つの項目をONにします。

図8 ⁠Preferences / Editor」設定画面

図8 「Preferences / Editor」設定画面

この場所が非常にわかりづらいため,間違ってダイアログを非表示にして元に戻せなくて困っている人も多いと思います。

最近のAndroid Studioでは,Eclipseのようにコードフォーマットして欲しくない範囲をコメントで指定できるようになりました。たとえばリスト1のように@formatter:off@formatter:onで囲んだ範囲はコードフォーマットの対象にはなりません。

リスト1 "@formatter:off ~ on"でコードフォーマットの対象から外す

// @formatter:off
TextView textView = (TextView)findViewById(R.id.textView);
textView.setText(getIntent().
                 getStringExtra("inputText"));
// @formatter:on

この機能を使うには「Preferences / Code Style / General」「Enable formatter markers in comments」をONにしておく必要があります。また,この設定画面でコードフォーマット抑止用のコメントキーワードを変更することができます。ただ,デフォルト値がEclipseのそれと同じなのでわざわざ変更する必要もないと思います。

図9 ⁠Preferences / Code Style / General」設定画面

図9 「Preferences / Code Style / General」設定画面

[コラム]保存時にコードフォーマットできないの?

Eclipseには保管アクション(⁠⁠設定 → Java → エディター → 保管アクション⁠⁠)という機能があり,ファイルの保存時にコードフォーマットやインポートの最適化を行うことができます。

これと同等の事をAndroid Studioでできるでしょうか?というと残念ながらできません。Android Studioには,Eclipseの保管アクションに相当する機能を持っていないません。酷なようですが大人しくあきらめるしかありません。

保管アクションの代替というには物足りなすぎる方法なのですが,苦肉の策で試した方法があります。帯に短し襷に長し的な結果ですが,何かの足しになるかも知れませんので一応やったことを報告しておきます。

  • マクロを記録: "Start Macro Recording"
    • コードフォーマットを実行: "Reformat Code..."
    • すべて保存: "Save All"
  • 記録したマクロに "Save All" と同じショートカットキーを割り当てる

これで "Save All"のショートカットキーを叩いたときのみ コードフォーマットしてからファイルを保存できるようになります。ただし,主に効果があるのは編集中のファイルだけで,その他の未保存のファイルには効果がありません。Android Studioはビルドや実行といったイベントで自動的にファイルを保存するのでほぼ無意味です。

ちなみに,Android Studioが ファイルの保存時に実行できる編集操作「余分な空白の除去」だけです(⁠⁠Preferences / Editor」「Other」に設定箇所があります⁠⁠。

図10 ⁠Preferences / Editor」設定画面の「Other」部分

図10 「Preferences / Editor」設定画面の「Other」部分

Eclipseの保管アクションにもっとも近い機能は,バージョン管理ツールにコミットする時の「Before Commit(コミット前処理⁠⁠」です。ここの「Reformat code」「Optimize imports」をONにすれば,コミット時にコードフォーマットやインポートの最適化を行います。

図11 ⁠Commit Changes」ダイアログ

図11 「Commit Changes」ダイアログ

もともと「ファイルを個別に保存する」という概念のないAndroid Studioに保管アクションは合わないのです。そうは言っても,Eclipseに慣れた人にしてみればそんな事情は知るよしも無く,Eclipseで保管アクションを便利に使っていた身からすれば,同機能が無いのは不便この上ないのだと想像できます。

保管アクション相当機能が無いのは事実なのですが,保存時に不要な空白の削除を行うくらいなのだから,ケチな事言わず保管アクションを用意しても良いだろうとも思います。思い立ったついでにIntelliJのBTSを覗いてみたら,案の定すでに要望があがっていました。

すでに1年近く放置されていますが,votesが増えれば対応してもらえるかも知れませんよ。

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai