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