Org-modeとToodledoを連携させるorg-toodledo.elを非同期実行に対応させました


ToodledoとOrg-modeを連携させることができるorg-toodledo.el、大変便利で愛用させてもらってます。

Emacsで書いたorg文書とToodledoを同期するorg-toodledo – 勉強日記
WeBlowg Side:org-modeとToodledoを連携してどこでもタスク管理

元々は、Org-mode界隈では有名なSacha chua さんが作っていたものをChristopher さんがforkしたものがMELPAにも登録されていました。

が、どうやらChristopherさんもメンテをしなくなってしまったようで、不具合が残ったままになっていました。

というわけで、そちらをまたforkしまして、org-toodledoをメンテしていくことにしました。MELPAにはすでに私のリポジトリに切りかえてもらいましたので、package.el等をお使いの方は、更新してもらえればいいと思います。

myuhe/org-toodledo

主な変更点は以下の4点です。

xml解析をxml-parse-regionからlibxml-parse-xml-regionに切りかえました

Emacs24.1からサポートされたlibxml2によりxml解析の関数として libxml-parse-xml-region が追加されています。この関数は処理が高速なのがウリでして、Emacs24.4から同梱されるようになったWebブラウザ eww でもその多大な恩恵を受けいます。

というわけで、org-toodledoでもその恩恵があるかもと切りかえてみることにしました。

Toodledoとの通信バックエンドをrequest.elに切りかえました

本家では、=url-http= パッケージをバックエンドに使う http-post-simple.elを使っています。

EmacsWiki: http-post-simple.el

このライブラリは、確かにシンプルで環境にも依存せず良いライブラリではあるのですが、今時使うならやっぱり request.elかなと思いましてこっちに切りかえました。

Request.el – Easy HTTP request for Emacs Lisp — Request.el 0.2.0 documentation

環境によってCurlなどに自動で切りかえてくれる便利なライブラリです。また、後述するdeferred.elとの親和性も高いため、こちらを使うことにしました。

Travis CI導入

それなりに大きなプログラムなので、Travis CIを導入してみました。とは言うもののあまりテスト書けてません。。。 まあ、おいおい。

ToodledoとOrg-modeの同期が非同期に実行できるようになりました

これがもっとも大きな変更点です。

本家では、通信周りが同期的に動作するようになっていて、同期するたびにガッツリブロックするその仕様に度々イライラしておりました。

今回の変更では、deferred.elを使ってToodledoとの通信からxmlの処理諸々が非同期に行なえるようになっています。また、deferrd.elの機能を使ってサーバとの通信を並列化したりしているので、高速化も期待できます。

deferred.el リリース – 技術日記@kiwanami
emacs-deferred/README.ja.markdown at master · kiwanami/emacs-deferred

ただ、いろいろと動作が不安定なところもあるため、非同期関連の変更については、asyncブランチで作業を行なっています。

myuhe/org-toodledo at async

dogfood eaterの皆様におかれましては、是非お召しあがりください。

今回の変更で気になっていた点は、ほぼ修正できたように思います。今後は、テストの追加やリファクタリングなどこまごまとした所に手を加えていこうかと思っています。

苦情、ご相談はGitHubのIssueにお願いします。不具合などはついでにテスト書いてプルリクもらえれば、大変ありがたいです。