Sublime Textで全角スペースを見つける・ハイライトする方法|コードの見落としを防ごう

プログラミング・IT

「コードが動かない…なぜ?」と悩んだとき、原因が全角スペースだったという経験はありませんか?

よくある全角スペースのトラブル

プログラミングをしていると、以下のような困った状況に遭遇することがあります:

  • Pythonのインデントエラー:全角スペースが混じってIndentationError
  • HTMLの表示崩れ:全角スペースがそのまま表示されてレイアウト崩れ
  • YAMLファイルの構文エラー:設定ファイルが読み込めない
  • JSONの解析エラー:データ処理でつまずく
  • CSV・TSVの列ずれ:データ分析で思わぬ結果

なぜ全角スペースは見つけにくいの?

全角スペース( )と半角スペース( )は、見た目がほとんど同じです。しかし、コンピューターにとってはまったく別の文字として扱われます。

文字文字コード見た目の幅プログラムでの扱い
半角スペースU+0020狭い通常のスペース
全角スペースU+3000広い日本語文字として認識

この記事で解決できること

この記事では、以下について段階的にわかりやすく解説します:

  • Sublime Textで全角スペースを簡単に発見する方法
  • 自動でハイライトして見落としを防ぐ設定
  • 一括置換で効率的に修正する手順
  • 今後のトラブルを予防するコツ

最後まで読めば、全角スペースによるトラブルを完全に回避できるようになります。

スポンサーリンク

全角スペースが混入する原因と対策

どこから全角スペースが来るのか?

日本語入力での混入

よくあるケース

  • 日本語を入力した後、入力モードを切り替え忘れ
  • コメント部分で日本語を書いた後、半角に戻すのを忘れる
  • スペースキーを押したときにIMEがオンのまま

例:Pythonコードでの混入

def hello():    # ここに全角スペースが混入
    print("Hello")

コピー&ペーストでの混入

よくあるケース

  • Webサイトからコードをコピーしたとき
  • PDFからテキストを抽出したとき
  • Wordやメールからコードを貼り付けたとき

チーム開発での混入

よくあるケース

  • 他の人が作ったファイルをもらったとき
  • GitHubからダウンロードしたコードに混入
  • 設定ファイルを共有するときの文字コード問題

全角スペースの見分け方

文字幅での判断

全角スペースは半角スペースより約2倍の幅があります。

半角→ ← ←この間隔
全角→ ← ←この間隔(より広い)

カーソル移動での確認

カーソルキー(←→)で移動すると:

  • 半角スペース:1回で通り過ぎる
  • 全角スペース:1回で通り過ぎるが、幅が広いため違和感がある

Sublime Textで全角スペースを探す基本方法

検索(Find)機能を使った発見

最もシンプルで確実な方法です。

基本手順

  1. 検索ボックスを開く
    • Ctrl + F(Mac: Cmd + F
  2. 全角スペースを入力
    • 日本語入力モードでスペースキーを押して全角スペースを入力
    • または以下の全角スペースをコピー→ ←
  3. 検索実行
    • Enterキーで次の箇所に移動
    • Find Allですべての箇所をハイライト

検索結果の見方

検索がヒットした場合

  • 該当箇所が黄色でハイライトされる
  • 画面下部に「◯件見つかりました」と表示
  • F3キー(Mac: Cmd + G)で次の箇所に移動

検索がヒットしなかった場合

  • 検索ボックスが赤くなる
  • 「見つかりません」と表示
  • この場合、ファイルに全角スペースは含まれていない

より詳細な検索

行番号付きで確認したい場合

  1. 検索結果パネルを表示
    • Find Allをクリック
    • またはAlt + Enter
  2. 結果一覧を確認
    • 各行番号と該当箇所が一覧表示
    • クリックするとその行に移動

正規表現を使った高度な検索

より柔軟な検索をしたい場合は正規表現が便利です。

正規表現検索の手順

  1. 検索ボックスを開く
    • Ctrl + F(Mac: Cmd + F
  2. 正規表現モードをオン
    • 検索ボックス左の「.*」アイコンをクリック
  3. 全角スペースの正規表現を入力 [ ]

全角スペースとタブの混在検索

[ \t]

これにより、全角スペースとタブ文字の両方を検索できます。

行頭の全角スペースのみ検索

^[ ]+

インデントエラーの原因になりやすい「行頭の全角スペース」のみを検索できます。

連続する全角スペースを検索

[ ]{2,}

2個以上連続した全角スペースを検索できます。

自動ハイライトで見落としを防ぐ方法

TrailingSpacesプラグインの活用

TrailingSpacesとは?

本来は「行末の不要なスペース」をハイライトするプラグインですが、設定により全角スペースも自動検出できます。

インストール手順

  1. Package Controlを開く
    • Ctrl + Shift + P(Mac: Cmd + Shift + P
  2. インストールコマンドを実行
    • Package Control: Install Packageと入力
  3. TrailingSpacesを検索
    • 「TrailingSpaces」と入力してEnter
  4. インストール完了
    • 自動的にダウンロード・インストールされる

全角スペース検出の設定

  1. 設定ファイルを開く Preferences → Package Settings → TrailingSpaces → Settings - User
  2. 設定内容を記述 { "trailing_spaces_highlight_color": "invalid", "trailing_spaces_include_current_line": true, "trailing_spaces_include_empty_lines": true, "trailing_spaces_regexp": "[ \\s]*[ ]+[\\s]*", "trailing_spaces_modified_lines_only": false }

設定項目の詳細

設定項目意味推奨値
highlight_colorハイライト色“invalid”(赤色)
include_current_line現在行も対象true
include_empty_lines空行も対象true
regexp検出パターン“[ \s][ ]+[\s]
modified_lines_only変更行のみfalse

ハイライト結果の確認

設定後、全角スペースが含まれる箇所が赤い背景でハイライトされます。

ハイライトされる例

def hello():    # 関数名の後と行末に全角スペース
    print("Hello")

BracketHighlighterでの全角文字表示

カスタム設定による全角スペース強調

BracketHighlighterプラグインを使って、全角スペースを強調表示することも可能です。

設定方法

  1. BracketHighlighterをインストール
    • Package Controlから「BracketHighlighter」をインストール
  2. カスタム設定を追加 { "user_bracket_styles": { "fullwidth_space": { "icon": "dot", "color": "brackethighlighter.tag", "style": "highlight" } } }

自作プラグインでのリアルタイム検出

簡単な自作プラグイン

より高度な制御が必要な場合は、自作プラグインも作成できます。

import sublime
import sublime_plugin

class FullWidthSpaceHighlighter(sublime_plugin.EventListener):
    def on_modified_async(self, view):
        # 全角スペースを検出してハイライト
        regions = view.find_all('[ ]')
        view.add_regions('fullwidth_spaces', regions, 'invalid', 'dot')

一括置換で効率的に修正する方法

基本的な置換操作

全角スペースを半角スペースに置換

  1. 置換ウィンドウを開く
    • Ctrl + H(Mac: Cmd + Alt + F
  2. 検索文字列を入力
    • 「Find What」欄に全角スペース( )を入力
  3. 置換文字列を入力
    • 「Replace With」欄に半角スペース( )を入力
  4. 置換実行
    • Replace Allで一括置換
    • Replaceで一個ずつ確認しながら置換

全角スペースを完全削除

  1. 検索文字列:全角スペース( )
  2. 置換文字列:空欄(何も入力しない)
  3. Replace Allで実行

正規表現を使った高度な置換

正規表現置換の基本

  1. 置換ウィンドウで正規表現モードをオン
    • 左下の「.*」アイコンをクリック
  2. パターンマッチングで置換

行頭の全角スペースのみ置換

検索パターン^[ ]+ 置換文字列:適切なインデント(半角スペースやタブ)

複数の全角スペースを1つの半角スペースに

検索パターン[ ]+ 置換文字列:(半角スペース1個)

全角スペースとタブの混在を統一

検索パターン[ \t]+ 置換文字列:(半角スペース4個)

ファイル全体での一括処理

プロジェクト全体での置換

  1. プロジェクトフォルダを開く
    • File → Open Folder
  2. フォルダ内検索を開く
    • Ctrl + Shift + F(Mac: Cmd + Shift + F
  3. 置換設定
    • 「Find」欄:全角スペース
    • 「Replace」欄:半角スペース
    • 「Where」欄:*.py(Pythonファイルのみ)または*(全ファイル)
  4. 一括置換実行
    • Replace Allをクリック

ファイル形式別の処理

Pythonファイルのみ処理

  • Where欄:*.py

Web関連ファイルのみ処理

  • Where欄:*.html, *.css, *.js

設定ファイルのみ処理

  • Where欄:*.yml, *.yaml, *.json, *.xml

バックアップを取ってから置換

安全な置換手順

  1. Gitでコミット(バージョン管理している場合) git add . git commit -m "全角スペース修正前のバックアップ"
  2. 手動バックアップ(バージョン管理していない場合)
    • ファイルまたはフォルダを別の場所にコピー
  3. 置換実行
  4. 結果確認
    • 意図しない変更がないかチェック
    • 必要に応じてUndo(Ctrl + Z)で戻す

よくあるトラブルと解決方法

Q. 検索で全角スペースが見つからない

原因1:入力方法の間違い

問題:半角スペースで検索している 解決方法

  1. 日本語入力モードをオンにする
  2. スペースキーを押して全角スペースを入力
  3. または、この「 」をコピーして使用

原因2:似た文字との混同

問題:全角スペース以外の空白文字 解決方法:正規表現で幅広く検索

[\s ]+

Q. TrailingSpacesが動作しない

原因1:設定ファイルの記述ミス

解決方法

  1. 設定ファイルのJSON記法を確認
  2. カンマやカッコの記述ミスをチェック
  3. Sublime Text再起動

原因2:プラグインの競合

解決方法

  1. 他の空白関連プラグインを一時的に無効化
  2. Package Controlで「Disable Package」を実行

Q. 置換後にコードが動かなくなった

原因:必要な空白まで削除した

例:Pythonのインデント問題

# 置換前(正常)
def hello():
    print("Hello")  # 先頭に適切なインデント

# 置換後(エラー)
def hello():
print("Hello")  # インデントが削除されてしまった

解決方法

  1. Ctrl + Z(Mac: Cmd + Z)でUndo
  2. より限定的な正規表現を使用
  3. 行頭以外の全角スペースのみを対象にする

行頭以外の全角スペースのみ置換

検索パターン(?<!^)[ ]+ 意味:行頭以外の全角スペースのみ

Q. CSVファイルで列がずれる

原因:データ部分の全角スペースを削除した

問題のあるCSV

名前,年齢,住所
田中 太郎,30,東京都

解決方法

  1. データ内容と構造を分けて考える
  2. データ部分は慎重に手動修正
  3. ヘッダー行のみ自動置換

Q. HTMLで表示が崩れる

原因:全角スペースが文字として表示される

問題のあるHTML

<p>こんにちは 世界</p>  <!-- 全角スペースが表示される -->

解決方法

  1. 全角スペースを&nbsp;に置換
  2. CSSで適切なスペーシングを設定

置換例

  • 検索: 
  • 置換:&nbsp;

予防策とベストプラクティス

エディタ設定での予防

空白文字の可視化

  1. 設定を開く
    • Preferences → Settings
  2. 空白表示設定を追加 { "draw_white_space": "all", "draw_unicode_white_space": true }

これにより、すべての空白文字が点や記号で表示されます。

保存時の自動整形

{
    "trim_trailing_white_space_on_save": true,
    "ensure_newline_at_eof_on_save": true
}

入力時の注意点

IME(日本語入力)の管理

おすすめの習慣

  1. コード入力前:必ず英数モードに切り替え
  2. コメント後:英数モードに戻すクセをつける
  3. キーボードショートカットAlt + ~(Windows)で素早く切り替え

エディタでの入力支援

自動切り替え設定

{
    "auto_complete_triggers": [
        {"selector": "source.python", "characters": ".", "rhs_empty": true}
    ]
}

チーム開発での対策

EditorConfigの使用

プロジェクトルートに.editorconfigファイルを作成:

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.py]
indent_style = space
indent_size = 4

[*.{html,css,js}]
indent_style = space
indent_size = 2

Git hooks での自動チェック

pre-commitフックの例

#!/bin/sh
# 全角スペースをチェック
if git diff --cached --name-only | xargs grep -l " "; then
    echo "Error: 全角スペースが含まれています"
    exit 1
fi

コードレビューでのチェック

レビュー観点

  1. インデントの一貫性
  2. 空白文字の種類統一
  3. 行末の不要な空白
  4. ファイル末尾の改行

自動化ツールの活用

Python:flake8, black

pip install flake8 black
flake8 --max-line-length=88 .
black .

JavaScript:ESLint, Prettier

npm install -g eslint prettier
eslint . --fix
prettier --write .

高度な活用方法

カスタムビルドシステムでの自動チェック

全角スペースチェック用ビルドシステム

{
    "cmd": ["python", "-c", "
import sys
import re
with open('$file', 'r', encoding='utf-8') as f:
    content = f.read()
    matches = list(re.finditer('[ ]', content))
    if matches:
        lines = content.split('\\n')
        for match in matches:
            line_num = content[:match.start()].count('\\n') + 1
            print(f'Line {line_num}: 全角スペースを検出')
        sys.exit(1)
    else:
        print('全角スペースは見つかりませんでした')
"],
    "shell": true,
    "file_regex": "^Line (\\d+):"
}

マクロ機能での自動化

全角スペース削除マクロ

  1. マクロ記録開始
    • Tools → Record Macro
  2. 操作を記録
    • Ctrl + Hで置換開始
    • 全角スペース → 半角スペース
    • Replace All実行
    • Escで置換終了
  3. マクロ記録終了
    • Tools → Stop Recording Macro
  4. マクロ保存
    • Tools → Save Macro
    • 「FullwidthSpaceReplace.sublime-macro」として保存
  5. キーバインド設定 [ { "keys": ["ctrl+shift+f1"], "command": "run_macro_file", "args": {"file": "res://Packages/User/FullwidthSpaceReplace.sublime-macro"} } ]

プラグイン開発での高度な制御

カスタムプラグインの作成

import sublime
import sublime_plugin
import re

class FullwidthSpaceCheckerCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        content = self.view.substr(sublime.Region(0, self.view.size()))
        
        # 全角スペースを検出
        pattern = r'[ ]'
        matches = list(re.finditer(pattern, content))
        
        if matches:
            # 結果をパネルに表示
            results = []
            lines = content.split('\n')
            
            for match in matches:
                line_num = content[:match.start()].count('\n') + 1
                col_num = match.start() - content.rfind('\n', 0, match.start())
                line_content = lines[line_num - 1]
                
                results.append(f"{line_num}:{col_num}: {line_content}")
            
            # 結果パネルを作成
            window = self.view.window()
            panel = window.create_output_panel("fullwidth_space_results")
            panel.run_command("append", {"characters": "\n".join(results)})
            window.run_command("show_panel", {"panel": "output.fullwidth_space_results"})
        else:
            sublime.status_message("全角スペースは見つかりませんでした")

class FullwidthSpaceListener(sublime_plugin.EventListener):
    def on_post_save_async(self, view):
        # 保存時に自動チェック
        if view.settings().get("fullwidth_space_check_on_save", False):
            view.run_command("fullwidth_space_checker")

まとめ

Sublime Textでの全角スペース対策について、重要なポイントをまとめます:

検出方法

  1. 基本的な検索Ctrl + Fで全角スペースを直接検索
  2. 正規表現検索[ ]パターンでより柔軟な検索
  3. 自動ハイライト:TrailingSpacesプラグインでリアルタイム表示

修正方法

  1. 一括置換Ctrl + Hで全角スペースを半角スペースに変換
  2. 正規表現置換:複雑なパターンマッチングでの修正
  3. プロジェクト全体:複数ファイルの一括処理

予防策

  1. エディタ設定:空白文字の可視化と保存時自動整形
  2. 入力習慣:IME切り替えの徹底
  3. チーム対策:EditorConfigとGit hooksの活用

効率化のポイント

  • プラグイン活用でリアルタイム検出
  • マクロ機能で操作の自動化
  • 正規表現で柔軟な検索・置換
  • バックアップを取ってから一括処理

コメント

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