Размер отображаемого текста
Поскольку ширина не всех символов одинакова, эти функции позволяют проверить ширину символа. См. Примитивы отступов и Перемещение по экранным строкам — там описаны связанные функции.
- Функция: char-width char
Эта функция возвращает ширину символа char в столбцах, если бы он отображался в текущем буфере (то есть с учетом таблицы отображения буфера, если она есть; см. Таблицы отображения). Ширина символа табуляции обычно равна
tab-width(см. Обычные соглашения об отображении).
- Функция: char-uppercase-p char
Возвращает значение, отличное от
nil, если символ char является прописным согласно Unicode. Обратите внимание, что символ считается прописным, если в стандарте 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-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 должно быть действующим окном; по умолчанию используется выбранное окно. Возвращаемое значение — пара 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 &optional buffer
Это вспомогательная функция, которая использует
window-text-pixel-sizeдля вычисления ширины string в пикселях. Примечание: если вызвать эту функцию для измерения ширины строки со встроенными символами новой строки, она вернет ширину самой широкой подстроки, не содержащей символов новой строки. Это значение соответствует ширине самой длинной строки, на которую разобьется string при вставке в буфер. Если buffer не равенnil, при вычислении ширины string используются переназначения начертаний (см. Переназначение начертаний) из этого буфера.
- Функция: truncate-string-pixelwise string max-pixels &optional buffer ellipsis ellipsis-pixels
-
Это вспомогательная функция, которая использует
window-text-pixel-sizeдля усечения string до max-pixels пикселей. Примечание: если вызвать эту функцию для измерения ширины строки со встроенными символами новой строки, она вернет ширину самой широкой подстроки, не содержащей символов новой строки. Это значение соответствует ширине самой длинной строки, на которую разобьется string при вставке в буфер. Если buffer не равенnil, при вычислении ширины string используются переназначения начертаний (см. Переназначение начертаний) из этого буфера.Если ellipsis не равен
nil, он должен быть строкой, которая заменит конец string при усечении. В этом случае из string будет удалено больше символов, чтобы освободить достаточно места для ellipsis в пределах max-pixels пикселей. Однако если ширина string в пикселях меньше ширины ellipsis в пикселях, ellipsis не будет добавлена в результат. Если ellipsis не равенnilи не является строкой, он обозначает значение, возвращаемое описанной выше функциейtruncate-string-ellipsis.Если ellipsis-pixels не равен
nil, а ellipsis не равенnil, этот аргумент должен задавать количество пикселей в ellipsis, которое следует предварительно вычислить с помощьюstring-pixel-width, указав тот же буфер. Это полезно, если нужно усечь много строк с одинаковой строкой многоточия, чтобы не вычислять это значение повторно.Для разрешения на уровне символов см. также функцию
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, а текущий буфер должен отображаться в каком-либо окне.
Если буфер отображается с номерами строк (см. Настройка отображения в Руководстве по GNU Emacs), иногда полезно знать ширину, занимаемую номерами строк. Следующая функция предназначена для программ на Lisp, которым эта информация нужна при вычислении размещения.
- Функция: line-number-display-width &optional pixelwise
Эта функция возвращает ширину, используемую для отображения номеров строк в выбранном окне. Если необязательный аргумент pixelwise равен символу
columns, возвращаемое значение является числом с плавающей точкой и выражается в канонических столбцах фрейма; если pixelwise равенtили любому другому значению, отличному отnil, значение является целым числом и измеряется в пикселях. Если pixelwise не указан или равенnil, значение представляет собой целое число столбцов шрифта, заданного для начертанияline-number, и не включает 2 столбца, используемые для отступов при отображении номеров. Если номера строк в выбранном окне не отображаются, значение равно нулю независимо от значения pixelwise. Используйтеwith-selected-window(см. Выбор окон), если эта информация нужна для другого окна.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Size-of-Displayed-Text.html