2011-09-17 46 views
5

我試圖寫最簡單的功能:將查詢發送到w3m的瀏覽器,然後找到網頁上的特定位置:如何等待Emacs Lisp函數中的事件?

(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-searchset-window-start有幫助,但由於加載時間是任意的,所以不是很方便。

我該如何重寫這個函數,所以它會等到緩衝區重新載入,然後才做剩下的工作?

回答

7

在elisp中完成此操作的方法是使用hooks。所以你需要看看當頁面加載時w3m是否調用鉤子。如果是這樣,那麼你可以爲該鉤子註冊一個鉤子函數來執行你想要的操作。

它看起來像C-h v w3m-display-hook RET是你在找什麼。這裏是從good example開始。

+0

謝謝羅斯。 'w3m-display-hook'在正確的時間完成這項工作。 –

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) 

其中"domain"是網址的關鍵字匹配和"Search"是跳轉到唯一的字符串。當然,如果需要更靈活的搜索,search-forward可以替換爲re-search-forward