elisp:posn-at-point在goto-char之后返回nil。如何在posn-at-point之前更新显示?

时间:2010-04-11 07:05:55

标签: emacs elisp

在emacs lisp中,posn-at-point记录为:

  

posn-at-point是C source code中的内置函数   (posn-at-point&可选POS WINDOW)
  。
  返回WINDOW中缓冲POS的位置信息   POS默认指向WINDOW; WINDOW默认为选定的窗口   。
  如果在窗口中看不到位置,则返回nil。否则,
  返回值类似于event-start
返回的值   鼠标点击对应的字形左上角   到给定的缓冲位置:
     (WINDOW AREA-OR-POS(X.Y)TIMESTAMP OBJECT POS(COL.ROOW)
      图像(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-charposn-at-point之间更新 的位置,以便posn-at-point不会返回nil?

在Windows窗体应用程序中,我会调用Form.Update()或类似的东西来更新事件处理程序中间的显示。什么是emacs版本?

1 个答案:

答案 0 :(得分:1)

尝试:

 (goto-char xxx)
 (redisplay)

强制显示新职位。