elisp: posn-at-point возвращает ноль после goto-char. Как обновить отображение перед posn-at-point? - PullRequest
1 голос
/ 11 апреля 2010

В 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?

1 Ответ

1 голос
/ 11 апреля 2010

Попробуйте:

 (goto-char xxx)
 (redisplay)

для принудительного отображения новой позиции.

...