2011-09-17 10 views
5

estoy tratando de escribir la función más simple: enviar una consulta al navegador w3m y luego buscar un lugar concreto en la página web:¿Cómo se espera un evento en la función Emacs Lisp?

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

Cuál es el problema aquí es que w3m-search no espera hasta cargar la página y set-window-start se ejecuta en la página anterior. Luego, la página se recarga y coloca un cursor al principio del búfer.

(sleep-for ..) entre w3m-search y set-window-start ayuda, pero dado que el tiempo de carga es arbitrario, no es muy conveniente.

¿Cómo puedo volver a escribir esta función, por lo que esperaría hasta que el búfer vuelva a cargar y solo entonces haga el resto?

Respuesta

7

La forma de lograr esto en elisp es usando hooks. Entonces, necesitaría ver si w3m llama a un gancho cuando la página está cargada. Si es así, puede registrar una función de enlace para ese enlace que hace lo que quiere.

Parece que C-h v w3m-display-hook RET es lo que estás buscando. Aquí hay un good example para comenzar.

+0

Gracias, Ross. 'w3m-display-hook' hace el trabajo en el momento correcto. –

1

Sólo en caso de que si alguien tiene mismas ideas, eso es lo que he terminado con gracias a 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) 

donde "domain" es una palabra clave en la URL para que coincida y "Search" es la cadena única para saltar. Ciertamente, search-forward se puede reemplazar por re-search-forward, si se requiere una búsqueda más flexible.

Cuestiones relacionadas