VSCode マルチカーソル・一括編集でコーディング速度を飛躍的に向上させる

Visual Studio Code(VSCode)のマルチカーソル機能と一括編集テクニックは、反復的なコーディング作業を劇的に効率化します。変数名の一括変更、データ構造の整形、HTMLの高速生成など、これらのテクニックを習得することで、従来の数倍の速度でコードを編集できるようになります。

本記事では、VSCodeのマルチカーソル操作、矩形選択、正規表現による一括置換、Emmet展開という4つの主要テクニックを、実践的なリファクタリングシナリオを交えて徹底解説します。

この記事で得られること

  • VSCode マルチカーソルの基本操作から応用テクニックまでの体系的な理解
  • 矩形選択(ボックス選択)を活用したデータ整形手法
  • 正規表現を使った高度な一括置換パターン
  • Emmet展開によるHTML/CSS高速コーディング
  • 実践的なリファクタリングシナリオでの活用例

前提条件と実行環境

VSCode マルチカーソル・一括編集テクニックを実践するための環境要件を確認します。

項目 要件
VSCode バージョン1.80以上を推奨
OS Windows 10/11、macOS 10.15以上、Linux
キーボード JIS配列またはUS配列
拡張機能 不要(すべてVSCode標準機能)

キー表記の凡例

本記事では、Windows/Macの両方に対応した表記を使用します。

表記 Windows Mac
Ctrl Ctrlキー Cmdキー
Alt Altキー Optionキー
Shift Shiftキー Shiftキー

VSCode マルチカーソルの基本操作

マルチカーソルは、VSCodeの最も強力な編集機能の1つです。複数のカーソルを同時に配置し、それぞれが独立して動作することで、並列的な編集が可能になります。

カーソル追加の基本ショートカット

操作 Windows Mac 用途
上にカーソル追加 Ctrl+Alt+↑ Cmd+Option+↑ 連続した行に対する編集
下にカーソル追加 Ctrl+Alt+↓ Cmd+Option+↓ 連続した行に対する編集
クリックでカーソル追加 Alt+クリック Option+クリック 任意の位置にカーソル配置
すべてのカーソルを解除 Esc Esc 通常の単一カーソルに戻る

選択に基づくカーソル追加

単語や文字列パターンに基づいてマルチカーソルを配置する方法です。

操作 Windows Mac 説明
次の一致を選択に追加 Ctrl+D Cmd+D 現在の選択と同じ文字列を1つずつ追加
次の一致をスキップ Ctrl+K Ctrl+D Cmd+K Cmd+D 現在の一致をスキップして次へ
すべての一致を選択 Ctrl+Shift+L Cmd+Shift+L 選択文字列の全出現箇所を選択
単語の全出現を選択 Ctrl+F2 Cmd+F2 カーソル位置の単語の全出現を選択
各行末にカーソル追加 Shift+Alt+I Shift+Option+I 選択範囲の各行末にカーソル配置

基本操作の実践例: 変数名の一括変更

以下のコードでuserNamecustomerNameに一括変更する手順を解説します。

1
2
3
4
const userName = "Alice";
console.log(userName);
const message = `Hello, ${userName}!`;
validateUser(userName);

手順:

  1. 最初のuserNameにカーソルを置く
  2. Ctrl+D(Mac: Cmd+D)を4回押して全箇所を選択
  3. customerNameと入力

結果:

1
2
3
4
const customerName = "Alice";
console.log(customerName);
const message = `Hello, ${customerName}!`;
validateUser(customerName);

この操作は1秒未満で完了します。手動で4箇所を編集する場合と比較して、時間短縮と入力ミス防止の両面で効果を発揮します。

矩形選択(ボックス選択)の活用

矩形選択は、テキストを列方向に選択する機能です。データの整形やフォーマット調整に威力を発揮します。

矩形選択の基本操作

操作 Windows Mac 説明
マウスで矩形選択 Shift+Alt+ドラッグ Shift+Option+ドラッグ マウスでドラッグして範囲を選択
キーボードで矩形選択 Ctrl+Shift+Alt+矢印 Cmd+Shift+Option+矢印 カーソル位置から矢印方向に選択
矩形選択モード切替 ステータスバー > Column Selection ステータスバー > Column Selection モードを維持した選択

矩形選択の実践例: CSVデータの加工

以下のCSVデータから特定の列だけを抽出・編集する例を示します。

元データ:

1
2
3
4
5
id,name,email,department
001,Alice,alice@example.com,Engineering
002,Bob,bob@example.com,Marketing
003,Carol,carol@example.com,Sales
004,Dave,dave@example.com,Engineering

name列だけを選択して加工する手順:

  1. 最初のAliceAにカーソルを置く
  2. Shift+Alt+↓(Mac: Shift+Option+↓)を3回押して下方向に選択
  3. Shift+Endで行末まで選択範囲を拡大
  4. 必要に応じて編集

矩形選択の実践例: インデント調整とプレフィックス追加

以下のようなリストに対して、先頭に番号を一括追加します。

元データ:

1
2
3
4
5
apple
banana
cherry
date
elderberry

手順:

  1. appleaにカーソルを置く
  2. Shift+Alt+↓(Mac: Shift+Option+↓)を4回押す
  3. カーソルが5行分の先頭に並ぶ
  4. 1. 2. 3. などを順に入力(または数字だけ入力してから別途加工)

代替手法(Shift+Alt+Iを活用):

  1. 全5行を選択
  2. Shift+Alt+I(Mac: Shift+Option+I)で各行末にカーソル配置
  3. Homeキーで各行の先頭へ移動
  4. 番号を入力

正規表現による一括置換

VSCodeの検索・置換機能は正規表現をサポートしており、複雑なパターンマッチングによる一括編集が可能です。

正規表現置換の基本

置換ダイアログはCtrl+H(Mac: Cmd+H)で開きます。正規表現を有効にするには、検索ボックス右側の.*アイコンをクリックするかAlt+R(Mac: Option+R)を押します。

キャプチャグループの活用

正規表現のキャプチャグループ()で一致した部分を、置換文字列で$1$2として参照できます。

例1: 関数呼び出しの形式変更

console.log("メッセージ")logger.info("メッセージ")に変換します。

項目
検索 console\.log\(([^)]+)\)
置換 logger.info($1)

例2: プロパティの形式変換

オブジェクトのプロパティをES6のショートハンド形式に変換します。

1
2
3
4
5
6
// Before
const obj = {
  name: name,
  age: age,
  email: email
};
項目
検索 (\w+): \1
置換 $1

結果:

1
2
3
4
5
6
// After
const obj = {
  name,
  age,
  email
};

大文字・小文字変換修飾子

VSCodeの正規表現置換では、キャプチャグループの大文字・小文字を変換する修飾子が使用できます。

修飾子 説明
\u 次の1文字を大文字化 $1\u$1
\l 次の1文字を小文字化 $1\l$1
\U 以降すべてを大文字化 $1\U$1
\L 以降すべてを小文字化 $1\L$1

例: スネークケースをキャメルケースに変換

user_nameuserNameに変換します。

項目
検索 _([a-z])
置換 \u$1

正規表現置換の実践例: import文の整理

散らばったimport文をソートしやすい形式に整理します。

Before:

1
2
3
4
import { useState } from 'react';
import axios from 'axios';
import { useEffect, useCallback } from 'react';
import lodash from 'lodash';

検索パターンで特定ライブラリのimportを抽出:

項目
検索 import .* from 'react';

これにより、Reactからのimportのみをハイライトし、統合作業の対象を特定できます。

Emmet展開によるHTML/CSS高速コーディング

EmmetはVSCodeに標準搭載されており、短い省略記法からHTML/CSSコードを瞬時に生成できます。

Emmetの基本構文

構文 説明 展開結果
要素名 要素を生成 div <div></div>
#id IDを付与 div#main <div id="main"></div>
.class クラスを付与 div.container <div class="container"></div>
> 子要素 ul>li <ul><li></li></ul>
+ 兄弟要素 h1+p <h1></h1><p></p>
* 繰り返し li*3 <li></li><li></li><li></li>
$ 連番 li.item$*3 <li class="item1">
{} テキスト p{Hello} <p>Hello</p>
[] 属性 a[href=#] <a href="#"></a>

Emmetの展開方法

操作 Windows Mac 説明
Tab展開(設定必要) Tab Tab 省略記法を展開(要設定)
コマンドから展開 Ctrl+Space Ctrl+Space サジェストから選択して展開
展開コマンド直接実行 Ctrl+Shift+P > “Emmet: Expand” Cmd+Shift+P > “Emmet: Expand” コマンドパレットから実行

Tab展開を有効にするには、settings.jsonに以下を追加します。

1
2
3
{
  "emmet.triggerExpansionOnTab": true
}

Emmetの実践例: ナビゲーションメニューの生成

以下の省略記法で、完全なナビゲーション構造を瞬時に生成できます。

入力:

1
nav.navbar>ul.nav-list>li.nav-item*5>a.nav-link[href="#section$"]{Menu $}

Tab展開後:

1
2
3
4
5
6
7
8
9
<nav class="navbar">
  <ul class="nav-list">
    <li class="nav-item"><a href="#section1" class="nav-link">Menu 1</a></li>
    <li class="nav-item"><a href="#section2" class="nav-link">Menu 2</a></li>
    <li class="nav-item"><a href="#section3" class="nav-link">Menu 3</a></li>
    <li class="nav-item"><a href="#section4" class="nav-link">Menu 4</a></li>
    <li class="nav-item"><a href="#section5" class="nav-link">Menu 5</a></li>
  </ul>
</nav>

手動で記述すると数分かかる構造が、1行の省略記法から1秒で生成されます。

Emmetの実践例: フォーム構造の生成

入力:

1
form.contact-form>div.form-group*3>(label[for="field$"]{Field $}+input#field$[type="text"][name="field$"][placeholder="Enter field $"])

展開結果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<form class="contact-form">
  <div class="form-group">
    <label for="field1">Field 1</label>
    <input type="text" name="field1" id="field1" placeholder="Enter field 1">
  </div>
  <div class="form-group">
    <label for="field2">Field 2</label>
    <input type="text" name="field2" id="field2" placeholder="Enter field 2">
  </div>
  <div class="form-group">
    <label for="field3">Field 3</label>
    <input type="text" name="field3" id="field3" placeholder="Enter field 3">
  </div>
</form>

EmmetとマルチカーソルのM合わせ技

Emmetはマルチカーソルとの組み合わせでさらに強力になります。

シナリオ: 複数の要素を同時にタグで囲む

  1. 囲みたいテキストを含む複数行を選択
  2. Shift+Alt+Iで各行末にカーソル配置
  3. Ctrl+Shift+Pで「Emmet: Wrap with Abbreviation」を実行
  4. div.wrapperなどの省略記法を入力

実践的なリファクタリングシナリオ

これまでのテクニックを組み合わせた、実際の開発現場で遭遇するリファクタリングシナリオを紹介します。

シナリオ1: オブジェクトプロパティの一括変換

レガシーコードのプロパティ名をキャメルケースに統一します。

Before:

1
2
3
4
5
6
const config = {
  api_base_url: "https://api.example.com",
  max_retry_count: 3,
  request_timeout_ms: 5000,
  enable_debug_mode: false
};

手順:

  1. Ctrl+Hで置換ダイアログを開く
  2. 正規表現を有効化(Alt+R
  3. 検索: _([a-z])
  4. 置換: \u$1
  5. 「すべて置換」を実行

After:

1
2
3
4
5
6
const config = {
  apiBaseUrl: "https://api.example.com",
  maxRetryCount: 3,
  requestTimeoutMs: 5000,
  enableDebugMode: false
};

シナリオ2: 関数シグネチャの一括更新

複数の関数に共通の引数を追加します。

Before:

1
2
3
function fetchUser(id) { /* ... */ }
function updateUser(id, data) { /* ... */ }
function deleteUser(id) { /* ... */ }

手順:

  1. fetchUserupdateUserdeleteUser(の直前にそれぞれカーソルを配置(Alt+クリックで3箇所)
  2. キーで(の直後に移動
  3. options, と入力(3箇所同時に追加される)

After:

1
2
3
function fetchUser(options, id) { /* ... */ }
function updateUser(options, id, data) { /* ... */ }
function deleteUser(options, id) { /* ... */ }

シナリオ3: JSXコンポーネントの属性追加

複数のコンポーネントに共通のpropsを追加します。

Before:

1
2
3
<Button onClick={handleClick}>Submit</Button>
<Button onClick={handleReset}>Reset</Button>
<Button onClick={handleCancel}>Cancel</Button>

手順:

  1. 最初のonClickを選択
  2. Ctrl+Dを2回押して3箇所を選択
  3. Homeキーで各行の<Buttonの直後に移動
  4. disabled={isLoading}と入力

After:

1
2
3
<Button disabled={isLoading} onClick={handleClick}>Submit</Button>
<Button disabled={isLoading} onClick={handleReset}>Reset</Button>
<Button disabled={isLoading} onClick={handleCancel}>Cancel</Button>

シナリオ4: 配列データからオブジェクト配列への変換

プレーンな配列をオブジェクトの配列に変換します。

Before:

1
2
3
4
5
6
const items = [
  "Apple",
  "Banana",
  "Cherry",
  "Date"
];

手順:

  1. 4行の文字列部分を選択
  2. Shift+Alt+Iで各行末にカーソル配置
  3. Homeキーで行頭へ
  4. { name: と入力
  5. Endキーで行末へ
  6. }と入力

After:

1
2
3
4
5
6
const items = [
  { name: "Apple" },
  { name: "Banana" },
  { name: "Cherry" },
  { name: "Date" }
];

シナリオ5: CSSクラスの一括リネーム

BEM記法へのリファクタリングを行います。

Before:

1
2
3
4
5
6
7
8
<div class="card">
  <div class="card-header">
    <h2 class="card-title">Title</h2>
  </div>
  <div class="card-body">
    <p class="card-text">Content</p>
  </div>
</div>

手順:

  1. Ctrl+Hで置換ダイアログを開く
  2. 検索: card-
  3. 置換: card__
  4. 「すべて置換」を実行

After:

1
2
3
4
5
6
7
8
<div class="card">
  <div class="card__header">
    <h2 class="card__title">Title</h2>
  </div>
  <div class="card__body">
    <p class="card__text">Content</p>
  </div>
</div>

トラブルシューティング

マルチカーソルや一括編集で起こりがちな問題と解決策を紹介します。

Ctrl+Alt+矢印が動作しない

原因: グラフィックドライバ(特にIntel/NVIDIA)が同じショートカットを画面回転に割り当てている場合があります。

解決策:

  1. グラフィックドライバの設定でホットキーを無効化
  2. VSCodeのキーバインドを変更(Ctrl+K Ctrl+Sでキーボードショートカット設定を開く)

正規表現が期待どおりに動作しない

原因: 特殊文字のエスケープ漏れが多い原因です。

解決策:

以下の文字は\でエスケープが必要です。

1
. * + ? ^ $ { } [ ] \ | ( )

例: console.logを検索する場合はconsole\.logと記述します。

Emmetが展開されない

原因: ファイルタイプがEmmet対応言語として認識されていない可能性があります。

解決策:

settings.jsonに以下を追加します。

1
2
3
4
5
6
{
  "emmet.includeLanguages": {
    "javascript": "javascriptreact",
    "vue-html": "html"
  }
}

効率化のためのVSCode設定

マルチカーソル・一括編集をより快適に使うための推奨設定を紹介します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
  // Emmet展開をTabキーで有効化
  "emmet.triggerExpansionOnTab": true,

  // マルチカーソルの修飾キーをCtrlに変更(Altの代わり)
  "editor.multiCursorModifier": "ctrlCmd",

  // 選択範囲のハイライトを強調
  "editor.selectionHighlight": true,

  // 検索時に選択テキストを自動入力
  "editor.find.seedSearchStringFromSelection": "always",

  // 正規表現検索時のマッチハイライト
  "editor.find.autoFindInSelection": "multiline",

  // ミニマップで選択範囲を表示
  "editor.minimap.showSlider": "always"
}

まとめ

VSCodeのマルチカーソル・一括編集テクニックは、習得に多少の時間を要しますが、一度身につければ日々のコーディング効率を大幅に向上させます。

習得の優先順位:

  1. Ctrl+Dによる同一文字列の選択追加(最頻出)
  2. Ctrl+Shift+Lによる全出現箇所の選択(一括変更時)
  3. Shift+Alt+Iによる各行末へのカーソル配置(データ整形時)
  4. 正規表現置換とキャプチャグループ(パターンベースの変換)
  5. Emmet展開(HTML/CSS作成時)

これらのテクニックを組み合わせることで、手動では数分から数十分かかる編集作業を数秒で完了できるようになります。最初は意識的に使う必要がありますが、習慣化すれば無意識にこれらの操作を選択できるようになり、開発生産性が飛躍的に向上します。

参考リンク