この記事では、特定のディレクトリ以下のファイルがNFDかNFCかを判定するスクリプトと、特定のファイルやフォルダーの名前をNFDに書き換える方法を紹介する。目的はVisual Studio CodeのプロジェクトがあるパスにNFDが含まれているとき、Gitが正しく動作しない問題を回避するためだ。
GitのMac版はユニコードの結合に対応している1のでコマンドラインで使っているとトラブルに出くわすことはそれほど多くない。GitHubに濁点・半濁点を含む日本語名のファイルをアップロードしても、他のプラットフォームではNFCとして扱われるほどだ。しかしVisual Studio Codeは、プロジェクトフォルダーのパスにNFDが含まれていると、ステータスを正しく扱うことができなくなったりしてしまう。
そこで、アドホックな回避策ではあるけど、プロジェクトのルートディレクトリとその上位パスをNFCに書き換えてしまえばいい。というわけだ。
「ファイル名、フォルダ名に日本語を使わない」というよく知られた回避策が何より有効なことは書き添えておく。
NFD検出スクリプト
まず、NFDかどうかを検出するシェルスクリプトを紹介する。
#!/bin/zsh
RED='\033[0;31m'
GREEN='\033[0;32m'
NO_COLOR='\033[0m'
# NFD形式かどうかをチェックする関数
is_nfd() {
local filename="$1"
if [[ "$(echo "$filename" | iconv -f utf-8-mac -t utf-8)" == "$filename" ]]; then
# ファイル名はNFD形式です。
return 0
else
# ファイル名はNFD形式ではありません。
return 1
fi
}
# 引数から対象ディレクトリパスを設定
target_directory="$1"
# 対象ディレクトリが存在しない場合は終了
if [ ! -d "$target_directory" ]; then
echo "指定されたディレクトリは存在しません: $target_directory"
exit 1
fi
# 対象ディレクトリ内の全ファイルを処理
find "$target_directory" -maxdepth 1| while read file; do
# ファイル名を取得
filename=$(basename -- "$file")
# ファイル名がNFD形式かチェック
if is_nfd "$filename"; then
echo -e "${GREEN}[NFC]${NO_COLOR} $file"
else
echo "${RED}[NFD]${NO_COLOR} $file"
fi
done
上記のコードを任意の場所に保存し(以下の例では~/Document/Tools
にNFD-detector.sh
という名前で保存する)、目的のフォルダで以下のように実行する。
% ~/Documents/Tools/NFD-detector.zsh ./
実行すると、以下のような出力が得られる。
NFDをNFCに書き換える
上記の例で「海はどこにでも」フォルダーの下は、VS Codeのソースコードコントロールが機能しない。そこで、このフォルダー名をNFCに書き換える必要がある。Terminal.appやVS Codeのターミナルを起動して、以下のように操作すると、NFDのフォルダー名をNFCに書き換えられる。
% ls -l
drwxr-xr-x 2 taiyofujii staff 64 8 23 10:44 The-Year-of-the-Dragon
drwxr-xr-x 2 taiyofujii staff 64 8 23 10:44 Three-Light-Year-Solitude
drwxr-xr-x 2 taiyofujii staff 64 8 23 10:43 従卒トム
drwxr-xr-x 2 taiyofujii staff 64 8 23 10:43 読書家アリス
drwxr-xr-x 2 taiyofujii staff 64 8 23 10:43 雲をあげる
drwxr-xr-x 2 taiyofujii staff 64 8 23 10:43 海はどこにでも
## ↓lsからコピペ(またはコード補完)
% mv 海はどこにでも/ temp
## ↓ターミナルで日本語入力・変換
% mv temp/ 海はどこにでも
これで「海はどこにでも」がNFCで保存される。Termina.appやVS Codeのターミナルで入力した文字はNFCを使っているためだ。
先ほどの検出スクリプトを使うと結果を確認できる。
これで「海はどこにでも」をVS Codeのプロジェクトフォルダーに設定できる。
今のところ私は大きな問題に突き当たっていないが、ファイル名がASCIIで済むなら、ASCIIを使うようにしよう。
-
git-config - Get and set repository or global options: core.precomposeUnicode ↩