calfwからGoogleカレンダーを編集するcalfw-gcal.elを書いてみた


こないだ@kiwanamiさんがリリースしたcalfw.elが本当に素晴らしいんです。

Emacsでカレンダーコンポーネントを作った – 技術日記@kiwanami

早速使わせてもらって、faceとかもちょこっと変えて今は↓のような感じになってます。

http://art35.photozou.jp/pub/203/61203/photo/64656340.v1295276288.png

Emacs標準のcalendarは、ろくに起動することすらありませんでしたが、calfw.elは一等地キーバインドを割り当てて常用させてもらっています。いつも素敵なelispありがとうございます。

calfw.elの特に素敵なところはicalと連携できるところで、googleカレンダーを常用している僕としては非常にありがたいところです。

ただ、calfw.elはicalを表示するだけで、googleカレンダーの予定を編集したりすることはできないようです。ここまで来るとEmacsからgoogleカレンダーの予定も管理したい!!

てことで、calfw.elのインターフェイスからgoogleカレンダーを編集するcalfw-gcal.elなるものを書いてみました。

googleclのインストール、設定

calfw-gcal.elはgoogleカレンダーの編集をgoogleclを介して行うので、googleclをインストールしておく必要があります。googlecodeにあるので、まずはインストールしておきましょう。

Downloads – googlecl – Project Hosting on Google Code

インストール後は、認証作業が必要です。ターミナルからgoogleclの何かしらのコマンドを入力すると、ブラウザが開き、認証を促されますので、仰せのとおり認証しときましょう。

次にgoogleclの設定ファイルを編集しておく必要があります。ubuntuでは、~/.config/googlecl/configが設定ファイルとなっています。その中に次のような内容を追記、すでにある場合は適宜編集しておきます。

delete_by_default = True
delete_prompt = False

calfw-gcal.elのインストール

次のサイトからcalfw-gcal.elを落としてきましてロードパスの通ったところに置けば、

myuhe/calfw-gcal.el – GitHub

後は.emacsなんかに次のように書いておきます。 以下の例では、カレンダーの用件入力バッファを開くキーに「a」をあてていますが、お好みで変えてください。

(require 'calfw-gcal)
(define-key cfw:calendar-mode-map (kbd "a") 'cfw:gcal-main)

予定の追加

calfw.elから開いた*cfw-calendar*がカレントバッファになっている状態で、aキーを押すと*calfw:gcal-edit*バッファが開きます。

終日の予定を入力する場合は、その用件を入力するだけです。時間が決まっている場合は用件、開始時刻、終了時刻を半角空白区切りで入力します。次のような感じになると思います。”hoge 10:00 12:00″

開始時刻しかわかってない場合は”hoge 10:00″や”hoge 10″と書くだけでも良いです。終了時刻は自動的にその1時間後になるようです。

入力が終わった後はいつものC-c C-cで送信。*calfw:gcal-edit*バッファはお役目を果たし、勝手に閉じます。

予定の削除

削除したい用件がある日にフォーカスを合わせた状態で*calfw:gcal-edit*バッファを開きます。*calfw:gcal-edit*バッファに削除したい用件を入力し、C-c C-d押せば、予定が削除されます。

あとがき

いかがでしたでしょうか。できたばかりのcalfwですが、すでにマストelispとなってしまいました。まだ、いろいろと連携できるところもありそうですよね。例えばメーラーから直接calfwに内容を転送とかしてごにょごにょとか楽しそうです。夢が広がりまくります!!

追記 2011-01-19

@pecculさんからキーバインドの設定が抜けてるとご指摘ありましたので、一部修正しました。 @pecculさん、ありがとうございます!!

  • Pingback: Tweets that mention 日記書いた-> calfw.elからGoogleカレンダーを編集するcalfw-gcal.elを書いてみた -- Topsy.com()

  • もしかして,cfw:gcal-mainをaキーに割り当てる記述が抜けてませんか?

    あと,そのfaceの設定,よければ公開してほしいです!

    • myuhe

      肝心なキーバインド設定が抜けてましたので追記しました。ご指摘ありがとうございます。
      face設定も公開してみますねー

  • もしかして,cfw:gcal-mainをaキーに割り当てる記述が抜けてませんか?

    あと,そのfaceの設定,よければ公開してほしいです!

    • myuhe

      肝心なキーバインド設定が抜けてましたので追記しました。ご指摘ありがとうございます。
      face設定も公開してみますねー

  • Hiroyuki Kimoto

    C-c C-d による削除がうまく行かないので調べてみたら、googlecl のプロセスが返答を待って停止していました。そこで、calfw-gcal.el の cwf:gcal-delete() を
    (defun cfw:gcal-delete ()  (interactive)  (let ((date (concat cfw:gcal-year “-” cfw:gcal-month “-” cfw:gcal-day))        (status (cfw:gcal-edit-extract-status)))    (start-process “cfw:gcal-send” nil “google” “calendar” “delete” status “–date” date )    (process-send-string “cfw:gcal-send” “yn”)    (cfw:gcal-quit)))にしたら、うまく動くようになりました。

    • myuhe

      コメントありがとうございます。
      ~/.config/googlecl/config は記事のような設定だったでしょうか?

  • Hiroyuki Kimoto

    C-c C-d による削除がうまく行かないので調べてみたら、googlecl のプロセスが返答を待って停止していました。そこで、calfw-gcal.el の cwf:gcal-delete() を
    (defun cfw:gcal-delete ()  (interactive)  (let ((date (concat cfw:gcal-year “-” cfw:gcal-month “-” cfw:gcal-day))        (status (cfw:gcal-edit-extract-status)))    (start-process “cfw:gcal-send” nil “google” “calendar” “delete” status “–date” date )    (process-send-string “cfw:gcal-send” “yn”)    (cfw:gcal-quit)))にしたら、うまく動くようになりました。

    • myuhe

      コメントありがとうございます。
      ~/.config/googlecl/config は記事のような設定だったでしょうか?

      • Gacchan

        私も同様な現象を確認しました。
        作者さんの記事のとおりに
        .config/googlecl/config
        内の設定はきちんとしています。
        Kimotoさんの書いてくださったように書き換えると
        きちんとうごきました。
        googleclは0.9.13−1をつかっています。

        • myuhe

           ご報告ありがとうございます。
          確認してみます。

  • Gacchan

    はじめまして。遅ればせながら設定してみました。カレンダー項目がアルファベットならうまくいくのですが、日本語だと登録されないようです。
    .emacsあたりの設定不足でしょうか?ターミナルからgoogle calendar addはうまく動作することを確認しています。是非利用したいのでよろしくおねがいします。gacchan

    • myuhe

      はじめまして。
      googleclを使ったカレンダーの登録はできますか?

      問題の切り分けをしたいので、まずはそちらを試してみてください。

      • Gacchan

        可能です。タイトルをアルファベットにすれば、登録できます。
        たとえば
        google calendar add “ひなまつり 03/03”
        のコマンドをUbuntuのターミナルからでは正常にできますが、
        emacsのshell-commandからでは
        Sole action: identityTraceback (most recent call last):  File “/usr/bin/google”, line 849, in     main()  File “/usr/bin/google”, line 835, in main    run_once(options, args)  File “/usr/bin/google”, line 588, in run_once    setattr(options, attr_name, safe_decode(attr, googlecl.TERMINAL_ENCODING))  File “/usr/lib/pymodules/python2.6/googlecl/__init__.py”, line 264, in safe_decode    repr(string))googlecl.SafeDecodeError: ascii could not decode ‘xa4xd2xa4xcaxa4xdexa4xc4xa4xea 03/03’

        となり、エラーとなりますが同様にshell-commandより
        google calendar add “hinamatsuri 03/03”
        ではうまくいき、calfw-gcalの動作と同様になりますのでcalfw-gcalの問題ではないのかもしれません。しかしながら、是非使いたいのでご協力いただけたらうれしいです。

        • Gacchan

          すみません、文章わかりにくいのでまとめますと
          google calendar add “ひなまつり(or hinamatsuri) 03/03″を行った場合
          gnome-terminal:日本語、アルファベット共に可能
          emacsのcalfw-gcalから:日本語不可、アルファベットなら可能
          emacsのshell-commandから:日本語不可、アルファベットなら可能
          ということになります。エラーの中にasciiがデコードできませんとあるので
          文字コードに関係ありそうなところをいじってみましたが解決できませんでした。
          すべてutf-8を使っています。

          • Gacchan

            またまた自己レスですが、
            mozc.elとの相性のようです。mozc.elをロードしなければ問題なくGoogleカレンダーに日本語を通すことができました。

          • Gacchan

            最終的にmozc.elの読み込みを最後にもってきたら、動作するようになりました。
            理由はわかりませんが、正常動作となりました。

          • myuhe

             返信遅くなり申し訳ありません。
            mozc.elを使ったことがないので詳しいことはわかりませんが内部で文字コードが変えられているのかもしれませんね。
            ともかく、無事に動くようになり何よりです。

  • kdtp

    はじめまして。大変素晴らしいプログラムありがとうございます.
    cfw:gcal-gdata-addはうまくうごくのですが、cfw:gcal-addはcfw:gcal-monthが定義されておらず動かない状態です.大変お手数ですが、cfw:gcal-monthの定義はどこでされているのでしょうか?

    • myuhe

      初めまして。使ったいただきありがとうございます。

      さて、上の記事にも書いてありますが、予定を追加する際は、

      cfw:gcal-mainを使うようにしてください。cfw:gcal-addはその低レイヤ関数になります。
       

      • kdtp

         アドバイス有難うございました.
        無事に追記、削除ができるようになりました.
        お手数をおかけしました。

        • myuhe

           うまくいって良かったです。
          また、何かおかしいところあったら気軽に聞いてください。

  • Yuta Yamada

    英語で予定を入力した場合、途中で分割されてしまうのでcfw:gcal-format-statusの区切り文字を変更できないでしょうか?

    • myuhe

      よく意味がわからないので、できればGitHubのissueに具体的に書いてもらえないでしょうか?