Emmet: 省略記法の展開 — コードに命を吹き込むTabキー

最初の13回を通じてul>li*3のような省略記法の書き方を学びましたが、すべてはエディタの中で待機しているだけで、実際にはまだ何も「展開」されていません。このレッスンではEmmetの最初のコアアクション:省略記法の展開を教えます — 省略記法を実際のHTML/CSSに変えるキーアクションです。Tabキーはこのアクションの魂です。習得すれば、あなたの1行の省略記法が瞬時に完全なコードに変わります。

1. 学習内容


2. あるフロントエンド開発者の実話

(1) 課題:省略記法を入力し、Tabを押しても…何も起きない

アリスはEmmetの構文を学び終えたばかりです。興奮してVSCodeで新しいtest.htmlを作成し、div.container>h1{Hello}と入力して、Tabを押して展開されるのを見ようとします。Tabを押す — インデントされます。もう一度Tabを押す — またインデントされます。5回のTab押下後も何も起きません。省略記法の書き方を間違えたのかと思い、ul>li*3a[href="#"]を試します — どれも動作しません。

彼女はVSCodeでEmmetが有効になっていないと思い、GitHubのissueを検索し始めます。するとTabキー展開の条件が予想よりも複雑であることがわかりました。3つの一般的な原因:

  1. ファイルが.html拡張子で保存されていない(VSCodeは拡張子のないファイルをHTMLとして認識しない)
  2. Tabを横取りするプラグインがインストールされている(例:古いVETURバージョン、TabNine AI補完)
  3. カーソルの後ろに文字がある(Tabはインデントを優先する)

アリスは最終的にコマンドパレット(Ctrl+Shift+P)を開き、手動でEmmet: 省略記法の展開を実行し、4行のHTMLが表示されるのを見ます。彼女は考えました:省略記法の展開は明らかに最も頻繁に使用するアクションなのに、なぜTabが失敗するのか、どうトラブルシューティングするのかを知らなかった — これはどのEmmetチュートリアルもスキップできない最初のアクションです。

(2) 省略記法の展開による解決策

省略記法の展開はEmmetツールキットのコアアクションです — CSSライクな省略記法(ul>li*3)を完全なHTML/XML/CSSコードに変換します。これは他のすべてのEmmetアクション(Wrap、Balanceなど)が依存する基盤です。

アリスの解決策は3ステップで構成されます:

  1. ファイルタイプを確認.html / .css拡張子で保存する
  2. 競合プラグインをチェック:TabNine、レガシーVETURなどTabを横取りするプラグインを無効にする
  3. フォールバックを知る:各エディタにはコマンドパレットフォールバックがある(例:VSCodeのEmmet: 省略記法の展開

トリガーキーと失敗トラブルシューティングを習得した後、アリスはul.nav>li*3>a{リンク $}と入力し、Tabを押すと、3行の完全なHTMLが1秒で表示されます。彼女は今やナビゲーションメニューを手打ちで30秒かかっていたのを1行の省略記法で書けるようになりました — 30倍の速度向上

(3) メリット

省略記法の展開はEmmetチュートリアルで最も重要な「分水嶺」です — 最初の13回はすべて「入力」についてでしたが、このレッスンからは「展開 + 編集」に移行します。習得すれば:1行の省略記法が5〜50行のコードを折りたたみ、HTMLスケルトン構築が5分から10秒に短縮されます。このレッスンだけで、アリスは5段落の記事ページのHTMLコンテナ(article>header>h1+meta+time+nav)を90秒ではなく8秒で書きます。


3. 省略記法の展開のコア定義

省略記法の展開はEmmetツールキットで最も頻繁に使用されるアクションです — CSSライクな省略記法(ul>li*3)を現在のドキュメント構文(HTML/CSS/XML)に基づいて完全なコードに展開します。

次元 詳細
目的 CSSライクな省略記法を完全なHTML/XML/CSSコードに展開する
トリガーキー Tab(VSCode/WebStormデフォルト)。Ctrl+E(Sublimeデフォルト)
前提条件 ファイルタイプ認識 + 有効な省略記法構文 + カーソルがエディタ内
エディタカバレッジ VSCode、WebStorm、Sublime、Atom、Bracketsなど10以上の主要エディタ
展開出力 タブストップ(編集可能ポイント)を含み、Tabキーによるジャンプナビゲーションをサポート
📌 ポイント:省略記法の展開は単純な「コード補完」ではありません — 行全体を書き換えて展開結果にします。カーソルが文字のある行の途中にある状態でTabを押すと、Emmetはカーソルの後ろに文字があるかどうかをチェックします。文字がない場合のみ展開がトリガーされます。これは初心者にとって最も一般的な落とし穴です — ul>li*3の途中にカーソルを置いてTabを押しても展開��トリガーされません。カーソルは行の最後になければなりません。


4. 4つのトリガー方法

省略記法の展開には、エディタやシナリオに応じて4つのトリガー方法があります。

(1) Tabキー(デフォルト、最も一般的)

VSCode、WebStorm、AtomなどはデフォルトでTabキーを省略記法の展開にマッピングしています。前提条件

条件 説明
ファイルタイプ認識 ファイル拡張子が.html .css .jsx .tsx .vueなど
カーソルが行末 カーソルが省略記法の途中にあってはいけない(さもないとEmmetは通常のTabインデントとして扱う)
競合プラグインなし 一部のAI補完プラグイン(TabNine、Codeium)がTabを横取りする

(2) Ctrl+E(代替、Sublimeデフォルト)

Sublime TextはデフォルトでTabをインデントに使用するため、省略記法の展開はCtrl+Eでトリガーされます。VSCodeユーザーもTabをCtrl+Eにリマップできます(セクション(4)参照)。

(3) コマンドパレット(フォールバック)

各エディタにはコマンドパレットエントリポイントがあります。VSCodeではCtrl+Shift+P → 「Emmet: 省略記法の展開」と入力します。これは最も信頼性の高いトリガー方法です — Tabの競合、ファイルタイプ問題、プラグイン干渉の影響を受けません。

(4) カスタムショートカット(keybindings.json)

VSCodeのkeybindings.jsonを使用して省略記法の展開を任意のショートカットにマッピングできます:

JSON
[
  {
    "key": "ctrl+e",
    "command": "editor.emmet.action.expandAbbreviation",
    "when": "editorTextFocus && !editorReadonly"
  }
]
💡 ヒント:when条件editorTextFocus && !editorReadonlyは「カーソルがエディタテキスト領域にあり、ファイルが書き込み可能」を意味します。この制約構文はkeybindings.jsonの標準であり、コマンドパレットやファイル名入力フィールドなどのコンテキストでの誤トリガーを防ぎます。


5. 4エディタでのトリガーキー比較

Emmetのコアの強みはエディタ非依存であることです — 同じ省略記法ul>li*3がVSCode、WebStorm、Sublimeで同一に展開されます。唯一の違いはトリガーキー設定方法にあります。

エディタ Tabトリガー 代替トリガー コマンドパレット 備考
VSCode ✅ デフォルト ❌(keybindings.jsonが必要) Ctrl+Shift+PEmmet: 省略記法の展開 1.0+からデフォルト有効
WebStorm / IntelliJ ✅ デフォルト Ctrl+Alt+Space Ctrl+Shift+AEmmet コード補完を優先
Sublime Text ❌(Tabはインデント) Ctrl+E Ctrl+Shift+Pemmet: expand Emmetプラグインのインストールが必要
Atom ✅ デフォルト Ctrl+Shift+PEmmet: Expand 1.60+から内蔵
⚠️ 注意:WebStormではTabキーがコード補完に優先的に使用されます。補完ポップアップが表示��れるのを待ち、Escを押して閉じてから、Tabを押してEmmet展開をトリガーする必要があります。直接トリガーするには、代替のCtrl+Alt+Spaceを使用するか、コマンドパレットから呼び出します。


6. 動作しない場合:4つの一般的な失敗シナリオ

最も一般的な初心者の落とし穴 — Tabを押しても何も起きません。最も頻繁な4つの失敗シナリオ:

シナリオ 症状 原因 解決策
未認識ファイル .html/.css拡張子なし VSCodeが自動検出しない .html拡張子で保存
間違ったカーソル位置 カーソルが省略記法の途中 Emmetが通常のTabとして扱う まずカーソルを行末に移動
コメント内 省略記法が<!-- -->内に書かれている コメント内容は展開されない 省略記法をコメントの外に移動
Tab横取り TabNine/CodeiumがTabをキャプチャ サードパーティプラグインの優先度が高い プラグインを無効にするかショートカットを変更

(1) 未認識ファイル

VSCodeはファイル拡張子で言語を判別します。拡張子のないファイル(例:test)はHTMLとして認識されず、Emmetは動作しません。修正test.htmlとして保存するか、右下隅から手動で言語を選択します。

(2) 間違ったカーソル位置

省略記法の途中にカーソルがある状態でTabを押すと、Emmetはそれを展開ではなく「2文字間へのTab挿入」(インデント)として扱います。修正:まずEndを押して行末にジャンプし、それからTabを押します。

(3) コメント内

HTML
<!-- div.container -->

カーソルがコメント内にある状態でTabを押しても、コメント化されたテキス��は展開されません。修正:省略記法をコメントの外に移動するか、コマンドパレットをフォールバックとして使用します。

(4) Tab横取り

AI補完プラグイン(TabNine、Codeium、GitHub Copilotなど)はTabを優先的に処理し(「補完提案の受け入れ」のため)、EmmetのTab横取りが失敗します。修正:これらのフ�ァグインを無効にするか、コマンドパレットをフォールバックとして使用します。


7. ハンズオン例

以下の4つの例で省略記法の展開のコアシナリオをカバーします。

▶ サンプル: 基本的な展開 div.container(難易度:★)

最も一般的な展開 — HTMLファイルでdiv.containerと入力し、Tabを押すと1行がクラス付きのdivになります。

省略記法:

HTML
div.container

展開結果:

HTML
<div class="container"></div>

出力:

TEXT 📖 参照専用
分解:`div.container`では、`div`はタグ名、`.container`はクラス省略記法です。Emmetは`.`をクラス属性として解析し、`<div class="container"></div>`を出力します。展開されたタグは**空**(コンテンツなし)で、カーソルは`<div>`の内側の`</div>`の前に配置されます(これは第16回でカバーする「次の編集ポイント」機能です)。これはEmmetの最もシンプルで最も高頻度な展開シナリオです。

▶ サンプル: HTMLリスト構造 ul>li*3(難易度:★)

HTMLファイルで乗算付きネスト構造を展開 — 1行で3項目のリストを生成します。

省略記法:

HTML
ul>li*3

展開結果:

HTML
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>

出力:

TEXT 📖 参照専用
分解:`ul>li*3`は3つの部分で構成されます:① `ul`は親タグ、② `>`は子ネスト、③ `li*3`は子タグ`li`を3回繰り返し。Emmetは1つの`ul`が3つの`li`要素を含む構造に展開します��子タグの**2スペースインデント**(Emmetのデフォルトインデント)��注意してください。これはEmmetの「コンテキスト認識」機能です — HTMLの`<ul>`内ではデフォルトコンテキストが`<li>`であるため、タグ名を省略することもできます(`ul>*3`も`ul>li*3`に展開されます)。暗黙的タグ名につい��は第3回で詳しく説明しました。

▶ サンプル: CSS省略記法 m10-20(難易度:★)

CSSファイルでTabを押す — 1行でマージン省略記法を書きます。

省略記法:

CSS
m10-20

展開結果:

CSS
margin: 10px 20px;

出力:

TEXT 📖 参照専用
分解:`m10-20`はCSS省略記法です — `m`は`margin`の正確な省略記法(Emmetの辞書で定義)、`10-20`は2つの値(px単位を自動付加)。Emmetは`margin: 10px 20px;`(上下10px、左右20px)を推論します。これは省略記法の展開におけるCSS省略記法の典型的な応用です — 同じアクションがHTML省略記法とCSS省略記法の両方を展開します。Emmetは**現在のファイルタイプ**に基づいてコンテキストがHTMLかCSSかを判断します。これは第11回〜13回で学んだCSS省略記法と一致します。

▶ サンプル: カスタムキーバインド Tab → Ctrl+E(難易度:★★)

VSCodeのkeybindings.jsonで省略記法の展開をCtrl+Eにリマップします — Tabキーが他のプラグインと競合するユーザーに最適です。

変更ファイル:keybindings.json(VSCodeコマンドパレット → Preferences: キーボードショートカットを開く(JSON)

JSON
[
  {
    "key": "ctrl+e",
    "command": "editor.emmet.action.expandAbbreviation",
    "when": "editorTextFocus && !editorReadonly"
  }
]

変更後の動作:

ショートカット トリガーされるアクション
Tab デフォルト動作(インデント、Emmetは展開しない)
Ctrl+E Emmet: 省略記法の展開(省略記法を展開)

出力:

TEXT 📖 参照専用
分解:この例は標準的なkeybindings.jsonの使用方法を示します。`key`はショートカット文字列(Tabは`"tab"`と表記)、`command`はVSCodeのコマンドID(`editor.emmet.action.expandAbbreviation`はEmmetの内部展開コマンド)、`when`はトリガー条件(カーソルがエディタテキスト領域 + ファイル書き込み可能)。変更後、Tabはデフォルトのインデント動作を復元し、Emmet展開はCtrl+Eに委譲されます。この「Tabバインド解除」パターンはTabがTabNine/CopilotなどのAI補完プラグインと競合するシナリオに適しています。注意:カスタムショートカットはデフォルトのTabトリガーを**上書きしません** — VSCodeのEmmetは「カーソルが行末 + Tab」を優先します。Tabトリガーを完全に無効にするには、`emmet.triggerExpansionOnTab`をfalseに設定します。

8. 完全な例:ランディングページのヒーローセクションを1行で書く

すべての省略記法の展開メカニズムを実際の「ランディングページヒーローセクション」に適用します — 1行の省略記法が完全なHTMLブロックに展開されます。

▶ サンプル: ヒーローセクションHTMLコンテナ(難易度:★★)

省略記法:

HTML
section.hero>div.container>(h1{Hello World})+p.lead{This is a landing page.}+a.btn.btn-primary[href="#cta"]{Get Started}

展開結果:

HTML
<section class="hero">
  <div class="container">
    <h1>Hello World</h1>
    <p class="lead">This is a landing page.</p>
    <a href="#cta" class="btn btn-primary">Get Started</a>
  </div>
</section>

出力:

TEXT 📖 参照専用
分解:この例は省略記法の展開の実際のフルアプリケーションです。`section.hero>div.container>(h1{Hello World})+p.lead{...}+a.btn.btn-primary[href="#cta"]{...}`は5つのEmmetメカニズムを1行で組み合わせています:① `section.hero` — タグ + クラス、② `>` — 子ネスト、③ `()` — グループ化(3つの兄弟ノードのスコープを分離)、④ `+` — 兄弟ノード、⑤ `{text}`テキストコンテンツ + `[attr=val]`カスタム属性 + 複数クラス(`.btn.btn-primary`)。展開結果は完全なSaaSランディングペ��ジヒーローセクションです — 4つのセマンティックHTMLタグ、3つのクラス名、1つのCTAリンク。構造全体が1行約80文字から7行のHTMLになります(Emmetのデフォルト2スペースインデント)。このHTMLを手打ちすると60〜90秒かかります(クラススペル、属性順序、インデント調整を含む)。Emmetでは1行の省略記法 + 1回のTab押下 = 2秒。**速度向上30〜45倍**。これが「構文」と「エディタ」の両方のレイヤーにわたる省略記法の展開の効率の究極の形です。

❓ よくある質問

Q Tabを何度も押しても反応がありません — Emmetが有効になって��ませんか?
A まず、ファイルが.html / .css / .jsx / .tsx / .vue拡張子または他のEmmetサポート拡張子で保存されていることを確認してください(VSCodeは拡張子で言語を識別します)。次に、カーソルが省略記法の末尾(行全体の末尾)にあることを確認してください — Endを押して末尾にジャンプし、それからTabを押します。最後に、TabNineやCodeiumなどのTab横取りプラグインをチェックします。それでもダメな場合は、コマンドパレットフォールバックを使用してください:Ctrl+Shift+PEmmet: 省略記法の展開。これが動作する場合、問題は設定関連です。
Q TabがAI補完ツール(GitHub Copilot、TabNine)と競合します — どう対処すればよいですか?
A EmmetのTabトリガー条件は「カーソルが行末 + 有効な省略記法構文」です。AI補完のTabトリガー条件は「右側に提案が表示されている」です。カーソルが省略記法の末尾にある場合(右側に文字がない)、Tabを押すとEmmetが優先されるはずです。AI提案が表示されている場合は、まずEscを押して閉じてからTabを押します。両方のTabトリガーを有効にしないことを推奨します — 一方をプライマリとして選択し、もう一方をリマップします。VSCodeユーザーはkeybindings.jsonでAI補完のTabをAlt+Tabにリマップできます。
Q CSSファイルではTabが動作するのに、HTMLファイルでは動作しません — なぜですか?
A ファイル拡張子をチェックしてください。VSCodeは拡張子で言��を識別します — .htmlはHTMLモード、.cssはCSSモード、.htmはHTMLモードを使用します。ファイルが.tpl(テンプレート)や.vue(Vue SFC)のような非標準拡張子を持つ場合、VSCodeはデフォルトでHTMLとして認識しない可能性があります。settings.jsonにemmet.includeLanguagesを追加する必要があります。例:"emmet.includeLanguages": {"vue-html": "html"}
Q カスタムキーバインドをTab → Ctrl+Eに変更しましたが、Tabがまだ展開をトリガーしますか?
A これは設計上の動作です。VSCodeのEmmetトリガー優先度は:① カーソルが省略記法の末尾 + Tabキー(keybindings.jsonのデフォルト動作を無視)、② 任意のカスタムキーバインド。keybindings.jsonの変更は「Tabを上書き」せず、「Ctrl+Eトリガーを追加」します。Tabトリガーを完全に無効にする(TabがEmmet動作を一切持たないようにする)には、settings.jsonで"emmet.triggerExpansionOnTab": falseを設定します。

📖 まとめ

🌐 自分で試す: VSCode Emmetドキュメントで完全なショートカットリストと設定を確認してください。


📝 練習問題

  1. 基本(難易度:★):現在のエディタで、新しいtest.htmlファイルを作成してください。div.container>h1{Hello}+p.lead{This is Emmet}と入力し、Tabを押してください。展開結果を記録してください。Tabが反応しない場合は、上記の4つの失敗シナリオを使ってトラブルシューティングし、コマンドパレットにフォールバックしてください。最終的な展開のスクリーンショットを撮ってください。

  2. 中級(難易度:★★):VSCodeでkeybindings.jsonを開いてください(コマンドパレット → Preferences: キーボードショートカットを開く(JSON))。省略記法の展開をCtrl+Eにリマップするルールを追加してください。動作変更を確認してください:Tabを押すとインデントされ、Ctrl+Eで展開されるはずです。エディタがSublime Textの場合は、SublimeのCtrl+EトリガーとVSCodeのCtrl+Eトリガーの違いをそれぞれのkeybindings.json形式で文書化してください。

  3. 応用(難易度:★★★):5要素の完全なHTMLランディングページヒーローセクション(タイトル + サブタイトル + 説明 + プライマリボタン + セカンダリボタン)を1つのEmmet省略記法で書いてください。5つのメカニズムすべてが正しく動作することを確認してください:>子ネスト、+兄弟ノード、{}テキストコンテンツ、[attr=val]カスタム属性、複数クラス(.btn.btn-primary)。展開されたHTML行数と省略記法の文字数を記録してください。同じHTML構造を手打ちした場合の時間と比較し、「省略記法の展開 速度利点」レポートを書いてください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%