7

我正在尝试编写最简单的功能:向 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 ..)between w3m-searchand 有set-window-start帮助,但是由于加载时间是任意的,所以不是很方便。

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

4

2 回答 2

7

在 elisp 中实现这一点的方法是使用hooks。所以你需要看看 w3m 在页面加载时是否调用了一个钩子。如果是这样,那么您可以为该钩子注册一个钩子函数来满足您的需求。

看起来C-h v w3m-display-hook RET就是你要找的东西。这是一个很好的例子

于 2011-09-17T22:26:35.723 回答
1

以防万一有人有相同的想法,这就是我最终得到的结果,这要感谢罗斯:

(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)

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

于 2011-09-18T14:52:54.313 回答