42.10 Размер отображаемого текста

Поскольку не все символы имеют одинаковую ширину, эти функции позволяют проверить ширину символа. См. Примитивы отступов и Перемещение по экранным строкам для связанных функций.

Функция: char-width char

Эта функция возвращает ширину в колонках символа char, если бы он отображался в текущем буфере (т.е. с учётом таблицы дисплея буфера, если она есть; см. Таблицы дисплея). Ширина символа табуляции обычно равна tab-width (см. Обычные соглашения отображения).

Функция: char-uppercase-p char

Возвращает не nil, если char является символом в верхнем регистре согласно стандарту 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

Эта функция возвращает новую строку, которая является усечением string, помещающимся в width колонок при отображении.

Если string уже уже, чем width, результат равен string; в противном случае лишние символы из результата исключаются. Если многоколонный символ в string превышает целевую width, этот символ исключается из результата. Таким образом, результат иногда может оказаться меньше width, но не может превысить её.

Необязательный аргумент start-column задаёт начальную колонку; по умолчанию он равен нулю. Если он не равен nil, то первые start-column колонок строки исключаются из результата. Если один многоколонный символ в string пересекает колонку start-column, этот символ исключается.

Необязательный аргумент padding, если не равен nil, является заполняющим символом, добавляемым в начало и конец результирующей строки, чтобы расширить её ровно до width колонок. Заполняющий символ добавляется в конец результата, если тот не достигает width, столько раз, сколько необходимо для достижения width. Он также добавляется в начало результата, если многоколонный символ в string пересекает колонку start-column.

Если ellipsis не равен nil, это должна быть строка, которая заменит конец string при усечении. В этом случае из string будет удалено больше символов, чтобы освободить достаточно места для ellipsis в пределах width колонок. Однако если ширина отображения string меньше ширины отображения ellipsis, то ellipsis не будет добавлен к результату. Если ellipsis не равен nil и не является строкой, он обозначает значение, возвращаемое функцией truncate-string-ellipsis, описанной ниже.

Необязательный аргумент ellipsis-text-property, если не равен nil, означает скрытие избыточных частей string с помощью текстового свойства display (см. Свойство display), показывающего многоточие, вместо фактического усечения строки.

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

Эта функция использует string-width и char-width для поиска подходящей точки усечения, когда string слишком широка, поэтому она страдает от тех же основных проблем, что и 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 должно быть активным окном и по умолчанию равно выбранному. Возвращаемое значение — это cons из максимальной пиксельной ширины любой текстовой строки и максимальной пиксельной высоты всех текстовых строк. Эта функция существует, чтобы позволить программам на Lisp подгонять размеры window под отображаемый текст буфера, а также для других подобных ситуаций.

Возвращаемое значение также может (опционально, см. ниже) включать позицию в буфере первой строки, чьи размеры были измерены.

Необязательный аргумент from, если не равен nil, задаёт первую текстовую позицию для рассмотрения; по умолчанию — минимальная доступная позиция буфера. Если from равен t, это означает минимальную доступную позицию, не являющуюся символом новой строки. Если from является cons, его car задаёт позицию в буфере, а его cdr задаёт вертикальное смещение в пикселях от этой позиции до первой экранной строки, чей текст должен быть измерен. (Измерение начнётся с визуального начала этой экранной строки.) В этом случае возвращаемое значение вместо этого будет списком из пиксельной ширины, пиксельной высоты и позиции в буфере первой измеренной строки. Необязательный аргумент to, если не равен nil, задаёт последнюю текстовую позицию для рассмотрения; по умолчанию — максимальная доступная позиция буфера. Если to равен t, это означает максимальную доступную позицию, не являющуюся символом новой строки.

Необязательный аргумент x-limit, если не равен nil, задаёт максимальную координату X, за пределами которой текст следует игнорировать; поэтому это также наибольшее значение пиксельной ширины, которое может вернуть функция. Если x-limit равен nil или опущен, это означает использование пиксельной ширины тела window (см. Размеры окон); это значение по умолчанию означает, что текст обрезанных строк, шире окна, будет игнорироваться. Это значение по умолчанию полезно, когда вызывающая сторона не намерена изменять ширину 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. В случае успеха она возвращает список cons-пар, представляющих координаты x и y правого нижнего угла последнего символа каждой строки. Координаты измеряются в пикселях от начала координат (0, 0) в верхнем левом углу window. window должно быть активным окном и по умолчанию равно выбранному.

Если необязательный аргумент first является целым числом, он обозначает индекс (начиная с 0) первой строки глиф-матрицы window, которая должна быть возвращена. Обратите внимание, что если window имеет строку заголовка, строка с индексом 0 является этой строкой заголовка. Если first равен nil, первая строка для рассмотрения определяется значением необязательного аргумента body: если body не равен nil, это означает начало с первой строки тела window, пропуская строку заголовка, если она есть. В противном случае эта функция начнёт с первой строки глиф-матрицы window, возможно, со строки заголовка.

Если необязательный аргумент last является целым числом, он обозначает индекс последней строки глиф-матрицы window, которая должна быть возвращена. Если last равен nil, последняя строка для рассмотрения определяется значением body: если body не равен nil, это означает использование последней строки тела window, пропуская строку режима window, если она есть. В противном случае это означает использование последней строки window, которой может быть строка режима.

Необязательный аргумент inverse, если равен nil, означает, что возвращаемое для любой строки значение y-пикселя задаёт расстояние в пикселях от левого края (края тела, если body не равен nil) window до правого края последнего глифа этой строки. inverse, не равный nil, означает, что возвращаемое для любой строки значение y-пикселя задаёт расстояние в пикселях от правого края последнего глифа этой строки до правого края (края тела, если body не равен nil) window. Это полезно для определения объёма свободного места в конце каждой строки.

Необязательный аргумент left, если не равен nil, означает возврат координат x и y левого нижнего угла самого левого символа в каждой строке. Это значение следует использовать для окон, в которых в основном отображается текст справа налево.

Если left не равен nil, а inverse равен nil, это означает, что возвращаемое для любой строки значение y-пикселя задаёт расстояние в пикселях от левого края последнего (самого левого) глифа этой строки до правого края (края тела, если body не равен nil) window. Если и left, и inverse не равны nil, возвращаемое для любой строки значение y-пикселя задаёт расстояние в пикселях от левого края (края тела, если body не равен nil) window до левого края последнего (самого левого) глифа этой строки.

Эта функция возвращает nil, если текущая глиф-матрица window не актуальна, что обычно происходит, когда Emacs занят, например, при обработке команды. Значение должно быть доступно, однако, если запустить эту функцию из таймера простоя с нулевой задержкой.

Функция: buffer-text-pixel-size &optional buffer-or-name window x-limit y-limit

Эта функция очень похожа на window-text-pixel-size, но может использоваться, когда буфер не отображается в окне. (window-text-pixel-size работает быстрее, когда буфер отображается, поэтому в этом случае данную функцию использовать не следует.)

buffer-or-name должен задавать активный буфер или имя активного буфера и по умолчанию равен текущему буферу. window должно быть активным окном и по умолчанию равно выбранному; функция будет вычислять размеры текста так, как если бы buffer отображался в window. Возвращаемое значение — это cons из максимальной пиксельной ширины любой текстовой строки и пиксельной высоты всех текстовых строк доступной части буфера, заданного buffer-or-name.

Необязательные аргументы x-limit и y-limit имеют тот же смысл, что и в window-text-pixel-size.

Если вы хотите измерить размеры некоторой части текста буфера, сузьте буфер до этой части перед вызовом этой функции (см. Сужение).

Функция: string-pixel-width string

Это удобная функция, использующая window-text-pixel-size для вычисления ширины string (в пикселях). Предостережение: если вы вызываете эту функцию для измерения ширины строки с встроенными символами новой строки, она вернёт ширину самой широкой подстроки, не содержащей символов новой строки. Смысл этого результата — ширина самой широкой строки, которую займёт строка при вставке в буфер.

Функция: line-pixel-height

Эта функция возвращает высоту в пикселях строки в точке в выбранном окне. Значение включает межстрочный интервал строки (см. Высота строки).

Функция: string-glyph-split string

Когда действует композиция символов, последовательности символов могут объединяться для отображения в кластеры графем, например, для отображения символов с диакритическими знаками, лигатур, эмодзи или когда сложное формирование текста требует этого для некоторых письменностей. Когда это происходит, символы больше не отображаются простым способом в колонках, и решения по компоновке отображения для таких строк, например усечение слишком широких строк, могут быть сложной задачей. Эта функция помогает в выполнении таких задач: она разбивает свой аргумент string на список подстрок, где каждая подстрока создаёт один кластер графем, который должен отображаться как единое целое. Программы на Lisp могут затем использовать этот список для построения визуально корректных подстрок string, которые будут правильно выглядеть на дисплее, или вычислять ширину любой подстроки string путём сложения ширины её составляющих в возвращённом списке и т.д.

Например, если вы хотите отобразить строку без первого глифа, вы можете сказать:

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

Когда буфер отображается с номерами строк (см. Настройка отображения в Руководстве по GNU Emacs), иногда полезно знать ширину, занимаемую отображением номеров строк. Следующая функция предназначена для программ на Lisp, которым эта информация нужна для расчётов компоновки.

Функция: line-number-display-width &optional pixelwise

Эта функция возвращает ширину, используемую для отображения номеров строк в выбранном окне. Если необязательный аргумент pixelwise равен символу columns, возвращаемое значение является числом с плавающей точкой, представляющим количество канонических колонок кадра; если pixelwise равен t или любому другому не nil значению, значение является целым числом и измеряется в пикселях. Если pixelwise опущен или равен nil, значение является целым числом колонок шрифта, определённого для лица line-number, и не включает 2 колонки, используемые для заполнения номеров при отображении. Если номера строк не отображаются в выбранном окне, значение равно нулю независимо от значения pixelwise. Используйте with-selected-window (см. Выбор окон), если вам нужна эта информация о другом окне.