GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Size-of-Displayed-Text.html ・ emacs-doc.conao3.com

42.10 表示テキストのサイズ

すべての文字が同じ幅を持つわけではないため、これらの関数を使えば文字の幅を確認できます。関連する関数については、インデントプリミティブおよび画面行単位の移動を参照してください。

関数: char-width char

この関数は、文字 char を現在のバッファに表示した場合の列数を返します(すなわち、バッファの表示テーブルがある場合はそれを考慮します。詳細は 表示テーブル を参照してください)。タブ文字の幅は通常 tab-width です(詳細は 一般的な表示規約 を参照してください)。

関数: char-uppercase-p char

char が Unicode の規定により大文字である場合は、nil 以外の値を返します。なお、Unicode 標準で対応する小文字が定義されている場合、その文字は大文字とみなされます。

関数: string-width string &optional from to

この関数は、文字列 string を現在のバッファおよび選択中のウィンドウに表示した場合の列数を返します。オプション引数 from および to は、string の中で考慮する部分文字列を指定し、substring と同様に解釈されます(文字列の作成 を参照)。

戻り値は近似値です。構成文字については char-width が返す値のみを考慮し、常にタブ文字を tab-width 列分として扱い、表示プロパティやフォントなどは無視します。こうした理由から、代わりに後述する window-text-pixel-size または string-pixel-width の使用を推奨します。

関数: truncate-string-to-width string width &optional start-column padding ellipsis ellipsis-text-property

この関数は、画面上のwidth列に収まるようにstringを切り捨てた新しい文字列を返します。

string が width よりも狭い場合、結果は string と等しくなります。そうでない場合は、結果から余分な文字が省略されます。string の複数列文字が目標 width を超える場合、その文字は結果から省略されます。したがって、結果は時に width に満たないことがありますが、それを超えることはありません。

オプション引数 start-column は開始列を指定し、デフォルトは 0 です。これが nil 以外の場合、文字列の先頭 start-column 列が結果から除外されます。string 内の複数列にわたる文字が列 start-column にまたがっている場合、その文字は除外されます。

オプション引数 padding は、nil でない場合、結果文字列の先頭と末尾に追加されるパディング文字であり、文字列をちょうど width 列まで拡張します。結果文字列が width に満たない場合は、width に達するまで必要な回数だけ、パディング文字が末尾に付加されます。また、string の複数列文字が列 start-column にまたがる場合は、結果文字列の先頭に付加されます。

ellipsis が nil 以外の場合、それは string が切り詰められた際にその末尾を置き換える文字列である必要があります。この場合、ellipsis が width 列に収まる十分なスペースを確保するため、string からさらに多くの文字が削除されます。ただし、string の表示幅が ellipsis の表示幅よりも小さい場合、ellipsis は結果に付加されません。ellipsis が nil 以外かつ文字列でない場合、それは後述する関数 truncate-string-ellipsis によって返される値を表します。

オプション引数 ellipsis-text-property が nil 以外の場合、文字列を実際に切り詰めるのではなく、省略記号を表示する display テキストプロパティ(display プロパティ を参照)を用いて string の超過部分を隠すことを意味します。

ピクセルレベルの解像度については、関数 truncate-string-pixelwise も参照してください。

(truncate-string-to-width "\tab\t" 12 4)
     ⇒ "ab"
(truncate-string-to-width "\tab\t" 12 4 ?\s)
     ⇒ "    ab  "

この関数は、string が広すぎる場合に string-width と char-width を用いて適切な切り捨て位置を特定するため、string-width と同様の根本的な問題を抱えています。特に、string 内で文字合成が行われる場合、文字列の表示幅が構成文字の幅の合計よりも小さくなる可能性があり、この関数は不正確な結果を返す恐れがあります。

関数: truncate-string-ellipsis

この関数は、truncate-string-to-width やその他の同様のコンテキストで省略記号として使用される文字列を返します。値は、変数 truncate-string-ellipsis が nil でない場合はその値となり、選択したフレームでその文字が表示可能であれば単一の文字 U+2026 HORIZONTAL ELLIPSIS を含む文字列、それ以外の場合は文字列 "..." となります。

以下の関数は、指定されたウィンドウに表示された場合のテキストのピクセル単位のサイズを返します。この関数は、fit-window-to-buffer および fit-frame-to-buffer(ウィンドウのサイズ変更を参照)で、ウィンドウをその内容に含まれるテキストと全く同じ大きさにするために使用されます。

関数: window-text-pixel-size &optional window from to x-limit y-limit mode-lines ignore-line-at-end

この関数は、windowのバッファに含まれるテキストの寸法をピクセル単位で返します。windowはアクティブなウィンドウである必要があり、デフォルトでは選択中のウィンドウが指定されます。戻り値は、任意のテキスト行の最大ピクセル幅と、すべてのテキスト行の最大ピクセル高さを要素とするコンスです。この関数は、Lispプログラムがwindowの寸法を表示に必要なバッファテキストに合わせて調整したり、その他の同様の状況に対応したりできるように用意されています。

戻り値には、オプションで(後述)寸法を測定した最初の行のバッファ位置を含めることもできます。

オプション引数 from は、nil 以外の場合、考慮する最初のテキスト位置を指定し、デフォルトではバッファの最小アクセス可能位置となります。from が t の場合、これは改行文字ではない最小アクセス可能位置を表します。from がコンスの場合、その car はバッファ位置を、cdr はその位置からテキストを測定する最初の画面行までのピクセル単位の垂直オフセットを指定します。(測定は、その画面行の視覚的な先頭から開始されます。)この場合、戻り値は、代わりに測定された最初の行のピクセル幅、ピクセル高さ、およびバッファ位置のリストとなります。オプション引数 to は、nil 以外の場合、考慮する最後のテキスト位置を指定し、デフォルトではバッファの最大アクセス可能位置となります。to が t の場合、これは改行文字ではない最大アクセス可能位置を表します。

オプション引数 x-limit は、nil 以外の場合、テキストを無視する基準となる最大 X 座標を指定します。したがって、これは関数が返し得る pixel-width の最大値でもあります。x-limit、nil が指定されているか、あるいは省略されている場合は、window の本体の pixel-width を使用することを意味します(ウィンドウサイズ を参照)。このデフォルト設定では、ウィンドウ幅を超える切り詰められた行のテキストは無視されます。このデフォルトは、呼び出し側が window の幅を変更する意図がない場合に有用です。それ以外の場合、呼び出し側はここで、window の本体が取り得る最大幅を指定する必要があります。特に、切り詰められた行が想定され、そのテキストを考慮する必要がある場合は、x-limit に大きな値を設定する必要があります。長い行の幅を計算するには時間がかかる場合があるため、この引数は必要に応じて小さく設定しておくことが常に望ましいです。特に、バッファにいずれにせよ切り詰められる長い行が含まれる可能性がある場合は、なおさらです。

オプション引数 y-limit は、nil 以外の場合、テキストを無視する上限の Y 座標を指定します。したがって、これは本関数が返し得る最大ピクセル高さでもあります。y-limit に nil が指定されているか、あるいは省略されている場合は、to で指定されたバッファ位置までのすべてのテキスト行を考慮することを意味します。大規模なバッファのピクセル高さを計算するには時間がかかる場合があるため、特に呼び出し側がバッファのサイズを把握していない場合には、この引数を指定するのが適切です。

オプション引数 mode-lines、nil を指定するか、あるいは省略した場合は、window のモード行、タブ行、またはヘッダー行の高さを戻り値に含めないことを意味します。シンボル mode-line、tab-line、または header-line のいずれかである場合は、該当する行が存在する場合に限り、その高さを戻り値に含めます。t である場合は、これらすべての行が存在する場合に限り、その高さを戻り値に含めます。

オプション引数 ignore-line-at-end は、to の画面行におけるテキストの高さを、返されるピクセル高さに含めるかどうかを制御します。これは、Lispプログラムが to の画面行の視覚的な開始位置まで(ただし開始位置自体は含まない)のテキスト寸法のみに関心がある場合に有用です。

window-text-pixel-size はウィンドウに表示されるテキストを全体として扱い、個々の行のサイズは考慮しません。 以下の関数は考慮します。

関数: window-lines-pixel-dimensions &optional window first last body inverse left

この関数は、指定された window に表示される各行のピクセル寸法を算出します。具体的には、window の現在のグリフ行列(window に現在表示されている各バッファ文字のグリフ(Glyphs を参照)を格納する行列)を走査することで算出を行います。正常に処理が完了した場合は、各行の最後の文字の右下隅の x 座標および y 座標を表す cons ペアのリストを返します。座標は、window の左上隅にある原点 (0, 0) を基準としてピクセル単位で計測されます。window はライブウィンドウである必要があり、デフォルトでは選択中のウィンドウが使用されます。

オプション引数 first が整数の場合、それは返される window のグリフ行列の1行目のインデックス(0から始まる)を示します。なお、window にヘッダー行がある場合、インデックス0の行はそのヘッダー行となります。first が nil である場合、最初に考慮される行はオプション引数 body の値によって決定されます。body が nil 以外である場合、これはヘッダー行が存在するならそれをスキップし、window の本体の1行目から開始することを意味します。それ以外の場合、この関数は window のグリフ行列の1行目(場合によってはヘッダー行)から開始します。

オプション引数 last が整数の場合、それは返される window のグリフ行列の最終行のインデックスを表します。last が nil である場合、考慮される最終行は body の値によって決定されます。body が nil 以外である場合、これは window のモード行(存在する場合)を除外し、window の本体の最終行を使用することを意味します。それ以外の場合は、モード行である可能性のある window の最終行を使用することを意味します。

オプション引数 inverse が nil である場合、任意の行で返される y ピクセル値は、window の左端(body が nil 以外の場合は本体の端)から、その行の最後のグリフの右端までのピクセル単位の距離を表します。inverse が nil 以外である場合、任意の行で返される y ピクセル値は、その行の最後のグリフの右端から window の右端(body が nil 以外の場合は本体の端)までのピクセル単位の距離を表します。これは、各行の末尾にある余裕スペースの量を判定する際に有用です。

オプション引数 left が nil 以外の場合、各行の最左端の文字の左下隅の x 座標および y 座標を返すことを意味します。これは、主に右から左へテキストを表示するウィンドウで使用すべき値です。

left が nil 以外であり、かつ inverse が nil である場合、これは任意の行で返される y ピクセル値が、当該行の最後(最左)のグリフの左端から window の右端(body が nil 以外の場合はボディ端)までのピクセル単位の距離を指定することを意味する。left と inverse がともに nil 以外である場合、任意の行で返される y ピクセル値は、window の左端(body が nil 以外の場合はボディ端)から当該行の最後(最左)のグリフの左端までのピクセル単位の距離を指定する。

この関数は、window の現在のグリフ行列が最新でない場合に nil を返します。これは通常、コマンドの処理中など、Emacs がビジー状態にあるときに発生します。ただし、この関数を遅延ゼロ秒のアイドルタイマーから実行した場合には、値を取得できるはずです。

関数: buffer-text-pixel-size &optional buffer-or-name window x-limit y-limit from to

これは window-text-pixel-size とよく似ていますが、バッファがウィンドウに表示されていない場合に使用できます。(表示されている場合は window-text-pixel-size の方が高速なため、その場合はこの関数を使用すべきではありません。)

buffer-or-name にはライブバッファまたはその名称を指定する必要があり、デフォルトでは現在のバッファが使用されます。window にはライブウィンドウを指定する必要があり、デフォルトでは選択中のウィンドウが使用されます。この関数は、buffer が window に表示されているものとしてテキストの寸法を計算します。戻り値は、任意のテキスト行の最大ピクセル幅と、buffer-or-name で指定されたバッファのアクセス可能な領域にあるすべてのテキスト行のピクセル高さを要素とするコンスです。

オプション引数 x-limit、y-limit、from および to は、window-text-pixel-size と同様の意味を持ちます。

関数: string-pixel-width string &optional buffer

これは、window-text-pixel-size を用いて string の幅(ピクセル単位)を計算する便利な関数です。注意点として、改行を含む文字列の幅を測定するためにこの関数を呼び出した場合、改行を含まない部分文字列の中で最も幅の広いものの幅が返されます。この結果が意味するのは、その文字列をバッファに挿入した際に得られる最も幅の広い行のことです。buffer が nil 以外である場合は、string の幅を計算する際に、そのバッファの任意のフェイスリマッピング(フェイスリマッピング を参照)を使用してください。

関数: truncate-string-pixelwise string max-pixels &optional buffer ellipsis ellipsis-pixels

これは、window-text-pixel-size を用いて string を max-pixels ピクセルに切り詰める便利な関数です。注意点として、改行を含む文字列の幅を測定するためにこの関数を呼び出した場合、改行を含まない部分文字列の中で最も幅の広いものの幅が返されます。この結果が意味するのは、その文字列をバッファに挿入した際に得られる最も幅の広い行のことです。buffer が nil 以外である場合は、string の幅を計算する際に、そのバッファの任意のフェイスリマッピング(フェイスリマッピング を参照)を使用してください。

ellipsis が nil 以外の場合、それは string が切り詰められた際にその末尾を置き換える文字列である必要があります。この場合、ellipsis が max-pixels ピクセル内に収まる十分なスペースを確保するため、string からさらに多くの文字が削除されます。ただし、string のピクセル幅が ellipsis のピクセル幅よりも小さい場合、ellipsis は結果に付加されません。ellipsis が nil 以外かつ文字列でない場合、それは前述の関数 truncate-string-ellipsis によって返される値を表します。

ellipsis-pixels が nil ではなく、かつ ellipsis が nil ではない場合、同じバッファを指定して string-pixel-width を用いて事前計算しておくべき ellipsis のピクセル数となります。これは、同じ省略記号文字列を用いて切り詰める文字列が多数ある場合に、この値を繰り返し再計算するコストを回避するのに有用です。

文字レベルの解決を行う関数 truncate-string-to-width も参照してください。

関数: line-pixel-height

この関数は、選択したウィンドウ内の指定した点における行の高さをピクセル単位で返します。この値には、行の行間が含まれています(行の高さを参照)。

関数: string-glyph-split string

文字合成が有効な場合、アクセント付き文字や合字、絵文字の表示、あるいは一部の文字体系で複雑なテキストシェイピングが必要な場合など、書記素クラスターを形成するために文字の順序が合成されることがあります。このような場合、文字はもはや単純に表示列にマッピングされなくなり、幅が広すぎる文字列の切り捨てといった、そのような文字列に対する表示レイアウトの決定は複雑な作業となり得ます。この関数は、こうした処理を行う際に役立ちます。具体的には、引数 string を部分文字列のリストに分割し、各部分文字列を、一つの単位として表示されるべき単一の書記素クラスターとして生成します。これにより、Lispプログラムはこのリストを用いて、表示上で正しく見える視覚的に妥当な string の部分文字列を構築したり、返されたリスト内の構成要素の幅を加算することで string の任意の部分文字列の幅を計算したりすることが可能になります。

例えば、最初のグリフを除いた文字列を表示したい場合は、次のように記述できます。

(apply #'insert (cdr (string-glyph-split string))))

注意:この関数が文字構成を認識・処理するには、auto-composition-modeが有効になっており、かつ現在のバッファがいずれかのウィンドウに表示されている必要があります。

バッファを行番号付きで表示する場合(The GNU Emacs ManualのDisplay Customを参照)、行番号の表示に要する幅を把握しておくと便利なことがあります。以下の関数は、レイアウト計算のためにこの情報を必要とするLispプログラム向けのものです。

関数: line-number-display-width &optional pixelwise

この関数は、選択されたウィンドウで行番号の表示に使用される幅を返します。オプション引数 pixelwise がシンボル columns の場合、戻り値はフレームの正準列数を表す浮動小数点数となります。pixelwise が t またはその他の nil 以外の値である場合、値は整数となり、ピクセル単位で測定されます。pixelwise が省略されているか、または nil の場合、値は line-number フェイスに定義されたフォントの列数(整数)となり、表示上の数値のパディングに使用される2列は含まれません。選択されたウィンドウに行番号が表示されていない場合、pixelwise の値に関わらず、値は 0 となります。別のウィンドウに関するこの情報が必要な場合は、with-selected-window を使用してください(ウィンドウの選択 を参照)。