Как ждать события в функции Emacs Lisp?

Я пытаюсь написать простейшую функцию: отправить запрос в браузер 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 ответа

Решение

Способ сделать это в elisp - использовать хуки. Так что вам нужно посмотреть, вызывает ли w3m хук при загрузке страницы. Если это так, то вы можете зарегистрировать функцию ловушки для той ловушки, которая делает то, что вы хотите.

Это выглядит как C-h v w3m-display-hook RET это то, что вы ищете. Вот хороший пример для начала.

На всякий случай, если у кого-то есть такие же идеи, вот чем я закончил благодаря Россу:

(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" это ключевое слово в URL для соответствия и "Search" уникальная строка для перехода Конечно, search-forward можно заменить на re-search-forward, если требуется более гибкий поиск.

Другие вопросы по тегам