Gyorskeresés SZTAKI-ban a kurzor alatti szóra

A funkció azóta továbbfejlődött, az emacs-sztaki legfrissebb kódbázisa elérhető a GitHubon.

A WThreeM csomag egy kevésbé ismert sajátja a w3m-retrieve-and-render függvény, amely az argumentumként kapott erőforrás szerinti weblapot az aktuális pufferben jeleníti meg. Az utolsó paramétereként átadott handler függvény segítségével aszinkron viselkedésre sarkallható, amely eredményeképpen az oldal betöltődése, majd rendelése befejeztével ez az eseménykezelő hívódik meg. A fejtörést a handler függvényfejének implementálása okozta, mígnem a w3m.el forrását tallózva rátaláltam a w3m-process-with-wait-handler-re, amely hatáskörében bevezet egy handler változót, amelyet már a w3m-retrieve-and-render is elfogad. Így megvalósítható egy olyan blokk, amelyen csak az aszinkron folyamat befejeztével lép tovább a feldolgozó. (Az aszinkron mivolthoz a folyamat háttérben futtatásához van szükség.) A továbbiakban pedig némi körítéssel bármilyen, kultúrált API-val nem rendelkező webes szolgáltatáshoz építhető burkoló. Az alábbiakban esettanulmányként álljon itt a SZTAKI angol–magyar fordítóját kiaknázó függvény, amely a kurzor alatti kifejezés fordítását keresi ki, majd küldi vissza a minipufferbe.

(defun sztaki-phrase-lookup ()
  "Look up the phrase under cursor in SZTAKI and echo translation if any."
  (interactive)
  (let* ((phrase (thing-at-point 'word))
         (url (concat "http://szotar.sztaki.hu/dict_search.php"
                      "?O=HUN&E=1&L=ENG%3AHUN%3AEngHunDict&W="
                      (w3m-url-encode-string phrase)))
         (match (format "phrase '%s' not found" phrase)))
    (with-temp-buffer
      (w3m-process-with-wait-handler
        (w3m-retrieve-and-render url nil nil nil nil handler))
      (when (re-search-forward (concat phrase ":.*") nil t)
        (setq match (match-string 0))))
    (message (concat "SZTAKI: " match))))

Az ötletet Xah Lee Emacs Lisp Grab Bag! feladatai között talált word-definition-lookup függvénye adta.