我正在尝试编写最简单的函数:向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
会有所帮助,但由于加载时间是任意的,所以不太方便。
我怎样才能重写这个函数,所以它会等到缓冲区重新加载然后才能完成剩下的工作?
答案 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
。