Как ждать события в функции 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
, если требуется более гибкий поиск.