読者です 読者をやめる 読者になる 読者になる

simplenote.elの改良

クラウドベースの自分用メモツールとして Simplenoteを使っています。

  • 動作が軽い
  • Markdown記法が使える (中途半端だけど...)
  • iPhone用クライアントがある

というのがポイント。正直デザインとかは以前使っていたCatch Noteの方がよかったですが、残念ながら昨年8月でサービス終了 (Simplenoteも同じようにならないことを祈ります)。で、最近これのEmacs用クライアントであるsimplenote.elを使い始めたのですが、いくつか不満な点があったので改良してみました。


1つのノートだけを同期するコマンドがない

ノートの同期を行うコマンドは、基本的に M-x simplenote-sync-notes しかありません。これは全ノートの同期を行うため、1ノートしか更新していなくても無駄に時間がかかります (最初に全ノートの更新状態を取得しに行くため)。M-x simplenote-push-buffer M-x simplenote-pull-buffer という、いかにも1ノートの更新ができそうなコマンドがありますが、READMEに書いてある通りこれらは M-x simplenote-create-note-from-buffer で作成したノート限定のコマンドになっています。これは、同期にはSimplenote上で管理されるノートのIDが必要で、前記コマンドで作成したノートはコメントとして挿入されたローカル変数でIDを保存していますが、通常のノートにはそれがないためです。

そこで、通常のノートでもこれらのコマンドで同期ができるように改良してみました。実は、通常のノートもファイル名がIDになっているので、それを利用しています。動作としては、以下のようになります。

  1. M-x simplenote-create-note-from-buffer で作成されたノートであれば従来通りの動作。
  2. 既存ノート (~/.simplenote/notes/ のファイル) であれば、ファイル名からIDを取得して1を実行。
  3. 新規ノート (~/.simplenote/new/ のファイル) であれば、新規ノートの作成を行い既存ノート置き場に移動。(pushの場合のみ)
  4. それ以外であれば、エラーメッセージを表示して何もしない。

ファイルの保存と同時に同期を行うようなhookを使っている方も多いかと思いますが、呼び出す関数を simplenote-sync-notes から simplenote-push-buffer に変更すれば、少し幸せになれると思います。

本当は、非同期処理にするのが一番いいのですが、そこまでするのは面倒だし、大幅な変更になるので一から書き直した方がいいですね。

全ノートの同期に時間がかかる

M-x simplenote-sync-notes で同期を行う際に、最初の同期など大量のノートの更新が発生するときにやたらと時間がかかります。これは、サーバとの認証用のトークンを各ノートの同期毎に取得し直しているのが原因の1つです。Simplenote APIのドキュメントによると、トークンは発行から24時間有効なので、1回の M-x simplenote-sync-notes では最初に取得したトークンを使い回しても問題ないはず。ということで、そのように修正したところ、自分の環境では半分程度の時間に改善しました。

ノート一覧のヘッダ行の長さがおかしい

些細な点ですが、78文字 (simplenote-note-head-size で設定された文字数) で切るようになっているはずが、日本語が入っていると意図通りに動作しません。文字数のカウントでマルチバイト文字が考慮されていなかったので、修正しました。


以上の改良を行ったsimplenote.elは、こちらから取得できます。なお、1つめの変更はすでに本家に取り込んでもらったので、そちらでも利用可能です (package.elを使用されている方は、アップデートするだけでOK)。残りの2つも取り込んでもらう予定です。 (2014/11/21追記) すべて取り込んで頂きました。

なお、"simplenote.el" でググるこちらが先に出てきますが、(READMEの先頭に書かれている通り) もう古いので使わないようにして下さい。Emacs24だと、ブラウザとsimplenote.elを併用したときにブラウザからの変更分が消えてしまう問題があります (date-to-time関数の挙動のバグ?のせい)。