Движение по строкам экрана
Функции строк в предыдущем разделе подсчитывают текстовые строки, ограниченные только символами новой строки. В отличие от этого, эти функции подсчитывают строки экрана, которые определяются способом отображения текста на экране. Текстовая строка является одной строкой экрана, если она достаточно короткая, чтобы поместиться по ширине выбранного окна, но в противном случае она может занимать несколько строк экрана.
В некоторых случаях текстовые строки обрезаются на экране, а не продолжаются на дополнительные строки экрана. В этих случаях vertical-motion перемещает точку точно так же, как forward-line. См. Обрезку.
Поскольку ширина заданной строки зависит от флагов, которые контролируют отображение определенных символов, vertical-motion ведет себя по-разному для заданного фрагмента текста в зависимости от буфера, в котором он находится, и даже от выбранного окна (потому что ширина, флаг обрезки и таблица отображения могут отличаться между окнами). См. Обычное отображение.
Эти функции сканируют текст, чтобы определить, где разрываются строки экрана, и, следовательно, затрачивают время пропорционально пройденному расстоянию.
- Функция: vertical-motion count &optional window cur-col
-
Эта функция перемещает точку к началу строки экрана, на count строк экрана ниже строки экрана, содержащей точку. Если count отрицательное, оно перемещается вверх вместо этого.
Аргумент count может быть ячейкой cons,
(cols . lines), вместо целого числа. Тогда функция перемещается на lines строк экрана и помещает точку на 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 являются ячейками cons вида
(hpos . vpos).Аргумент width — количество столбцов, доступных для отображения текста; это влияет на обработку продолжения строк.
nilозначает фактическое количество используемых столбцов текста в окне, что эквивалентно значению, возвращаемому(window-width window).Аргумент offsets — это либо
nilили ячейка cons вида(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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Screen-Lines.html