【テクニカル・上級編】PhpStormの『Multi-Cursor』と『Selection』を使いこなす:複雑な置換作業を瞬殺するテクニック – 総合開発環境(IDE)生産性向上バイブル

正規表現の呪縛からの解放:PhpStormマルチカーソル・セレクション極限活用術

開発現場において、数千行に及ぶレガシーなDTO(Data Transfer Object)クラスのプロパティ群に、突然`public`から`private`への変更、あるいは型の付与、属性(Attributes)の一括挿入が要求されたとき、あなたはどうするか。

脊髄反射で正規表現の置換ウィンドウを開き、キャプチャグループ(`$1`, `$2`)をこねくり回し、シンタックスエラーに怯えながら「一発でマッチしなかった」絶望を味わうのは、今日で終わりにしよう。

JetBrains製IDEの真髄は、IntelliJプラットフォームが持つ圧倒的なDOM(Document Object Model)解釈とAST(Abstract Syntax Tree)の同期速度にある。正規表現は文字列の「パターン」しか見ないが、PhpStormのマルチカーソル(Multi-Cursor)とスマート・セレクションは、コードの「構造」を理解しながらカーソルを多次元に拡張する。

本記事では、プロフェッショナルが日々の開発で指の反射レベルで使っているマルチカーソル&セレクションの極限テクニックを、内部アーキテクチャの挙動と共に解説する。

—

1. 内部アーキテクチャ:なぜPhpStormのマルチカーソルは爆速なのか

多くのテキストエディタ(VS Code含む)におけるマルチカーソルは、単一のテキストバッファに対する複数のインデックス位置の管理に留まることが多い。そのため、巨大なファイル(数万行のSQLインポートやログ、巨大な配列定義など)でマルチカーソルを展開すると、UIスレッドがロックされ、タイピング遅延(Input Lag)が発生する。

しかし、PhpStorm(IntelliJ IDEAベース)は異なる。

  • Virtual File System (VFS) との調停: カーソル位置はASTのオフセット(Offset)として保持される。
  • Command Processorのトランザクション: 複数カーソルで行われた編集は、単一のUndo/Redoトランザクション(`UndoableAction`)としてアトミックにラップされる。これにより、メモリ上のパッチ適用が極限まで最適化され、数千箇所同時に文字を入力しても、O(1)に近い感覚で描画が追従する。

この低レイヤの堅牢性があるからこそ、私たちは恐怖心なく、コードベース全体をマルチカーソルで切り刻むことができるのだ。

—

2. 現場で即座に使える「秒殺」テクニック4選

テクニック A: 縦方向の圧倒的支配「Column Selection Mode」と「Add Caret」

次のような、レガシーな連想配列や設定ファイルのキー群に、一斉にプレフィックスや特定の処理を施したい場面を想像してほしい。

// 変換前
class Config {
const HOST = ‘localhost’;
const PORT = 3306;
const USER = ‘root’;
const PASS = ‘secret’;
}

これを、すべてビルドインの定数ではなく、`private static` なプロパティへ一括変換する。

1. Shift + Alt + 挿入(macOS: Option + Shift + 矢印ドラッグ) で、変数の先頭行から最終行まで垂直にカーソルをドロップする。
2. または、`Alt`を押しながらマウスドラッグで縦方向を選択する。
3. この状態でタイピングを開始すれば、すべての行に同時に文字が挿入される。

// 変換後(マルチカーソルで一瞬で展開)
class Config {
private static string $host = ‘localhost’;
private static int $port = 3306;
private static string $user = ‘root’;
private static string $pass = ‘secret’;
}

Architect’s Note:
単なる矩形選択(Column Selection)を超え、`Ctrl + Alt + Shift + 矢印`(macOS: `Option + Shift + Command + 矢印`)による「Column Selection Mode」を有効にすると、IDEのインテリセンス(コード補完)が各カーソル位置で独立して動作する。つまり、行ごとに異なるコンテキストであっても、補完候補を出し分けながら同時編集が可能になる。

—

テクニック B: 「Select Next Occurrence (Alt + J)」による部分一致の外科手術

正規表現を使いたくなる衝動に最も駆られるのが、「特定のキーワードだけを選択して置換したい」というシチュエーションだ。しかし、グローバル置換(`Ctrl + R`)を使うと、意図しないスコープまで置換されてバグの温床になる。

ここで `Alt + J`(macOS: `Control + G`)の出番だ。

実践シナリオ: 配列のキー名を変更しつつ、値はそのまま維持する

$payload = [
‘user_id’ => $request->get(‘user_id’),
‘user_name’ => $request->get(‘user_name’),
‘user_email’ => $request->get(‘user_email’),
];

1. 最初の `’user_’` の部分をダブルクリック、または `Ctrl + W`(Extend Selection)で選択する。
2. `Alt + J` を3回叩く。これにより、マッチする文字列のインスタンスが順番に次のカーソルとして追加されていく。
3. もし余計な部分まで選択されたら、`Alt + Shift + J`(macOS: `Control + Shift + G`)で直前の選択を解除(Unselect)できる。
4. この状態で `account_` とタイピングすれば、選択された箇所だけが同時に書き換わる。

この「インクリメンタルにカーソルを這わせる」アプローチは、コードの文脈を人間の目で確認しながら実行するため、誤爆が100%発生しない。

—

テクニック C: 「Split into Lines」で改行区切りのテキストを一撃で配列化する

APIドキュメントやスプレッドシートからコピー&ペーストした、以下のようなカンマ区切り、あるいは改行区切りのリスト。これをPHPの配列定義に直す作業ほど退屈なものはない。

apple
banana
orange
grape

これを一瞬で `$list = [‘apple’, ‘banana’, ‘orange’, ‘grape’];` に仕立て上げる。

1. 上記テキストを選択し、コピー。
2. PHPファイル上で `Ctrl + Shift + V`(Paste from History)を叩き、複数行を一度に貼り付ける。または、普通に貼り付けて全行を選択。
3. ここで、`Ctrl + Shift + Alt + J`(macOS: `Control + Command + G`) を押す。これにより、選択範囲内のすべての行の末尾にカーソルが一斉に出現する。
4. `’`(シングルクォート)を入力し、行頭に戻って `[‘` を付与、最後に全体を囲む。

あるいは、さらにスマートな方法がある。
複数行を選択した状態で、`Alt + Shift + G`(全行の末尾にカーソルを置くショートカットの割り当て例) を実行し、`’, ‘` をタイピングするだけで、CSVデータを瞬時に配列リテラルへ変換できる。

—

テクニック D: 宣言型一括編集「Search Everywhere」からのマルチカーソル直結

PhpStormの真骨頂は、検索機能とマルチカーソルの融合にある。
`Double Shift`(Search Everywhere)で任意のシンボルを検索し、検索結果のプレビュー画面でそのまま複数選択(`Alt + Shift + Click`)を行うと、プロジェクト全体の該当箇所を開くことなく、検索結果リストの段階でマルチカーソル編集の準備ができる。

大規模リファクタリングにおいて、ファイルを開いて閉じての往復運動を完全に排除する究極のハックである。

—

3. 生産性を極限まで高めるためのキーマップ最適化(推奨設定)

デフォルトのキーバインドは、OSや他のエディタとの競合により、指のストレッチ(腱鞘炎の原因)を引き起こしやすい。最高峰の開発環境を目指すなら、以下のキーアサインへのカスタマイズを強く推奨する。

PhpStormの `Settings > Keymap` から以下のように再定義せよ。

| アクション名 (Settings内検索ワード) | デフォルト (Win/Linux) | デフォルト (macOS) | 推奨カスタム(全OS共通化のすすめ) | 理由・効果 |
| :— | :— | :— | :— | :— |
| Add Caret to Next Occurrence | `Alt + J` | `Control + G` | `Cmd/Ctrl + D` (VSCode風に寄せる) | 最も頻繁に使うため、親指と人差し指のホームポジションから最も近い位置へ。 |
| Select All Occurrences | `Ctrl + Alt + Shift + J` | `Control + Cmd + G` | `Cmd/Ctrl + Shift + D` | 同一ファイル内の一括置換の主力を担う。 |
| Clone Caret Below / Above | `Ctrl + Alt + Down/Up` | `Option + Shift + Down/Up` | `Ctrl + Shift + Alt + 矢印` | 縦方向のブロック選択を瞬時に呼び出す。 |

—

4. エキスパート向け:Live Templatesとマルチカーソルのシナジー

マルチカーソルは単体でも強力だが、PhpStormの Live Templates(ライブテンプレート) と組み合わせることで、定型コードの生成能力は「自動化」の領域に到達する。

例えば、複数のプロパティに対して一括でGetter/Setterを定義する際、テンプレート変数に `$VAR$` を設定し、そこにマルチカーソルで値を流し込むスクリプトを書く必要すらない。

PhpStormには標準で `iter`(foreachスニペット)や `surround` が備わっているが、次のようなカスタムライブテンプレートを定義しておくと、マルチカーソルとの相乗効果で無双できる。

テンプレート名: `mprop` (Multi Property Definition)

/

  • @var $TYPE$

/
private $TYPE$ $$NAME$;

このテンプレートを展開し、変数 `$TYPE$` と `$NAME$` の位置にマルチカーソルを同期させることで、型の異なる複数のプロパティ定義を秒速で量産できる。IDEの型推論エンジンがバックグラウンドで動いているため、補完エラーの心配もない。

—

5. まとめ:指先の迷いを消し去り、コードの構造と対話せよ

正規表現は強力なツールだが、それは「テキストのパース」が必要な場合の話だ。コードの記述、リファクタリング、構造の変更において、私たちは「文字列」ではなく「AST(抽象構文木)」を操作しているという意識を持つべきだ。

PhpStormのマルチカーソルとスマート・セレクションは、あなたの思考スピードとコードの変更速度のギャップをゼロにするための装置である。

今日から `Alt + J` とカラム選択を指に叩き込み、正規表現ウィンドウを開く無駄な時間を、より高度なアーキテクチャ設計やビジネスロジックの構築へと全投入してほしい。それこそが、真にツールを使い倒すエンジニアの姿である。

タイトルとURLをコピーしました