Skip to content

原文(日本語に翻訳)

vimオペレーターが分解済み(NFD)アクセント文字を含むテキストを破損する問題を修正しました。

原文(英語)

Fixed vim operators corrupting text containing decomposed (NFD) accented characters

概要

Claude CodeのVimモードで、NFD(Unicode正規化形式D)でエンコードされたアクセント付き文字(é、ü、ñなどをベース文字と結合文字で表現したもの)を含むテキストに対してVimオペレーター(dcyなど)を使用すると、テキストが破損する問題がありました。これはフランス語、ドイツ語、スペイン語などヨーロッパ言語のテキストを扱う際に問題を引き起こしていました。この修正によりNFD文字が正しく処理されます。

基本的な使い方

この修正はClaude CodeのVimモードを使用している場合に自動的に適用されます。NFDエンコードされたアクセント付き文字を含むテキストを正しく編集できるようになります。

# Vimモードを有効にする(設定で有効化)
# ~/.claude/settings.json
{
  "vim": true
}

# または起動時に指定
claude --vim

実践例

NFDアクセント文字を含むテキストの編集

# NFD vs NFC の違い
# NFC(合成形式): é = U+00E9 (1コードポイント)
# NFD(分解形式): é = U+0065 + U+0301 (e + 結合アクセント = 2コードポイント)

# macOSのファイルシステム(HFS+)はNFDを使用するため、
# macOSで作成されたファイルにはNFDエンコードが含まれることが多い

# 問題のあったシナリオ(修正前)
> Bonjour, je m'appelle André et j'habite à Montréal.
# Vimモードで "dw"(単語削除)を実行すると文字化けが発生
# 修正後: 正しく "André" の "é" を含む単語が削除される

Vimオペレーターの正常動作確認

# Vimモードでの各オペレーターのテスト

# テキスト例(NFDアクセント文字を含む)
> Ünterführung über München

# d (delete) オペレーター
# dw → 単語を削除(修正後は正しくアクセント文字も含めて削除)
# dd → 行を削除

# c (change) オペレーター
# cw → 単語を変更(修正後は正しくアクセント文字を認識)
# ci" → クォート内を変更

# y (yank/copy) オペレーター
# yw → 単語をコピー(修正後はアクセント文字を含めて正しくコピー)
# yy → 行をコピー

多言語コードコメントの編集

python
# フランス語コメントを含むPythonコード
# 修正前: Vimオペレーターでコメントを編集するとNFD文字が破損

def calculer_surface(rayon):
    """
    Calcule la surface d'un cercle.
    Paramètre: rayon (float) - le rayon du cercle
    Résultat: float - la surface calculée
    """
    return 3.14159 * rayon ** 2

# Vimモードで "ci'" でコメントを変更 → 修正後は正常に動作
# "das" でコメントブロックを選択・削除 → 修正後は正常に動作

macOSユーザーへの特記事項

bash
# macOSはHFS+/APFSファイルシステムでNFDを使用するため
# macOSで作成されたファイルはNFDエンコードになることがある

# ファイルのエンコードを確認する方法
python3 -c "
text = open('example.txt').read()
for i, char in enumerate(text):
    if ord(char) > 127:
        print(f'位置{i}: U+{ord(char):04X} ({char})')
"

# NFDをNFCに変換する場合(必要な場合のみ)
python3 -c "
import unicodedata
with open('example.txt', 'r') as f:
    content = f.read()
normalized = unicodedata.normalize('NFC', content)
with open('example_nfc.txt', 'w') as f:
    f.write(normalized)
"

注意点

  • この修正はClaude CodeのVimモードに限定されます。通常の入力モードでは別の処理が行われます。
  • NFDエンコードはmacOSのファイルシステム(HFS+/APFS)で特によく見られます。Linux(ext4など)は通常NFCを使用します。
  • テキストが破損した場合は、u(undo)コマンドで元に戻せます。
  • この問題は主にフランス語、ドイツ語、スペイン語、ポルトガル語などのラテン文字ベースのヨーロッパ言語で影響がありました。

関連情報