Как ждать события в функции Emacs Lisp? - PullRequest
6 голосов
/ 18 сентября 2011

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

7 голосов
/ 18 сентября 2011

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

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

1 голос
/ 18 сентября 2011

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

(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, если требуется более гибкий поиск.

...