如何在Emacs Lisp函数中等待事件?

时间:2011-09-17 22:10:23

标签: emacs elisp w3m

我正在尝试编写最简单的函数:向w3m浏览器发送查询,然后在网页上找到一个特定的位置:

(defun w3m-define-word (word)
  (interactive "sDefine: ")
  (progn (w3m-search "Dictionary" word)
         (set-window-start nil (search-forward "Search Results"))))

这里的错误是w3m-search不会等到页面重新加载并且set-window-start在旧页面上执行。然后页面重新加载并将光标放在缓冲区的开头。

(sleep-for ..)w3m-search之间的

set-window-start会有所帮助,但由于加载时间是任意的,所以不太方便。

我怎样才能重写这个函数,所以它会等到缓冲区重新加载然后才能完成剩下的工作?

2 个答案:

答案 0 :(得分:7)

在elisp中实现此目的的方法是使用hooks。所以你需要看看w3m在加载页面时是否调用了一个钩子。如果是这样,那么你可以为那个做你想做的事情的钩子注册一个钩子函数。

看起来C-h v w3m-display-hook RET正是您正在寻找的。这是一个good example开始。

答案 1 :(得分:1)

如果有人有相同的想法,那就是我最终得到的结果,感谢Ross:

(defun w3m-goto-on-load (url)
  "Go to a position after page has been loaded."
  (cond
    ((string-match "domain" url)
      (progn
        (set-window-start nil (search-forward "Search" nil t) nil)))
    (t nil)))
(add-hook 'w3m-display-hook 'w3m-goto-on-load)

其中"domain"是要匹配的网址中的关键字,"Search"是要跳转到的唯一字符串。当然,如果需要更灵活的搜索,search-forward可以替换为re-search-forward