bashはアクセント文字の処理方法のいくつかの異常につまずいていると思います。ポップコーンをつかむことをお勧めします。これは少し技術的になるからです...
Unicodeでは、いくつかのアクセント付き文字をいくつかの異なる方法で表すことができます。アクセント付き文字を表す「コードポイント」として、またはアクセントのない文字のアクセントなしバージョンを表す一連のコードポイントとして。たとえば、「ä」はU + 00E4(UTF-8 0xc3a4、分音記号付きラテン小文字1)として事前に構成するか、U + 0061 U + 0308(UTF-8 0x61cc88、分音記号付きラテン小文字a +)として分解できます。 )。
OS XのHFS +ファイルシステムでは、すべてのファイル名を完全に分解された形式の UTF-8表現で保存する必要があります。HFS +ファイル名では、「ä」は0x61cc88としてエンコードされなければならず、「ö」は0x6fcc88としてエンコードされなければなりません。
ここで何が起こっているのかは、コマンドラインで「Näyttökuva.png」と入力すると、事前に構成された形式で文字を「入力」していることと確信しています。ファイルが作成されると、ファイルシステムは文字を分解して保存します。これまでのところ、すべて順調です。しかし、「Nä」で始まるタブ補完を使用しようとすると、bashは一致を検索する前に「ä」を分解できず、もちろん何も見つかりません。
違いを説明するために、コマンドラインで「Näyttökuva.png」と入力したときと、ファイル名として保存し、タブ補完を使用して入力するときに何を使用するかで、どのエンコードが使用されるかの例を示します。
$ printf Näyttökuva.png | xxd # This time I pasted the it in from this web page
0000000: 4ec3 a479 7474 c3b6 6b75 7661 2e70 6e67 N..ytt..kuva.png
$ touch Näyttökuva.png # Also pasted from the web
$ printf Näyttökuva.png | xxd # This time I tab-completed it after N
0000000: 4e61 cc88 7974 746f cc88 6b75 7661 2e70 Na..ytto..kuva.p
0000010: 6e67 ng
さて、削除してタブを完了するときに文字が失われるという問題については、それは密接に関連していると思います。具体的には、bashは削除キーを押すごとに1つのコードポイントを「削除」するが、押すたびにターミナルウィンドウから1文字を消去すると思います。削除された文字の1つ(今回は "ö")は2つのコードポイントで構成されていましたが、1つの文字のみであったため、ターミナルの表示は同期しなくなります。ファイル名全体をタブ補完し、それを「Näytt」に戻し、再タブ補完します:bashは、「ö」全体ではなく、結合分音記号のみが削除されたと思われるので、結合分音記号を再度追加します、しかし今回は「t」にアタッチします:
$ echo Näytẗkuva.png
Näyttökuva.png
Returnキーを押すと、bashには実際にファイル名全体が含まれていることに注意してください。混乱したのは、ターミナルディスプレイだけです。
TL; DR bashには、分解可能なアクセント付き文字を処理するいくつかのバグがあります。
編集:いくつかの検討の後、唯一の完全な解決策はbashを修正することだと思います(/開発者が修正するのを待ちます)。分解された形式で文字を入力する方法もありますが、それがどうなるかはわかりません。しかし、私はいくつかの部分的な回避策を見つけました:
Finderからファイルをドラッグアンドドロップすると、正しい形式で貼り付けられます。Finderはファイルシステムからファイル名を取得するため、すでに分解されているため、機能します。
実際に、アクセント記号付きの文字自体をタブ補完することができます。たとえば、「Na」と入力してからTabキーを押すと、「ä」の標準分解が「a」で始まるため、「Näyttökuva.png」と一致します。しかし、同じディレクトリに「Narwal.gif」という名前のファイルがある場合、それはあまり役に立ちません...
これはテストしていませんが、tabをcompleteではなくmenu-completeにバインドすると、一致する可能性のあるものをタブで移動できるので、次の文字を入力できない場合でも必要なものを選択できます。(または、別のキーストロークにバインドすることができるため、必要な場合にのみ使用できます。)
ターミナルディスプレイが同期しなくなる問題を修正するには、何かをredraw-current-lineにバインドします。これにより、問題の発生を防ぐことはできませんが、ディスプレイを再同期する方法が得られます。
$ echo -e "N\xC3\xA4*" | ls
(エコーが与えるNä*
)Näyttökuva.png
。この問題は、Mac OSの他のシェルにも存在します。そして、例えばzshls N
がオートコンプリートされるls Na<0308>ytto<0308>kuva.png