В emacs lisp, posn-at-point
задокументировано как:
posn-at-point - встроенная функция в C source code
.
(posn-at-point и необязательное ОКНО POS)
.
Возврат информации о положении для буфера POS в WINDOW.
POS по умолчанию указывает на ОКНО; ОКНО по умолчанию соответствует выбранному окну.
.
Возвращает ноль, если позиция не видна в окне. В противном случае,
возвращаемое значение аналогично возвращаемому event-start
для
щелчок мышью в верхнем левом углу глифа, соответствующего
в заданную позицию буфера:
(ОКНО-ИЛИ-ПОС (X. Y) ПОИСК ОБЪЕКТА ВРЕМЕННОГО ЛАМПЫ (КОЛ. СТРОКА)
ИЗОБРАЖЕНИЕ (DX. DY) (ШИРИНА. ВЫСОТА))
Функции posn-
обеспечивают доступ к элементам таких списков.
Хорошо, теперь у меня есть функция, которая выглядит примерно так:
(defun my-move-and-popup-menu ()
"move the point, then pop up a menu."
(goto-char xxxx)
(setq p (posn-at-point))
(my-popup-menu p ...)
)
По сути, переместите точку, затем найдите положение экрана в этой точке, а затем откройте меню в этой позиции экрана.
Но я обнаружил, что posn-at-point
возвращает ненулевое значение, только если позиция символа xxxx ( после позиции) видна в окне, до вызова goto-char
. Кажется, что позиция фактически не обновляется до выхода из функции. Если goto-char
проходит долгий путь, больше чем один экран, то найденная позиция всегда равна нулю, и мой код не знает, где открыть меню.
Причина, по которой я предлагаю, чтобы позиция фактически не обновлялась до выхода из функции - когда меню успешно всплывает, курсор хорошо виден в своем предыдущем месте, пока отображается всплывающее меню. Когда я закрываю меню, курсор перемещается туда, где я ожидал, после вызова goto-char
.
Как я могу получить позицию, которая будет действительно обновлена, между goto-char
и posn-at-point
, чтобы posn-at-point
не вернул ноль?
В приложении Windows Forms я бы вызвал Form.Update () или что-то подобное, чтобы обновить отображение в середине обработчика событий. Что это за версия Emacs?