文字列が使用されるほとんどの場面において、文字列はテキスト文字――バッファやファイルに含まれるものと同じ種類の文字――を保持するものとして捉えられます。時折、Lispプログラムでは概念的にキーボード文字を保持する文字列が使用されることがあります。例えば、キーシーケンスやキーボードマクロの定義などがこれにあたります。しかし、歴史的な互換性の観点から、文字列にキーボード文字を格納することは複雑な問題であり、必ずしも可能とは限りません。
新規プログラムでは、キーボードイベントを制御文字などを含む文字列として保存せず、代わりに key-valid-p が認識する一般的な Emacs
形式で保存することで、こうした複雑さを回避することを推奨します。
read-key-sequence-vector(またはread-key-sequence)でキーシーケンスを読み込んだり、this-command-keys-vector(またはthis-command-keys)でキーシーケンスにアクセスしたりする場合は、key-descriptionを使用することで推奨形式に変換できます。
こうした複雑さは、キーボード入力文字に含まれ得る修飾ビットに起因しています。Meta修飾子を除き、これらの修飾ビットはいずれも文字列に含めることができず、Meta修飾子は特殊な場合にのみ許可されます。
初期のGNU
Emacsバージョンでは、メタ文字は128から255の範囲のコードで表現されていた。当時、基本文字コードは0から127の範囲であったため、すべてのキーボード文字コードは文字列に収まりました。多くのLispプログラムでは、文字列定数の中でメタ文字を表すために‘\M-’を使用しており、特にdefine-keyや同様の関数の引数で用いられていた。また、キーシーケンスやイベントシーケンスは常に文字列として表現されていた。
127を超えるより大きな基本文字コードや、追加の修飾ビットへの対応を行った際、メタ文字の表現を変更する必要がありました。現在、文字内のメタ修飾子を表すフラグは2**27となっており、このような数値を文字列に含めることはできません。
文字列定数内に ‘\M-’ を含むプログラムをサポートするため、文字列に特定のメタ文字を含めるための特別なルールが設けられています。文字列を入力文字のシーケンスとして解釈する際のルールは以下の通りです。
read-key-sequence
のようにキーボード入力文字の文字列を構築する関数は、次のようなルールに従います。イベントが文字列に収まりきらない場合、文字列ではなくベクトルを構築します。
文字列内で読み取り構文 ‘\M-’ を使用すると、128から255の範囲のコードが生成されます。これは、対応するキーボードイベントを変更して文字列に組み込んだ場合に得られるコードと同じです。したがって、文字列内のメタイベントは、どのように文字列に取り込まれたかにかかわらず、一貫して動作します。
しかし、ほとんどのプログラムは、本節の冒頭にある推奨事項に従うことで、こうした問題を回避できるでしょう。