Spec-Zone.ru › Elisp

Позиции начала и конца окна

Каждое окно содержит маркер, используемый для отслеживания позиции буфера, указывающей, где в буфере должно начинаться отображение. Эта позиция называется позицией display-start окна (или просто началом). Символ после этой позиции отображается в левом верхнем углу окна. Обычно, но не всегда, это начало строки текста.

После переключения окон или буферов, а также в некоторых других случаях, если начало окна находится посредине строки, Emacs корректирует начало окна до начала строки. Это предотвращает определённые операции, оставляющие начало окна в бессмысленной точке внутри строки. Эта функция может мешать тестированию некоторых кодов Lisp, выполняя их с помощью команд режима Lisp, поскольку они вызывают эту корректировку. Чтобы проверить такой код, поместите его в команду и привяжите команду к клавише.

Функция: window-start &optional window

Эта функция возвращает позицию display-start окна window. Если window равно nil, используется выбранное окно.

При создании окна или отображении другого буфера в нём позиция display-start устанавливается в последнюю использованную позицию display-start для того же буфера или в point-min, если буфер не имеет таковой.

Перерисовка обновляет позицию window-start (если вы её не задали явно с момента предыдущей перерисовки) — чтобы убедиться, что курсор отображается на экране. Ничто, кроме перерисовки, не изменяет позицию window-start; если вы перемещаете курсор, не ожидайте, что позиция window-start изменится в ответ до следующей перерисовки.

Функция: window-group-start &optional window

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

Функция: window-end &optional window update

Эта функция возвращает позицию, где заканчивается отображение буфера в window. По умолчанию window — выбранное окно.

Простое изменение текста буфера или перемещение курсора не обновляет значение, которое window-end возвращает. Значение обновляется только при перерисовке Emacs и завершении перерисовки без прерывания.

Если последняя перерисовка window была прервана и не завершена, Emacs не знает позиции конца отображения в этом окне. В этом случае эта функция возвращает nil.

Если update — не nil, window-end всегда возвращает актуальное значение конца отображения, основанное на текущем значении window-start. Если ранее сохранённое значение этой позиции всё ещё справедливо, window-end возвращает это значение; в противном случае вычисляет правильное значение, сканируя текст буфера.

Даже если update — не nil, window-end не пытается прокрутить отображение, если курсор вышел за пределы экрана, как это делает реальная перерисовка. Она не изменяет значение window-start. По сути, она сообщает, где закончится отображаемый текст, если прокрутка не требуется. Обратите внимание, что возвращаемая позиция может быть только частично видна.

Функция: window-group-end &optional window update

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

Функция: set-window-start window position &optional noforce

Эта функция устанавливает позицию display-start окна window в position в буфере window. Возвращает position.

Процедуры отображения настаивают на том, чтобы позиция курсора была видна при отображении буфера. Обычно они выбирают позицию display-start согласно своей внутренней логике (и прокручивают окно при необходимости), чтобы сделать курсор видимым. Однако, если вы задаёте позицию начала с помощью этой функции, используя nil для noforce, это означает, что вы хотите начать отображение с position, даже если это поместит курсор за пределами экрана. Если это помещает курсор за пределы экрана, процедуры отображения пытаются переместить курсор к левому краю на средней строке в окне.

Например, если курсор находится на позиции 1, а вы устанавливаете начало окна на 37, начало следующей строки, курсор будет выше верхней части окна. Процедуры отображения автоматически перемещают курсор, если он всё ещё равен 1 при перерисовке.

;; Here is what ‘foo’ looks like before executing
;;   the set-window-start expression.
---------- Buffer: foo ----------
∗This is the contents of buffer foo.
2
3
4
5
6
---------- Buffer: foo ----------
(set-window-start
 (selected-window)
 (save-excursion
   (goto-char 1)
   (forward-line 1)
   (point)))
⇒ 37
;; Here is what ‘foo’ looks like after executing
;;   the set-window-start expression.
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------

Если попытка сделать курсор видимым (т. е. в полностью видимой строке) терпит неудачу, процедуры отображения игнорируют запрошенную позицию window-start и вычисляют новую позицию. Таким образом, для получения надёжных результатов программы Lisp, вызывающие эту функцию, должны всегда перемещать курсор в пределах окна, отображение которого начинается с position.

Если noforce — не nil, и position поместит курсор за пределами экрана при следующей перерисовке, то перерисовка вычисляет новую позицию window-start, которая хорошо работает с курсором, и поэтому position не используется.

Функция: set-window-group-start window position &optional noforce

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

Функция: pos-visible-in-window-p &optional position window partially

Эта функция возвращает не-nil, если position находится в диапазоне текста, отображаемого на экране в window. Возвращает nil, если position прокручено вертикально за пределы области просмотра. Места, частично скрытые, не считаются видимыми, если partially не равно nil. Аргумент position по умолчанию — текущая позиция курсора в window; window по умолчанию — выбранное окно. Если position равно t, это означает проверку первой видимой позиции последней строки на экране в window или позиции конца буфера, в зависимости от того, какая из них появляется первой.

Эта функция учитывает только вертикальную прокрутку. Если position находится вне области просмотра только потому, что window был прокручен горизонтально, pos-visible-in-window-p возвращает не-nil.

Если position видна, pos-visible-in-window-p возвращает t, если partially равно nil; если partially — не nil, а символ, следующий за position, полностью виден, она возвращает список вида (x y), где x и y — координаты в пикселях относительно левого верхнего угла окна; в противном случае возвращает расширенный список вида (x y rtop rbot rowh vpos), где rtop и rbot указывают количество пикселей вне окна вверху и внизу строки в position, rowh указывает видимую высоту этой строки, а vpos указывает вертикальную позицию (номер строки, нумерация с нуля) этой строки.

Вот пример:

;; If point is off the screen now, recenter it now.
(or (pos-visible-in-window-p
     (point) (selected-window))
    (recenter 0))
Функция: pos-visible-in-window-group-p &optional position window partially

Эта функция похожа на pos-visible-in-window-p, за исключением того, что когда window является частью группы окон (см. Группу окон), pos-visible-in-window-group-p проверяет видимость pos во всей группе, а не только в отдельном window. Это условие выполняется, когда локальная переменная буфера pos-visible-in-window-group-p-function установлена в функцию. В этом случае pos-visible-in-window-group-p вызывает функцию с тремя аргументами position, window и partially, а затем возвращает её результат. Аргументы position и partially имеют то же значение, что и в pos-visible-in-window-p.

Функция: window-line-height &optional line window

Эта функция возвращает высоту текстовой строки line в window. Если line — это одна из header-line или mode-line, window-line-height возвращает информацию о соответствующей строке окна. В противном случае line — это номер текстовой строки, начиная с 0. Отрицательное число считает с конца окна. По умолчанию line — текущая строка в window, а window — выбранное окно.

Если отображение не обновлено, window-line-height возвращает nil. В этом случае, pos-visible-in-window-p может быть использован для получения связанной информации.

Если нет строки, соответствующей заданному line, window-line-height возвращает nil. В противном случае возвращает список (height vpos ypos offbot), где height — высота в пикселях видимой части строки, vpos и ypos — вертикальная позиция в строках и пикселях строки относительно верха первой текстовой строки, а offbot — количество пикселей вне окна внизу текстовой строки. Если есть пиксели вне окна вверху (первой) текстовой строки, ypos отрицательное.

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/Window-Start-and-End.html

Spec-Zone.ru

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