Previous: , Up: International   [Contents][Index]


22.19 双方向の編集

EmacsはArabicやHebrewのような、テキストを水平方向の右から左に記述するスクリプトで書かれたテキストの編集をサポートします。しかし数字やそれらのスクリプトに埋め込まれたLatinテキストは、左から右に表示されます。Latin文書の中に少量のArabicやHebrewのテキスト部分が含まれている場合も、稀ではありません(例: プログラムソース内のコメントや文字列)。これらの理由により、これらのスクリプトを使うテキストは、実際には双方向(bidirectional)、つまりそれらはleft-to-right(左から右)の文字とright-to-left(右から左)文字の混交されたものになります。

このセクションでは、双方向テキストを編集するためにEmacsが提供する機能とオプションを説明します。

Emacsはright-to-leftおよび双方向テキストを、いわゆるlogical順(またはreading順)で格納します。バッファーまたは文字列の最初の文字の位置は、次に読む文字の前になります。双方向テキストをvisual順に再配置するには、表示時間が発生します。結果として文字の位置は、それらが表示される位置にたいして単調に増加しなくなります。Emacsは表示のための双方向テキストの再配置を、Unicode Standard Annex #9で説明されているUnicode Bidirectional Algorithmで実装しています。

バッファーローカルな変数bidi-display-reorderingは、表示用にバッファーのテキストを再配置するかどうかを制御します。この変数の値が非nilの場合、Emacsは右から左の方向に表示される文字を再配置します。デフォルト値はtです。

双方向テキストの各パラグラフは、それ自身のbase direction(基本方向)をもっており、それはright-to-leftまたはleft-to-rightです(パラグラフの境界は空行、たとえば行全体が空白文字の行などです)。left-to-rightのパラグラフはスクリーンの左端から開始し、右端に到達すると切り詰め、または継続されます。対照的にright-to-leftのパラグラフのテキストは右端から開始し、左端で継続、または切り詰められて表示されます。

Emacsは、パラグラフを開始するテキストにもとづいて、各パラグラフの基本方向を動的に決定します。しかし、バッファーのパラグラフにたいして特定の基本方向を強制する必要もあるでしょう。変数bidi-paragraph-directionが非nilの場合、これは基本方向の動的な決定を無効にして、バッファーのすべてのパラグラフの方向を、このバッファーローカルな値で指定された方向に強制します。値にはright-to-leftleft-to-rightが指定できます。これ以外の値はnilと解釈されます。

かわりにパラグラフの先頭に特別な文字を挿入することにより、パラグラフの基本方向を制御できます。特別な文字RIGHT-TO-LEFT MARKまたはRLMは、以降に続くパラグラフをright-to-left方向に強制します。その効果はLEFT-TO-RIGHT MARKまたはLRMによりleft-to-right方向に再強制されるまで続きます(C-x 8 RETを使ってこれらの文字を挿入できます)。GUIセッションではLRM文字およびRLM文字は、極端に細いスペースで表示されます。テキスト端末では、それらはスペースで表示されます。

文字は表示用に再配置されるので、logical順で処理を行うEmacsコマンドやバッファーの拡大は、普通とは異なる効果を生みます。たとえばコマンドC-fおよびC-bはポイントをlogical順で移動するので、再配置された双方向テキストではポイントがジャンプすることがあります。同様に隣接する文字位置の範囲をカバーするハイライトされたリージョンは、リージョンが再配置されたテキストにかかる場合には不連続に見える場合があります。これは双方向テキストをサポートする他のプログラムの振る舞いとしては普通であり、似通っています。visual-order-cursor-movementを非nil値にセットした場合、矢印キーによるカーソル移動は、スクリーンでのvisual順にしたがいます(visual-order movementを参照してください)。