HTMLを書いていて、<div>
と入力した後に</div>
を手動で入力するのは面倒ですよね。タグ名を変更する時も、開始タグと閉じタグの両方を修正するのは二度手間です。
実は、VSCodeには閉じタグを自動的に入力・管理する強力な機能があります。設定次第で、タグの入力時間を半分以下に短縮できるんです。
しかも、HTML だけでなく、React の JSX、Vue のテンプレート、XML など、様々なマークアップ言語に対応可能。タグ名を変更すれば、閉じタグも自動的に変更される機能まであります。
この記事では、VSCodeの閉じタグ自動化機能を完璧に設定する方法から、便利な拡張機能、トラブルシューティングまで、初心者でもすぐに実践できるように詳しく解説していきます。
1. VSCodeの標準機能での閉じタグ設定

HTML/XMLの基本設定
VSCodeには標準で閉じタグのサポート機能があります。
基本的な自動補完設定:
// settings.json
{
// HTMLの自動クローズタグ
"html.autoClosingTags": true,
// 入力補助の設定
"html.completion.attributeDefaultValue": "doublequotes",
// ミラーカーソル(開始・終了タグ同時編集)
"html.mirrorCursorOnMatchingTag": true,
// タグの自動作成
"html.autoCreateQuotes": true,
// フォーマット時の設定
"html.format.wrapLineLength": 120,
"html.format.wrapAttributes": "auto"
}
言語別の設定
各言語での自動クローズ設定:
{
// JavaScript/TypeScript(JSX/TSX)
"javascript.autoClosingTags": true,
"typescript.autoClosingTags": true,
// XML
"xml.autoClosingTags": true,
// Vue
"[vue]": {
"editor.defaultFormatter": "octref.vetur"
},
// PHP
"[php]": {
"editor.autoClosingBrackets": "always"
}
}
ミラーカーソル機能の活用
開始タグと閉じタグを同時に編集する機能です。
<!-- タグ名を変更すると、閉じタグも自動で変更される -->
<div> <!-- divをspanに変更すると -->
コンテンツ
</div> <!-- 自動的に</span>になる -->
設定方法:
{
"html.mirrorCursorOnMatchingTag": true,
"html.mirrorCursorOnMatchingTagTimeout": 200 // 反応速度(ミリ秒)
}
2. 必須拡張機能「Auto Close Tag」
インストールと基本設定
最も人気のある閉じタグ自動化拡張機能です。
インストール方法:
1. 拡張機能タブを開く(Ctrl + Shift + X)
2. "Auto Close Tag" を検索
3. Jun Han 作のものをインストール
基本設定:
{
// Auto Close Tag の有効化
"auto-close-tag.enableAutoCloseTag": true,
// 自己完結型タグも自動クローズ
"auto-close-tag.enableAutoCloseSelfClosingTag": true,
// 対応言語の設定
"auto-close-tag.activationOnLanguage": [
"html",
"xml",
"php",
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"svelte"
],
// 除外タグの設定
"auto-close-tag.excludedTags": [
"area",
"base",
"br",
"col",
"embed",
"hr",
"img",
"input",
"link",
"meta",
"param",
"source",
"track",
"wbr"
]
}
高度なカスタマイズ
特定のタグだけを制御:
{
// フルHTMLタグのみ有効
"auto-close-tag.fullMode": true,
// SublimeText風の動作
"auto-close-tag.SublimeText3Mode": true,
// カスタムルール
"auto-close-tag.disableOnLanguage": [
"markdown",
"plaintext"
]
}
3. タグ名同期の神機能「Auto Rename Tag」
Auto Rename Tagの導入
開始タグを変更すると、閉じタグも自動的に変更される拡張機能です。
設定方法:
{
// Auto Rename Tag の有効化
"auto-rename-tag.activationOnLanguage": [
"html",
"xml",
"php",
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue"
],
// パフォーマンス設定
"editor.renameOnType": true,
// リネーム時の遅延(ミリ秒)
"auto-rename-tag.delay": 100
}
実際の動作例
<!-- Before: divタグ -->
<div class="container">
<div class="content">
テキスト
</div>
</div>
<!-- After: divをsectionに変更すると自動的に -->
<section class="container">
<section class="content">
テキスト
</section>
</section>
4. Emmetによる高速タグ入力
Emmetの基本展開
Emmetは略語から HTML を高速生成する強力な機能です。
基本的な使い方:
<!-- div.container と入力してTabキー -->
<div class="container"></div>
<!-- ul>li*3 と入力してTabキー -->
<ul>
<li></li>
<li></li>
<li></li>
</ul>
<!-- div#app>header+main+footer と入力 -->
<div id="app">
<header></header>
<main></main>
<footer></footer>
</div>
Emmet設定のカスタマイズ
{
// Emmetの有効化
"emmet.includeLanguages": {
"javascript": "javascriptreact",
"typescript": "typescriptreact",
"vue-html": "html",
"razor": "html",
"plaintext": "pug"
},
// トリガーキーの設定
"emmet.triggerExpansionOnTab": true,
// カスタムスニペット
"emmet.snippets": {
"html": {
"snippets": {
"btn": "<button class=\"btn\">${1:Click me}</button>",
"card": "<div class=\"card\">\n\t<div class=\"card-header\">${1:Title}</div>\n\t<div class=\"card-body\">${2:Content}</div>\n</div>"
}
}
},
// 自動展開の設定
"emmet.showExpandedAbbreviation": "always",
"emmet.showSuggestionsAsSnippets": true
}
JSX/TSXでのEmmet設定
React開発でEmmetを使う設定:
{
// JSX/TSXでEmmetを有効化
"emmet.includeLanguages": {
"javascript": "javascriptreact",
"typescript": "typescriptreact"
},
// JSX用の設定
"emmet.syntaxProfiles": {
"javascript": "jsx",
"typescript": "tsx"
},
// className に変換
"emmet.preferences": {
"jsx.className": true,
"jsx.selfClosingTag": true
}
}
5. React/JSX での閉じタグ自動化
JSX特有の設定
{
// JSX用の自動クローズ設定
"javascript.autoClosingTags": true,
"typescript.autoClosingTags": true,
// React Snippets との連携
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.autoClosingBrackets": "always"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.autoClosingBrackets": "always"
},
// 自己完結型タグの設定
"javascript.preferences.jsxAttributeCompletionStyle": "auto",
// Fragmentの扱い
"emmet.includeLanguages": {
"javascript": "javascriptreact"
}
}
Reactコンポーネントの自動補完
// 入力例
<MyComp // ここでTabまたはEnterを押すと
// 自動的に補完
<MyComponent></MyComponent>
// 自己完結型の場合
<MyComponent />
カスタムコンポーネント用設定:
{
// コンポーネント名の自動インポート
"javascript.suggest.autoImports": true,
"typescript.suggest.autoImports": true,
// パスの自動補完
"javascript.suggest.paths": true,
"typescript.suggest.paths": true
}
6. Vue.jsでの閉じタグ設定
Veturを使った設定
Vue.js開発で必須の拡張機能です。
{
// Vetur の基本設定
"vetur.format.enable": true,
"vetur.format.defaultFormatter.html": "prettier",
"vetur.format.defaultFormatter.js": "prettier",
// テンプレート内の自動補完
"vetur.completion.autoImport": true,
"vetur.completion.tagCasing": "kebab",
// スキャフォールディング
"vetur.completion.scaffoldSnippetSources": {
"workspace": "💼",
"user": "🔧",
"vetur": "✌"
},
// Emmet統合
"vetur.emmet": "always"
}
Vueテンプレートのカスタムスニペット
{
"Vue Component": {
"prefix": "vcomp",
"body": [
"<template>",
" <div class=\"${1:component-name}\">",
" $0",
" </div>",
"</template>",
"",
"<script>",
"export default {",
" name: '${1:ComponentName}'",
"}",
"</script>",
"",
"<style scoped>",
".${1:component-name} {",
" ",
"}",
"</style>"
]
}
}
7. その他の便利な拡張機能
Tag Inserter
選択したテキストをタグで囲む拡張機能:
{
"tagInserter.tagList": [
"div",
"span",
"p",
"strong",
"em",
"section",
"article"
],
"tagInserter.autoClose": true,
"tagInserter.spaceBeforeClosingBracket": false
}
htmltagwrap
選択範囲をHTMLタグでラップ:
使用方法:
1. テキストを選択
2. Alt + W
3. タグ名を入力
例:
"Hello World" を選択して Alt + W → div と入力
結果:<div>Hello World</div>
Bracket Pair Colorizer(括弧の色分け)
{
"bracket-pair-colorizer-2.colors": [
"Gold",
"Orchid",
"LightSkyBlue"
],
"bracket-pair-colorizer-2.highlightActiveScope": true,
"bracket-pair-colorizer-2.showBracketsInGutter": true
}
8. パフォーマンスとトラブルシューティング
よくある問題と解決策
問題1:閉じタグが二重に入力される
// 解決策:競合する設定を無効化
{
"html.autoClosingTags": false, // 標準機能を無効化
"auto-close-tag.enableAutoCloseTag": true // 拡張機能のみ使用
}
問題2:特定のファイルで動作しない
// 言語モードの確認と設定
{
"files.associations": {
"*.jsx": "javascriptreact",
"*.tsx": "typescriptreact",
"*.vue": "vue"
}
}
問題3:タグの同期が遅い
// パフォーマンス調整
{
"html.mirrorCursorOnMatchingTagTimeout": 100, // 速度を上げる
"auto-rename-tag.delay": 50, // 遅延を減らす
// 大きなファイルでの制限
"editor.largeFileOptimizations": true
}
言語モードの確認方法
1. 右下のステータスバーで言語モードを確認
2. クリックして適切な言語を選択
3. または以下のコマンドを使用:
コマンドパレット(Ctrl+Shift+P)
→ "Change Language Mode"
→ 適切な言語を選択
9. カスタムスニペットで更に効率化
HTMLスニペットの作成
// File → Preferences → User Snippets → html.json
{
"HTML5 Boilerplate": {
"prefix": "html5",
"body": [
"<!DOCTYPE html>",
"<html lang=\"${1:ja}\">",
"<head>",
" <meta charset=\"UTF-8\">",
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
" <title>${2:Document}</title>",
"</head>",
"<body>",
" $0",
"</body>",
"</html>"
]
},
"Bootstrap Card": {
"prefix": "bscard",
"body": [
"<div class=\"card\">",
" <div class=\"card-header\">",
" ${1:Header}",
" </div>",
" <div class=\"card-body\">",
" <h5 class=\"card-title\">${2:Title}</h5>",
" <p class=\"card-text\">${3:Content}</p>",
" </div>",
"</div>"
]
}
}
Reactコンポーネントスニペット
{
"React Functional Component": {
"prefix": "rfc",
"body": [
"import React from 'react'",
"",
"const ${1:ComponentName} = () => {",
" return (",
" <div>",
" $0",
" </div>",
" )",
"}",
"",
"export default ${1:ComponentName}"
]
},
"useState Hook": {
"prefix": "ust",
"body": [
"const [${1:state}, set${1/(.*)/${1:/capitalize}/}] = useState(${2:initialState})"
]
}
}
10. 言語別推奨設定まとめ
HTML/CSS開発
{
"html.autoClosingTags": true,
"html.mirrorCursorOnMatchingTag": true,
"auto-close-tag.enableAutoCloseTag": true,
"auto-rename-tag.activationOnLanguage": ["html"],
"emmet.triggerExpansionOnTab": true
}
React開発
{
"javascript.autoClosingTags": true,
"typescript.autoClosingTags": true,
"emmet.includeLanguages": {
"javascript": "javascriptreact",
"typescript": "typescriptreact"
},
"emmet.syntaxProfiles": {
"javascript": "jsx"
}
}
Vue開発
{
"vetur.format.enable": true,
"vetur.completion.autoImport": true,
"auto-close-tag.activationOnLanguage": ["vue"],
"auto-rename-tag.activationOnLanguage": ["vue"]
}
Angular開発
{
"[html]": {
"editor.defaultFormatter": "vscode.html-language-features"
},
"angular.enable-strict-mode-prompt": false,
"auto-close-tag.activationOnLanguage": ["html", "typescript"]
}
よくある質問(FAQ)
Q1: 自己完結型タグ(<br />など)も閉じタグが入力されてしまう
A: 除外設定を追加します:
{
"auto-close-tag.excludedTags": [
"br", "hr", "img", "input", "link", "meta",
"area", "base", "col", "embed", "param",
"source", "track", "wbr"
],
"auto-close-tag.enableAutoCloseSelfClosingTag": false
}
Q2: JSXでclassNameが補完されない
A: Emmetの設定を調整します:
{
"emmet.preferences": {
"jsx.className": true
},
"emmet.includeLanguages": {
"javascript": "javascriptreact"
}
}
Q3: 特定のプロジェクトだけ設定を変えたい
A: ワークスペース設定を使用:
// .vscode/settings.json
{
"auto-close-tag.enableAutoCloseTag": false,
"html.autoClosingTags": true
}
Q4: タグの自動整形も同時にしたい
A: Prettierと組み合わせます:
{
"editor.formatOnSave": true,
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"prettier.htmlWhitespaceSensitivity": "css",
"prettier.printWidth": 120
}
Q5: PHPファイルでHTMLタグが補完されない
A: 言語の関連付けを設定:
{
"files.associations": {
"*.php": "php"
},
"auto-close-tag.activationOnLanguage": [
"php", "html"
],
"emmet.includeLanguages": {
"php": "html"
}
}
まとめ:閉じタグ自動化で開発スピードを2倍に
VSCodeの閉じタグ自動化機能を適切に設定することで、マークアップの入力速度は劇的に向上します。
設定の優先順位:
- 必須の拡張機能をインストール
- Auto Close Tag
- Auto Rename Tag
- 言語別拡張機能(Vetur等)
- 基本設定を最適化
- 言語別の自動クローズ設定
- Emmetの有効化
- ミラーカーソル設定
- カスタマイズで効率化
- カスタムスニペット作成
- 除外タグの設定
- ショートカットキー設定
これらの設定を組み合わせることで、HTMLやJSXの記述時間を大幅に短縮できます。
最初は設定に時間がかかるかもしれませんが、一度設定してしまえば、その後の開発効率は格段に向上します。
快適なマークアップ環境で、より創造的な開発に集中しましょう!
コメント