Spec-Zone.ru › Elisp

Движение по экранным строкам

Функции для работы со строками в предыдущем разделе подсчитывают текстовые строки, ограниченные только символами новой строки. В отличие от них, эти функции подсчитывают экранные строки, которые определяются тем, как текст отображается на экране. Текстовая строка является одной экранной строкой, если она достаточно короткая, чтобы поместиться по ширине выбранного окна; в противном случае она может занимать несколько экранных строк.

В некоторых случаях текстовые строки обрезаются на экране, а не продолжаются на дополнительных экранных строках. В таких случаях vertical-motion перемещает точку примерно так же, как forward-line. См. Обрезание.

Поскольку ширина данной строки зависит от флагов, управляющих отображением определённых символов, vertical-motion ведёт себя по-разному для заданного фрагмента текста в зависимости от буфера, в котором он находится, и даже от выбранного окна (поскольку ширина, флаг обрезания и таблица отображения могут различаться в разных окнах). См. Обычные соглашения отображения.

Эти функции просматривают текст, чтобы определить места разрывов экранных строк, поэтому время их работы пропорционально расстоянию просмотра.

Функция: vertical-motion count &optional window cur-col

Эта функция перемещает точку в начало экранной строки, расположенной на count экранных строк ниже экранной строки, содержащей точку. Если count отрицательно, точка перемещается вверх. Если count равно нулю, точка перемещается в визуальное начало текущей экранной строки.

Вместо целого числа аргумент count может быть конс-ячейкой (cols . lines). В этом случае функция перемещает точку на lines экранных строк, как описано выше для count, и помещает точку на расстоянии cols столбцов от визуального начала этой экранной строки. Значение cols может быть числом с плавающей точкой и интерпретируется в единицах канонической ширины символа рамки (см. Шрифт рамки); это позволяет точно указать горизонтальное положение точки, когда в целевой экранной строке используются шрифты переменной ширины. Обратите внимание, что cols отсчитывается от визуального начала строки; если окно прокручено по горизонтали (см. Горизонтальная прокрутка), столбец, в котором окажется точка, будет отсчитываться дополнительно к числу столбцов, на которое прокручен текст. Если целевая строка является строкой продолжения, её крайний левый столбец считается нулевым (в отличие от функций, работающих со столбцами; см. Подсчёт столбцов).

Возвращаемое значение — число экранных строк, на которое была перемещена точка. Его абсолютное значение может быть меньше count, если достигнуто начало или конец буфера.

Окно window используется для получения таких параметров, как ширина, горизонтальная прокрутка и таблица отображения. Однако vertical-motion всегда работает с текущим буфером, даже если в window в данный момент отображается другой буфер.

Необязательный аргумент cur-col задаёт текущий столбец при вызове функции. Это горизонтальная координата точки относительно окна, измеренная в единицах ширины шрифта стандартного начертания рамки. Указание этого аргумента ускоряет работу функции, особенно для очень длинных строк, поскольку ей не нужно возвращаться назад по буферу, чтобы определить текущий столбец. Обратите внимание, что cur-col также отсчитывается от визуального начала строки.

Функция: count-screen-lines &optional beg end count-final-newline window

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

Если область заканчивается символом новой строки, он игнорируется, если только необязательный третий аргумент count-final-newline не равен nil.

Необязательный четвёртый аргумент window задаёт окно, параметры которого используются, например ширину, горизонтальную прокрутку и т. д. По умолчанию используются параметры выбранного окна.

Как и vertical-motion, count-screen-lines всегда использует текущий буфер независимо от того, какой буфер отображается в window. Это позволяет использовать count-screen-lines в любом буфере, независимо от того, отображается ли он в каком-либо окне в данный момент.

Команда: move-to-window-line count

Эта функция перемещает точку относительно текста, отображаемого в данный момент в выбранном окне. Она перемещает точку в начало экранной строки, расположенной на count экранных строк ниже верхней части окна; ноль означает самую верхнюю строку. Если count отрицательно, оно задаёт позицию, расположенную на −count строк выше нижней части окна (или последнюю строку буфера, если буфер заканчивается выше указанной экранной позиции); таким образом, count, равное −1, задаёт последнюю полностью видимую экранную строку окна.

Если count равно nil, точка перемещается в начало строки посередине окна. Если абсолютное значение count превышает размер окна, точка перемещается в место, которое отображалось бы на этой экранной строке, если бы окно было достаточно высоким. Вероятно, при следующем обновлении отображения прокрутка переместит это место на экран.

При интерактивном вызове count является числовым префиксным аргументом.

Возвращаемое значение — номер экранной строки, в которую переместилась точка, относительно верхней строки окна.

Функция: move-to-window-group-line count

Эта функция похожа на move-to-window-line, за исключением того, что если выбранное окно является частью группы окон (см. Группа окон), move-to-window-group-line перемещает точку в позицию относительно всей группы, а не отдельного окна. Это условие выполняется, когда локальная переменная буфера move-to-window-group-line-function установлена в функцию. В этом случае move-to-window-group-line вызывает функцию с аргументом count, а затем возвращает её результат.

Функция: compute-motion from frompos to topos width offsets window

Эта функция просматривает текущий буфер и вычисляет экранные позиции. Она просматривает буфер вперёд от позиции from, полагая, что эта позиция имеет экранные координаты frompos, до позиции to или координат topos — в зависимости от того, что встретится раньше. Функция возвращает конечную позицию в буфере и экранные координаты.

Аргументы координат frompos и topos — это конс-ячейки вида (hpos . vpos).

Аргумент width — количество столбцов, доступных для отображения текста; он влияет на обработку строк продолжения. nil означает фактическое количество доступных текстовых столбцов в окне, что эквивалентно значению, возвращаемому (window-width window).

Аргумент offsets — это либо nil, либо конс-ячейка вида (hscroll . tab-offset). Здесь hscroll — количество столбцов, не отображаемых у левого края; большинство вызывающих эту функцию получают это значение вызовом window-hscroll. В свою очередь, tab-offset — это смещение между номерами столбцов на экране и номерами столбцов в буфере. Оно может быть ненулевым в строке продолжения, если ширина предыдущих экранных строк в сумме не кратна tab-width. В строке, не являющейся продолжением, это значение всегда равно нулю.

Окно window служит только для указания таблицы отображения. compute-motion всегда работает с текущим буфером независимо от того, какой буфер отображается в window.

Возвращаемое значение — список из пяти элементов:

(pos hpos vpos prevhpos contin)

Здесь pos — позиция в буфере, на которой остановился просмотр, vpos — вертикальная экранная позиция, а hpos — горизонтальная экранная позиция.

Результат prevhpos — горизонтальная позиция на один символ левее pos. Результат contin равен t, если последняя строка была продолжена после (или внутри) предыдущего символа.

Например, чтобы найти позицию в буфере, соответствующую столбцу col экранной строки line заданного окна, передайте в качестве from начальную позицию отображения окна, а в качестве frompos — координаты верхнего левого угла окна. Передайте (point-max) буфера в качестве to, чтобы ограничить просмотр концом доступной части буфера, а line и col — в качестве topos. Вот функция, которая это делает:

(defun coordinates-of-position (col line)
  (car (compute-motion (window-start)
                       '(0 . 0)
                       (point-max)
                       (cons col line)
                       (window-width)
                       (cons (window-hscroll) 0)
                       (selected-window))))

При использовании compute-motion для минибуфера необходимо использовать minibuffer-prompt-width, чтобы получить горизонтальную позицию начала первой экранной строки. См. Содержимое минибуфера.

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/Screen-Lines.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API