モードのロード順序には依存しません。モードが面を適用するために使用するそれぞれのメカニズムによって異なります。
rainbow-mode
を使用font-lock
してテキストを強調表示し、いわゆるテキスト プロパティを使用します。テキスト プロパティは、文字列オブジェクトの固有のプロパティであり、どのバッファーにも含まれていない文字列オブジェクトに属することができます。(したがって、テキスト プロパティは、たとえば、切り取りと貼り付けを行っても存続します。)
highlight-changes-mode
対照的に、仮想テキスト プロパティと考えることができる「オーバーレイ」を使用します。オーバーレイが指定できるプロパティの中に顔があります。オーバーレイ プロパティは、文字列自体のプロパティではありません (そのため、切り取りと貼り付けには耐えられません)。
バッファ部分文字列の text プロパティとその部分文字列を覆うオーバーレイによって互換性のない面属性が指定されている場合、オーバーレイが優先されます。(テキスト プロパティが前景色を指定し、背景色を指定せず、オーバーレイが単に背景色を指定する場合のように、面の属性に互換性がない場合は、予想どおりにマージされます。)
一般に、面をマージするための規則は複雑です。オーバーレイ自体が、バッファ位置に表示する文字列を指定でき、その文字列が独自のテキスト プロパティを持つことができ、そのような場合はさまざまな規則で管理されるためです。また、マウス ハイライトやモード ライン フェースなどの特定の組み込みフェースは、独自の規則によって管理されます。詳細については、情報ノード「(elisp) Faces」および「(elisp) Overlays」を参照してください。完全なストーリーについては、表示ルーチンのソース コードを確認する必要があります (おそらく、xdisp.c の handle_face_prop と xfaces.c の face_at_string_position から始まります)。