Spec-Zone.ru › Elisp

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

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

В некоторых случаях текстовые строки обрезаются на экране, а не продолжаются на дополнительные строки экрана. В этих случаях 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

Spec-Zone.ru

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