はじめに
順番が逆になったような気もしますが、今さらエディタの基本操作について説明します。基本操作と言うよりは「細かすぎて伝わらないAndroid Studioの基本操作」と言った方が適切かもしれません。
カット、コピー&ペースト
メニューバーの「Edit」にあるおなじみの"Cut ", "Copy ", "Paste "です。やることは他のエディタ系アプリケーション同様に選択範囲のテキストをクリップボードにコピーして、任意の場所に貼り付けるというアレです。
Android Studioのカットやコピーは何も選択していない状態で実行すると「カーソル位置の行」を対象にします。知っているとキータイプで1~2ストロークほど得をします。
また、文字列リテラルを コピーしたり、文字列リテラルに 貼り付けたりする場合、ちょっと変わったことをします。たとえば、図1 のようにエスケープシーケンス付きの文字列リテラルはデコードしてコピーされ、改行やクォート文字を含む文字列 は、エスケープして文字列リテラルに貼り付けられます。
図1 文字列リテラルへのコピーやペーストの例(クリックすると動きがわかります)
このような気遣いを「すげぇ!ネ申IDE!!」と思うか「余計な事してウザい」と思うかで、Android Studioへの評価が分かれると思います。このような器用な事をせず普通に貼り付けたい場合は"Paste Simple "を使います(このコマンドについては後述します) 。
なお、Eclipseの場合、ソースコードをクリックボードにコピーするとシンタックスハイライトを含んだリッチテキストとしてコピーされますが、Android Studioでは通常のテキストとしてコピーされます。Eclipseのようなコピーをするには、別途プラグイン が必要です(いずれ説明します) 。
図2 Eclipseのテキストコピーはシンタックスハイライト付きでコピーされる
特殊なコピーとペースト
コピーとペーストについては通常の"Copy "と"Paste "の他にいくつか特殊なコマンドがありますので、それを紹介します。
"Copy Path"
現在編集しているファイルの絶対パスをコピーします。
このコマンドはエディタ以外でも「Projectツールウィンドウ」などでも使うことができます。
"Copy Reference"
現在編集しているファイルの場所をコピーします。場所とは「/path/.../File.ext:lineNo
」形式で表します。たとえば「com.example.Foo
クラスの48行目」で実行した場合「/com/example/Foo.java:48
」という内容がコピーされます。
「Projectツールウィンドウ」でJavaファイルに対して実行した場合は、そのクラスの完全修飾名がコピーされます(Eclipseの「編集 → 装飾名のコピー」に相当します) 。
"Paste Simple"
単純なペーストを行います。
先ほど説明したとおり、通常の"Paste "はペースト先のコンテキストに応じて適切なフォーマット処理を行います。例えば、文字列中にペーストすればダブルクォートなどの特殊文字をエスケープしたり、コード片をペーストする時もペースト位置に応じてリフォーマットします。
"Paste Simple " はそのような処理を一切行わずクリップボードの内容をペーストします。
"Paste from History..."
ヒストリバッファから過去にクリップボードにコピーした任意の内容を選んでペーストします(通常のコピー&ペーストは直前にコピーしたものがペーストされますよね) 。
図3 "Paste from History..."の実行例
このヒストリバッファはAndroid Studio固有のものですが、Android Studioが起動している間はクリップボードを監視しているらしく、他のアプリケーションでコピーした内容もヒストリバッファに記録されます。残念なことにAndroid Studioを終了するとヒストリバッファはクリアされます。
ヒストリバッファのサイズは「Preferences / Editor」の「Maximum number of contents to keep in clipboard」で変更できます(初期値は 5) 。
地味に便利な「クリップボードと比較」
メニューバーの「View → Compare with Clipboard」で現在のエディタの内容とクリップボードの内容を比較することができます。
図4 "Compare with Clipboard"の実行例
いわゆるdiffなのですが、気軽に差分の確認ができるため大変重宝しています。相違部分にある「>>」アイコンや「×」アイコンをクリックすることで、相違部分をエディタ側に反映することができます。
Diffウィンドウのツールバーの意味は表1 のとおりです。
表1 Diffウィンドウのツールバーの意味
No 意味
(1) テキストをコピーします。筆者が試した限りでは、このアイコンが有効になることはありませんでしたが、ツールチップに表示されるショートカットキーでコピーすることはできました。
(2) テキストを検索します。こちらもアイコンは無効のままでしたが、ショートカットキーは有効でした。実行すると、図5 のような検索用のツールバーが表示されます。
(3) 相違点へ移動します。
(4) 空白を無視するオプションを指定します。選択肢は「Do not ignore(無視しない)/Leading and trailing(行頭、行末の空白を無視)/All(空白を無視) 」の3つです。
(5) ヘルプです(Android Studioには、まだヘルプが実装されていません) 。
(6) エディタ部分の表示オプションを指定します。指定可能なオプションは図6 のとおりです。
図5 検索用ツールバー
※ 検索用ツールバーについては第17回あたりで説明します。
図6 指定可能なオプション
また、エディタで特定の範囲を選択してから "Compare with Clipboard" を実行すると、その選択範囲との比較になります。
Eclipseでの同等機能は、エディタのコンテキストメニューにある「比較 → クリップボード」です。
図7 Eclipseでの「クリップボードと比較」
比較の話は、他のもいくつかあるのですがエディタの話とはズレるので次回にまとめて説明します。
文脈依存選択
筆者はこれをAndroid StudioのみならずJetBrains系IDEの最大の特徴と思って10年近く「便利だ、便利だ」と言い続けています。それほど特徴的な機能だと思ってます。
該当するコマンドは"Select Word at Caret "と"Unselect Word at Caret "です。標準のショートカットキーは「Ctrl+w」と「Ctrl+SHIFT+w」なのですが、Macなどでは他のショートカットキーに設定されています。特にMac OS Xの場合「cmd+w」に割り当てられているため「アプリケーションの終了(cmd+q) 」と隣り合わせという恐怖のショートカットキーと化しています。個人的には「Ctrl+w」は象徴的なショートカットキーなので、どのプラットフォームでも「Ctrl+w」に割り当てて使っています。とにかく多用するコマンドなので、ぜひともショートカットキーごと覚えておいて欲しいです。
壮大な前振りをしましたが、実際どのようなことをする機能かと言うと、カーソル位置の単語を選択します。ただそれだけです。選択状態のまま"Select Word at Caret "を繰り返し実行すると選択範囲が拡張していきます。"Unselect Word at Caret "はその逆で選択範囲を縮めていきます。
単純な機能ですが、選択範囲の拡縮が文脈を見て良い具合に選んでくれます。
図8 "Select Word at Caret"の実行例(クリックすると動きがわかります)
「Preferences / Editor / SmartKeys」の「Use "CamelHumps" words」を有効にするとキャメルケースを範囲選択の区切りとして認識します。
"Select/Unselect Word at Caret "はXML文書でも有効なので、ちょいと地味な手段ですが「ある範囲を別のタグで囲み直す」みたいな操作も可能です。
図9 「 ある範囲を別のタグで囲み直す」の操作例(クリックすると動きがわかります)
※ 囲み直したい領域を選択してカット/さらに領域拡張して別のタグを入力/カットした内容をペースト。
実に地味な機能ですし、似たような機能は他のIDEもありますが、Android Studioのそれはひと味違うと思っています。テキスト編集のクセは人それぞれですが、"Select Word at Caret "を使いこなすと段違いにはかどるので、是非とも身につけて欲しいです。
なお、Ecilpseでの相当機能は、以下のコマンドになります。
Select Word at Caret
「エンクロージング要素の選択(ALT+SHIFT+↑) 」または「前の要素を選択(ALT+SHIFT+←) 」と「次の要素を選択(ALT+SHIFT+→) 」です。
Unselect Word at Caret
「前回の選択を復元(ALT+SHIFT+↓) 」
[コラム]Surround selection on typing quote or brace
「Preferences / Editor / Smart Keys」にひっそり置いてある設定項目のことです(図10 ) 。
図10 「 Preferences/Editor/Smart Keys」設定画面
これまた地味な機能なのですが、この項目がONになっていると選択範囲を任意の囲み文字(',",(,{,[,<
)で囲みます。
図11 選択範囲を囲み文字で囲っていく例(クリックすると動きがわかります)
さらにすでに何らかの囲み文字で囲まれている文字列を囲み文字ごと選択すると、その囲み文字をタイプした囲み文字で置き換えます。
図12 すでに設置されている囲み文字を置き換える例(クリックすると動きがわかります)
置き換えの時はクォート文字は別のクォート文字に、カッコは別のカッコにしか置き換えできません(クォート文字をカッコには置き換えできない) 。それと囲み文字を削除することはできません。
教えてもらわなければ絶対気がつかない機能ですし、ホントに便利なのかは微妙なところではあります。ただ、こういうしょうも無い機能を律儀に用意してくれるところには好感が持てます。
矩形選択
メニューバーの「Editor → Column Selection Mode」を選択すると「矩形選択モード」になります。これはモードの切り替えなので、再度同じコマンド("Column Selection Mode ")を選択して解除しないと矩形選択モードのままになります。Eclipseの「ブロック選択」もモードの切り替え式なので違和感は無いと思います。
どういうわけか、このモード設定はエディタタブごとに行うようで、あるファイル(Foo.java
)で矩形選択モードを有効にしても、別のファイル(Bar.java
)に移れば矩形選択モードは引き継がれません(再度、Foo.java
に戻ると矩形選択モードになります) 。
矩形選択というくらいなので、図13 のように矩形範囲を選択して、この内容をカット、コピー&ペーストできます。
図13 矩形選択の例(クリックすると動きがわかります)
通常の範囲選択のときはあまり意識しませんが、選択範囲を指定した状態でキータイプすると、その範囲をタイプした文字に置き換えることができますね。これと同じ事が矩形選択モードでも可能です。
図14 矩形選択範囲を置き換える例(クリックすると動きがわかります)
※ 1列だけ選択してからタイプすると、単なる複数行への同時入力になります。
矩形選択つながりですが、Sublime Text のマルチセレクション が最先端な範囲選択なのでは?と思います。この機能をIntelliJにも実装して欲しいという要望はたくさんあり、次期バージョン(IDEA13)に実装される予定です。
IDEA-80056 Column selection mode improvement
Android StudioもIDEA13をベースにしているので、こちらもいずれマルチセレクションが使えるようになるかも知れませんね。
カーソルの上下移動に関する残念なお知らせ
矩形選択から、ちょっとだけ派生する話になります。第7回のステータスバーの説明 でも紹介しましたが、Android Studioはカラム位置を「全角・半角に関わりなく文字数 」で把握します。
そのため、全角文字が含まれている行をまたいだカーソルの上下移動で図15 のようなケースが起こりえます。
図15 カーソルの上下移動(クリックすると動きがわかります)
※ 文字数 としては同じカラム位置なのだが、全角・半角の違いでズレて移動したようにしか見えない。
「海外製のツールだから」とか「Java製だしね」などと考慮が抜けていた理由は想像付くのですが、EclipseやNetBeansではちゃんと処理できているだけに、正直恥ずかしく思います(これはIntelliJ系のIDE共通の不具合です) 。不思議な事に矩形選択のフリーカーソルモードの時は、カラム位置がずれたりせずに矩形として選択できます。
この全角・半角を区別せずカラム位置を決めてしまう不具合は、すでにチケットを上げています。投票(vote)が増えると直してもらえる可能性が上がりますので、賛同できる人はご協力をお願いします。
IDEA-87024 If there is a Japanese character, the movement zone of a cursor will shift.
囲みの削除
メニューバーの「Code → Unwrap/Remove...」です。これも地味ながら便利な機能で筆者のお気に入りのひとつなのですが、相変わらずショートカットキーが押しづらいです。そのため「SHIFT+Delete」か「SHIFT+Backspace」に割り当て直して使っています。
名前からどんな機能かは想像つくと思いますが、対象を囲んでいる要素を取り除きます。わかりやすいところで言うと
などです。モノがモノだけにどこでも反応するわけではありません。削除する対象がなければコマンドを実行しても何も起こりません。
実際に使ってみるのが一番わかりやすいので、効果がわかりやすいXMLの編集での例を図16 に示します。
図16 "Unwrap/Remove..."の例(クリックすると動きがわかります)
"Unwrap/Remove... "の素晴らしい点は、削除する対象が複数存在する場合に、それを候補にあげてくれることです。これの対になっている機能が "Surround With... "なのですが、こちらはそのような気の利いたことはしてくれません(ちょっと残念です) 。
文の完成
メニューバーの「Edit → Complete Current Statement」です。これも地味機能で、少しクドめに説明すると「コード補完などでほぼ命令文は完成したのだけれど、カーソル位置が行末にいないため、閉じ括弧やセミコロンが未入力状態な行を補完します」という機能です。伝わりました?
平たく言うと「行末に閉じ括弧やセミコロンを補填する機能」です。こちらも空気のように使う機能のため、ショートカットキーをより簡単に「SHIFT+Enter」あたりに割り当て直して使っています。
すでに行が完成している状態で、このコマンドを実行すると"Start New Line "と同じ振る舞いをします(現在行を維持したまま、改行して次行に移ります) 。
図17 "Complete Current Statement"の例(クリックすると動きがわかります)
地味機能の紹介が続きますが、閉じクォートや閉じ括弧、セミコロンなどはすでにタイプ済みの場合、重ね打ちしてもすり抜けていきます。文書で伝える自信が無いので 図18 を参照してください。
図18 行末記号のすり抜け(クリックすると動きがわかります)
※ カーソルキーで移動しているわけではなく、「 ");」とタイプしている。
行の結合
文字列やコメント文の中で改行を行うと、それぞれの文脈にあわせた継続処理を行います。
図19 行の分割の例(クリックすると動きがわかります)
メニューバーの「Edit → Join Lines」は、その反対の処理を行います。
図20 "Join Lines"の例(クリックすると動きがわかります)
※ 宣言文と代入文とを分けている箇所をひとつにまとめることもできます。
図20 の逆(宣言文と代入文にわける)を行う場合は、"Show Intention Actions "から「Split into declaration and assignment」を実行します。
まとめと次回の予告
Android Studioは、IDEにしては基本的なテキスト編集機能が充実しており、テキストエディタ顔負け!とまでは言いませんが、割りと良い勝負をしていると思います。さすがに起動の早さにおいてはテキストエディタの足下にも及びませんが、すでにAndroid Studioを立ち上げている状態なら、ちょっとしたテキストの編集はAndroid Studioで行っても、そう不自由することはないと思っています。
もう忘れてしまった人もいるかと思いますが、Android Studioはドラッグ&ドロップでプロジェクト外のファイルも編集することができます(第9回 参照) 。それだけに、先ほど紹介した「カーソルの上下移動の不具合」が惜しまれてなりませんね。
次回は今までのおさらいとして、ファイルやメソッドなどのいろいろな作成方法と今回保留にした比較について紹介します。