Emacs24.4でλを愛でる。

先日リリースされたEmacs24.4, 巷ではビルトインブラウザewwが話題を呼んでいるようですが、実はlisperにはおなじみの機能がひっそりと取りこまれています。

ぷりちーらむだ

lisperにはおなじみのlambdaですが、いかんせん長い。この問題は、世のLisperを悩ませる問題の一つであるようで、例えばclojureにおいてlambdaは fn となっていて、後発Lispならではの工夫が見られます。

せめて見た目だけでも短かくしたい!! という願望が生みだしたのがいわゆる「ぷりちーらむだ」。ざーっと調べるだけでもいろいろと記事が見つかります。

Emacs で lambda をかわいくする — ありえるえりあ

pretty-lambda – Life is very short

pretty-symbols.elでlambdaをλと表示してみよう。その他のキーワードにも対応! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット | るびきち「日刊Emacs」

この「ぷりちーらむだ」がEmacs24.4では標準機能として取りこまれています。

prettify-symbols-mode

まずはLisp-modeで、やおら M-x prettify-symbols-mode とし、lambdaとタイプしてみましょう。 かわいいλが出てくるはずです。

こうなったら、EmacsLispでも使いたくなってきます。

次のようにして、prettify-symbols-alistにalistを追加すれば、emacs-lisp-modeでもかわいいλが出てくるはずです。

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (push '("lambda"  . ?λ) prettify-symbols-alist)))

なぜ今更とりこまれたのかなどいろいろありますが, お手軽にλを愛でることができるというのは素敵ですね。

multiple-cursorsに追加されたマイナーモード、mc-hide-unmatched-lines-modeが素敵だった

multiple-cursors 、便利ですね。まとめて修正したり、置換したり、といろいろとはかどります。

そんな multiple-cursors ですが、ちょっとしたマイナーモードが追加されていたのに最近気付きました。

Added mc-hide-unmatched-lines mode · 653d523 · magnars/multiple-cursors.el

このマイナーモード、multiple-cursorsのカーソルがない部分を隠し、どこにカーソルがあるのかわかりやすくしてくれます。例えば multiple-cursors-core.el のコードで mc--this-command にカーソルをつけたものですが、mc-hide-unmatched-lines-mode を有効にすることでカーソルがある部分周辺のみを見るこができます。

screenshot_2014-11-09_21:10:58

occurやgrepなどで検索して置換、編集などよくあるパターンですが、このマイナーモードができたことで multiple-cursorsでそういったありがちな作業がシームレスにできるようになったような気がします。

ところで、実はこの機能、元ネタはieditだったりします。

victorhge/iedit

そもそも機能としてはたいして変わらないので、ieditでも良かったんではないかという気がしなくもありません。

設定したキーバインドをHelmインターフェイスで見るhelm-bind-key

Emacsをしばらく使っていると、気にくわないキーバインドに度々出くわします。なので、 define-key なぞしながら、お好みのキーにバインドしていくわけですが、調子にのっていろいろやってくと、変えたことを忘れてたりして、ついにはinit fileの肥やしになっていきます。

キーバインドを見渡すのに便利なアプリとして emacs-helm/helm-descbindsがありまして、とても便利に使わせてもらっているのですが、デフォルトのキーバインドも全て表示されます。Helmで自分で設定したキーバインドだけを見れたら、だいぶ整理しやすいんだけどなーと常々思っていて、bind-key という良さそうなものを見つけましたので、久し振りにelispを書いてみました。

helm-bind-keyとは

helm-bind-keybind-key が提供する機能のHelmインターフェイスになります。MELPAにも登録してもらいましたので, package.elなどで簡単にインストールできると思います。 bind-keyについては、るびきちさんの説明が詳しいです。

emacs bind-key.el : define-keyを直接書くのは時代遅れ!Emacsの重鎮が行っているスタイリッシュキー割り当て管理術! | るびきち「日刊Emacs」

bind-key には、 bind-key を介して設定したキーバインドを一覧する機能があるですが、これがとても見にくいです。 helm-bind-key はHelmインターフェイスで表示するコマンド helm-bind-key を提供します。見ためについてまんま helm-descbinds の雰囲気です。

screenshot.png

設定しているキーバインドを全てbind-keyで設定し直さないといけないという手間はありますが、キーバインドを棚卸する時などに便利ではないかと思います。

mlterm<->Xでの快適コピペ環境

PCの中では、当然Emacsが鎮座しているのですが、その他にもいろいろと立ちあげていまして、その中の一つがzsh on tmux on mlterm(ややこしい)です。 一時期、シェルもEmacsだろとか考えていた時期もありましたが、やはりzsh便利すぎなので、結局zshに落ちついています。

ただ、ここで困っていたのが、mltermとX上のアプリ間でのコピペでした。 うまくできなかったり、できたとしてもマウスを使わないとできなかったりとか悲しいことばかりです。

コピペを使わない人がいるはずもなく、先人達もいろいろと提案されています。

X環境のクリップボードやOS Xのペーストボードとtmuxのバッファを連携する方法 – Dマイナー志向
tmux のコピーモードを使ってみる – ようへいの日々精進 XP

ただ、どれも少し手間がかかります。コピペなどしょっちゅうする作業なので、あまり手間はかけたくないものです。

というわけで、マウスレスで手間のかからないコピペ環境をmlterm(上のtmux)<->Xで作ってみたので紹介します。

X->mlterm (mltermの設定)

~/.mlterm/key に次のように書いておけばCtl+y でPRIMARYの内容をmltermにペーストすることができます。

# Ctl+y で PRIMARY の内容をペーストする
Control+y=INSERT_SELECTION

mlterm->X (tmux, mltermの設定)

tmuxにはもともとcopy-modeが備わっています。このcopy-modeを使えば、マウスレスなコピペが可能になるはずです。

ただ、コピーした内容をX環境にも伝播させる必要があります。これにはmltermが対応している制御シーケンスのOSC52を使うこととします。

リモートの tmux でコピーした内容のローカルのクリップボードへの反映 | doda’s blog

.tmux.confには次のように書いておきます。

#コピーモードのキーバインドを設定
bind y copy-mode
# OSC52に対応させる
set-option -ag terminal-overrides ",mlterm:Ms=\\E]52;%p1%s;%p2%s\\7"

~/.mlterm/mainにも次のように書いておきます

##OSC52に対応させる
allow_osc52=true

これで、tmuxのコピーモードでコピーした内容がクリップボードにも渡されます。

PRIMARYをCLIPBOARDと同期させる

X環境はコピペのためにPRIMARY、SECONDARY、CLIPBOARDと3つもバッファを持っています。mltermはPRIMARYしか使っていないのですが、PRIMARYはペーストに中クリックしか使えなかったり不便極まりないので、CLIPBOARDにもその内容を同期させます。

同期には autocutsel というツールを使います。

sigmike/autocutsel

debianやArchLinuxではパッケージになっているようですので、比較的簡単に導入できるかと思います。

インストールが完了したら、.xinitrcあたりに以下のように書いといて autocutsel による同期が自動的に始まるようにしておきます。

if [ -x /usr/bin/autocutsel ]; then
    autocutsel -selection CLIPBOARD -fork
    autocutsel -selection PRIMARY -fork
fi

これでまたひとつマウスが文鎮に近づきました。

Appendix:Emacsとクリップボードバッファ

EmacsでPRIMARY、CLIPBOARDにコピーするには次のようにしておくと良いみたいですよ。

(setq x-select-enable-clipboard t)
(setq x-select-enable-primary t))

Org-modeのディレクトリへのリンクをDiredで開きたい

Org-modeのハイパーリンク便利ですね。 ファイルだのメールだのURLだのなんだのリンクはりまくれるので、整理したい時など C-c L ( org-store-link )しまくって まとめて整理したりしてます。

AdventCalendar – Org-modeのリンク機能で情報集約 – Qiita

この機能、だいたい満足してたのですが唯一イラッとするのがディレクトリのリンクを C-c C-o ( org-open-at-point ) して リンク先に飛ぶ時です。

なんと、Windowsだとリンク先がエクスプローラで開くのです。なぜDiredでないのか理解に苦しみます。あのいきなりEmacsから追放された時の悲しみを知らないとでも言うのでしょうか。

もう、こんな悲しみを味わいたくないのでDiredで開きたいと思います。

元ネタは、Org-modeのMLに投下された以下の記事。 open file link in dired?

(org-add-link-type "file+emacs+dired" 'org-open-file-with-emacs-dired)
(add-hook 'org-store-link-functions 'org-dired-store-link)

(defun org-open-file-with-emacs-dired (path)
  "Open in dired."
  (let ((d (file-name-directory path))
    (f (file-name-nondirectory path)))
    (dired d)
    (goto-char (point-min))
    (search-forward f nil t)))

(defun org-dired-store-link ()
  "Store link to files/directories from dired."
  (require 'dired-x)
  (when (eq major-mode 'dired-mode)
    (let* ((f (dired-filename-at-point))
           (link (concat "file+emacs+dired" ":" f))
           (desc (concat f " (dired)")))
      (org-add-link-props :link link :description desc)
      link)))

これで、またEmacsに引きこもれますね!!

DiredやOrg-modeのテーブルをシマシマにするstripe-bufferの紹介

表形式の情報が単色の画面に羅列されていると、行方向の情報を追うのが結構大変です。

その点, MacのfinderやiTunesなどは行がシマシマになってて、とても見やすいです。

features_player_organize_screen.jpg

これ、Emacsにも欲しいなーと思ったら、 stripe-buffer というものがありましたので、紹介します。

stripe-bufferとは

diredや、org-modeのテーブルをシマシマにしてくれます。

sabof/stripe-buffer

diredだと

screenshot-08.png

org-modeでは、こんな感じになります。

screenshot-09.png

自動的にシマシマにするには それぞれのフックポイントにひっかけとけば良いみたいです。

(add-hook 'dired-mode-hook 'stripe-listify-buffer)
(add-hook 'org-mode-hook 'turn-on-stripe-table-mode)

Dired厨の方などは、とかく便利だと思います。

Emacs上のPDFでisearch,occur,imenuとかなんでもしてしまうpdf-toolsの紹介

Emacsでなんでもしてしまいたい、という需要は今でも少なからずあるようで、Emacs23からはEmacs上でPDFを表示するためのdoc-view-modeが標準でバンドルされるようになりました。

Emacs 23でPDFを表示させる–新機能「DocView」を試す – builder by ZDNet Japan
Emacs で PDF/PS/DVI を閲覧する – とりあえず暇だったし何となく始めたブログ

TeXでの執筆作業やOrg-modeの文書をPDFでエクスポートする場合などなど、PDFのお世話になるEmacserは多いですが、世のEmacserは少なからずこう思ったはずです。

「これじゃない。」

要はこのdoc-view-mode、(ほぼ)見るだけしかできないというかなりのクソモードだったわけです。

せっかくEmacsを使っているのだからPDFをちゃんとisearchしたいし、occurもしたい。あわよくば、imenuとかも出してもらいたい、と世のEmacserは思うわけで、かくいう私も結局acrobat readerとかで見てました。

あー PDFをoccurとかisearchとかしてーなー そんなのどっかに落ちてないかなーと思ってたら本当に落ちてたので、紹介したいと思います。

pdf-toolsについて

pdf-toolsは、popplerを介してPDFをゴニョゴニョするためのEmacs拡張アプリです。

politza/pdf-tools

popplerについては、以下の記事が詳しいです。

Poppler – Wikipedia
Popplerについてちょっとだけ – なるひこの Linux Printing お勉強日記

動作環境ですがCがコンパイルできてdoc-view-modeが正しく動作してpopplerが動作すれば使えるのではないかと思います。手元のArchLinuxで元気に動いていますが、頑張ればWindowsとかでも動くかもしれません。Macは使ったことがないのでよくわかりません。

インストールについてはCのコンパイルなどの手順があるので多少面倒です。AURにPKGBUILDを置きましたので、ArchLinuxユーザの方はだいぶお手軽にインストールできると思います。

AUR (ja) – emacs-pdf-tools-git

インストール時のトラブルとしては、設定ファイルで package-user-dir を変更しているとautoloadの設定がうまくいかないようです。その時は、次のようにことごとくrequireすれば良いかと思います。

(require 'pdf-tools)
(require 'pdf-annot) 
(require 'pdf-history) 
(require 'pdf-info) 
(require 'pdf-isearch) 
(require 'pdf-links) 
(require 'pdf-misc) 
(require 'pdf-occur) 
(require 'pdf-outline) 
(require 'pdf-render) 
(require 'pdf-sync) 
(require 'tablist-filter)
(require 'tablist)

使い方

pdf-toolsはdoc-view-mode上で動作するコマンドと複数のマイナーモードで構成されています。とにかくいろいろなマイナーモードが作られています。列挙すると以下のとおりとなります。

  • pdf-misc-multipage-minor-mode
  • pdf-misc-tool-bar-minor-mode
  • pdf-isearch-minor-mode
  • pdf-misc-minor-mode
  • pdf-sync-minor-mode
  • pdf-annot-minor-mode
  • pdf-links-minor-mode
  • pdf-history-minor-mode
  • pdf-outline-minor-mode
  • pdf-misc-auto-fit-minor-mode
  • pdf-misc-menu-bar-minor-mode
  • pdf-annot-update-minor-mode-map
  • pdf-info-auto-revert-minor-mode
  • pdf-annot-list-follow-minor-mode
  • pdf-misc-context-menu-minor-mode

この他にもいろいろとコマンドもあり、全てを紹介するのは骨が折れそうなので、以降ではDDSKKのマニュアルPDFを題材にして、その中をいくつか紹介したいと思います。

pdf-isearch-minor-mode

名前からも想像できますが、PDF内部の文章をisearchするモードです。doc-view-modeでもisearchはできるのですが、本文に色がつかなかったりとてもisearchといえる代物ではありませんが、pdf-isearch-minor-modeではちゃんと色をつけることができますし、C-s、C-rで移動もできてインクリメンタルな検索もできる、本来のisearchができます

pdf.png

pdf-occur

occurです。ふつーにoccurできます。

どうやらoccurバッファでもソートだの何だのいろいろできるみたいですが、あまりいろいろあって全て試せていません。 screenshot-04.png

pdf-misc-auto-fit-minor-mode

ウィンドウの大きさに合わせて、pdfのサイズを自動的に変えてくれるマイナーモードです。

pdf-misc-crop-margins

PDFの余白をカットします。

pdf-misc-multipage-minor-mode

一つのpdfで連続した複数のページを複数バッファに並べて表示するモードです。follow-modeのPDF版といえばわかりやすいかもしれません。

前述の pdf-misc-auto-fit-minor-mode pdf-misc-crop-margins との組合せがかなり強力で、PDFをじっくり見たいときは専らこのスタイルで見るようになりました。

screenshot-06.png

ワイドスクリーンが主流の昨今、縦長が圧倒的に多いPDFは@matuuさんが紹介されたように横にPDFを並べることで一覧性がかなり高まります。これだけでもインストールする価値があるのではないかと思います。

大きなディスプレイでPDFなどの文書を読むときは横スクロールが最強だと思うので実装してみた – Dマイナー志向

pdf-outline-minor-mode

imenu相当の機能ですが、バッファ内でサブツリーの表示をトグルできたり、imenuよりいろいろと便利です。outline-modeをベースに作られているようで、ツリー間のジャンプなど一部outline-modeの機能がそのまま使えます。

screenshot-05.png

pdf-sync-minor-mode

SyncTeXを使ってTexファイルとPDF間の場所の同期がとるためのマイナーモードのようです。GNOMEのサイトにあった以下の動画がとてもわかりやすかったです。

久しくTeXを使っていないので試していませんが、うまく動作するのであればかなり便利なのではないかと思います。

pdf-links-minor-mode

pdfのリンク機能のためのマイナーモードです。

pdf-annot-*の関数とかマイナーモード

PDFにアノテーションをつけたり、つけたアノテーションをリスト表示したり保存したりします。

日本語対応

デフォルトのpopplerでは日本語の検索等ができませんが、poppler-dataをインストールすれば、日本語も何の問題もなく使えます。以下のスクショでは「漢字」をoccurしているところです。ただしmigemoはうまく使えませんでした。もしかしたらmigemo.el側で対応すればどうにかなるかもしれません。

screenshot-07.png

やっとPDFビューワになれたEmacs

Emacsでこんなことまでできるのかーと久し振りにびっくりしました。今ではかなり快適にPDFを見ることができてます。

ほかにもいろいろ機能があるようで全然紹介しきれてません。今回紹介しなかった機能としてはhistoryをさかのぼる機能などもあります。 M-x pdf-tools-help して確認してみるのもいいかもしれません。

気になった点としては、大きなPDFを閲覧している時などでoccurしたりするとブロックしてしまう点です。deferredなどを使ってasynchronouslyにPDFを見れると、さらに素敵な生活が待っていそうです。

ウィンドウ管理がイマイチなのも気になりました。e2wmやpowin、direxなどで構造化してやると良さそうです。

いずれにしろまだ全然使いこなせてません。いろいろ触ってみてまた感想なぞ書くかもしれません。

calfwとorg-gcalの連携

昨日、紹介したorg-gcal.elですが、calfwと連携して使うことでさらに便利に使うことができます。

Emacs用カレンダー calfw v1.2 リリース – 技術日記@kiwanami

というわけで、今回はcalfwとの連携について紹介します。

新しいcalfw-sourceについて

もともとcalfwにはOrg-mode用のcalfw sourceがすでに定義されています。

calfw の org-agenda 対応 calfw-org.el – 技術日記@kiwanami

kiwanamiさんが書かれているように定義ずみのcalfw sourceはorg-agendaをベースにしています。org-agendaはorg-modeのタイムスタンプデータを管理するにとても便利なツールですが、タスク管理を指向しているきらいがあってスケジュールを管理するには何かと不都合です。

個人的な理由とすれば、せっかくorg-elementの勉強をしたので、org-elementベースのcalfw sourceを書いてみたかったというのもあります。

というわけで、まずはそちらからすでに紹介していこうと思います。

新しいOrg-modeのcalfw-sourceはすでにcalfw本体にマージしてもらっているのですでにMELPAなどでインストールされている方はアップデートすればよいかと思います。

もしまだcalfwを使われてないのであれば、el-getなりpackage.elなりでインストールしてください。Debian/Ubuntuユーザの方であれば、aptでもインストールできるようです。

Debian – sid の emacs-calfw パッケージに関する詳細

新しいcalfw-souceは、対話的に呼びだせる関数を準備していないので、自分でsourceを組み合わせて関数を作る必要があります。

設定例としては次のようになるかと思います。

;;cfw:org-capture-templateはcalfw-orgを
;;requireする前に評価しておいてください。
(setq cfw:org-capture-template
      '("c" "calfw2org" entry 
        (file "~/schedule.org")
        "*  %?\n %(cfw:org-capture-day)"))

(require 'calfw-org)

(defun cfw:open-calendar ()
  (interactive)
  (let ((cp
         (cfw:create-calendar-component-buffer
          :view 'month
          :contents-sources
          (list 
           (cfw:org-create-file-source
            "仕事" "~/schedule.org" "#268bd2")
           (cfw:org-create-file-source
            "遊び" "~/yaschedule.org" "#859900")))))
    (switch-to-buffer (cfw:cp-get-buffer cp))))

これらを評価して、 cfw:open-calendar を実行すると次のようなカレンダーが出てくるはずです。 予定をクリックするか、予定の上にキャレットを置いている状態でエンターキーを押すと該当のOrgファイルに飛びます。この動作は既存のcalfw sourceと同様の動作になります。

screenshot-03.png

サンプルのOrgファイルを二つgistに置きましたので、実際に試してみてください。

org-gcalとの連携

新しいcalfw-sourceでは、org-captureを介して簡便に予定を登録できるようにしました。 上の設定例では cfw:org-capture-template に代入した値で保存先のファイル名や割りあてるキーを決めています。

要は、org-capture-templateに新しいテンプレートを追加しているわけです。

上の設定がなされていれば、新しい予定を登録した日にちにフォーカスがあたっている状態で、c を押すと次のようなバッファがポップアップしてくると思います。

screenshot-06.png

後は、予定の内容を諸々書きこみ C-c C-c とすればOrgファイルに書きこまれます。この時にorg-gcalがすでにインストールされていれば、Googleカレンダーにも自動的に予定が登録されます。

まとめ

昨日から今日にわたり、Emacs、Org-mode、Googleカレンダーを使ったスケジュール管理法を紹介させてもらいました。

今回の日記をきっかけに素敵なOrgersが増えてくれれば幸いです。

Org-modeとGoogle calendar間で予定をやりとりするorg-gcal.elというのを作りました

久し振りにちゃんとしたelispを書いた気がするので、ちゃんと紹介しておこうと思います。リポジトリはこちらになります。

作ったきっかけ

予定を長いことGoogleカレンダーで管理しています。ブラウザ上の見た目もすっきりしていて、とても使いやすいのですがスケジュールの入力はマウスをカチカチさせることが多くストレスフルでした。

そこは手になじんだEmacsから入力した方が便利なはずです。@kiwanamiさんのkiwanami/emacs-calfw と連携して動くelispなどを書いたりして、どうにかこうにか入力してました。

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

ところが、これもいろいろとボトルネックがありました。Googleカレンダーのデータをcalfwに取りこむのにcalfw-icalを使っていたのですが、取りこむ際にどうにもブロックしてしまいます。また、ローカルにキャッシュを持たない設計になっていたので、日々ブロックしておりました。

拙作calfw-gcal.elもいろいろ問題がありました。最初はgoogleclを使ってデータの送信をしていたのですが、Windows環境だと設定が結構面倒でした。なのでgdata-python-clientを直接触るように改変もしてみたのですが、Windows特有のPythonまわりのトラブルなどもあり、グダグダになっておりました。滅せよ Windows。

org-mode とスケジュールの連携も興味の対象でした。自分のところでは、タスクとスケジュールを分けて整理していて、しかもタスク管理はorg-modeでやっていました。そういったこともあって、スケジュールとタスクをorg-modeで統一して管理したいなあと思っておりました。

org-gcal.elでしたかったこと

もっとも重要視したのはサクサク動くことです。同じようなことを目的としているアプリにorg-caldavというのがありましたが、この条件を満たすものではありませんでした。

本質的な目的でないものとすれば、ここ数年で出てきた便利そうなライブラリを使ってみたいというのもありました。MELPAができたおかげでライブラリを導入するコストはかなり軽減されました。その影響か、MELPAでも便利そうなライブラリがかなり登録されています。

Org-modeは以前から開発は活発でしたが、最近の大きな変化とすれば昔から懸案だったOrgフォーマットへのアクセスAPIがかなり統一され、Orgアプリ開発者にとってとても良い環境になりつつあります。

と例のごとく前置きがだいぶ長くなってきたので、そろそろ使い方について書いておきます。

インストール

MELPAでお願いします。

設定

org-gcal.elではGoogleカレンダーとの通信にGoogleが提供してるAPIを使っていて、事前にプロジェクトの登録とOAuthによる認証をすませておく必要があります。 まずは、Google Developers Consoleでプロジェクトを作って、 client IDと client secretを取得してください。

Google+ APIの事例ですが以下の記事が参考になるかもしれません。

天使やカイザーと呼ばれて » OAuth2.0によるGoogle+ APIのアクセス方法

次に、Google カレンダーの設定ページでカレンダーIDを確認します。デフォルトではGmailのメールアドレスがカレンダーIDとなっています。後は設定ファイルに次のように書くとよいです。

(require 'org-gcal)
(setq 
 org-gcal-client-id "your-id-foo.apps.googleusercontent.com"
 org-gcal-client-secret "your-secret"
 ;;カレンダーIDをキー、スケジュールを取りこむOrgファイルをvalueとするalist
 ;;複数登録可
 org-gcal-file-alist '(("your-mail@gmail.com" .  "~/schedule.org")
                       ("another-mail@gmail.com" .  "~/task.org")))

使い方

準備しているコマンドは主に二つだけです。

org-gcal-fetch でGoogleカレンダーのスケジュールをOrgファイルに持ってきます。

org-gcal-post-at-point で現在のポイントにあるOrgエレメントをGoogleカレンダーに送信します。編集した既存のスケジュールを送信する場合も同様の操作となります。

トークンの更新は古くなったら自動的に更新されるようになっているのですが、たまに通信に失敗するなどしてトークンの更新がうまくいかなかったりします。 その際は org-gcal-refresh-token を実行してトークンを更新してみてください。

カスタマイズ

デフォルトでは当日から過去30日、未来60日の予定をfetchするようになっています。変更した場合は org-gcal-down-days org-gcal-up-days を適宜変えてください。

org-gcal-down-days を越えた過去のスケジュールは自動的にArchiveされるようになっています。 org-gcal-auto-archive をnilにしておくとArchiveされなくなります。

org-gcal.elによる通信成功の可否を通知する仕組みを実装しています。 デフォルトでは、ミニバッファに表示されるようになっていますが org-gcal-use-notifications をtにしておくとnotifications.elを介したデスクトップ通知、 org-gcal-use-gntp をtとすることでgntp.elによるデスクトップ通知に切り変わります。

gntp.elについては、いずれ詳しく紹介したいと思いますが、Growlが用いているデスクトップ通知用のプロトコルを使って通知するアプリです。自分のところでは、主にこれを使っています。

ただ、デスクトップ通知の機能については、alertを使った仕組みに切りかえることを検討しているところでいろいろと変わってくるかもしれません。

使ってみた印象

自分のところでは非常に軽快に動いています。要因としては、GoogleAPIを通じて最低限の情報しかやりとりしていないということと、deferred.elによるasyncがとても有効だったと感じました。

スケジュールの情報をローカルに保存することができるようになったのでcalfwとの連携も非常に快適になりました。この連携については、calfw-orgにちょこっとcontributeさせてもらったので、別の機会に紹介したいと思います。

ただ、アプリの登録やIDの取得がちょっと面倒に感じます。公開可能なclient IDと client secretがあれば、この手間はなくなるのでどなたかclient IDと client secretを提供していただけるとありがたいです。

作ってみた印象

久し振りに作ったので、時間はかかりましたが非常に快適に作ることができました。なんといっても@tkf さんのemacs-requestが非常に素晴らしかったです。deferredにも対応していてたいした苦労もせずasyncなアプリを作ることができました。

org-modeに標準で添付されるようになったOrg-elementもOrgファイルをパースするのにとても助かりました。

request.elについてはtkfさんがこれまた素晴しいドキュメントを作られているので、説明することもないですが、Org-elementについてはいずれ詳しく紹介する機会を作りたいと思います。

今後の予定など

まずは、いろいろな方に使っていただいてfeedbackを得たいと思っています。機能面ではスケジュールの削除、スケジュールの同期に相当する機能がありません。モチベーションが高いうちにどうにかしたいのですが、本業が年度末モードに入ってしまうと停滞してしまうかもしれませんがご容赦ください。

Rのデータビューワ ess-R-data-view.elというのを作りました

Rを使っているとオブジェクトの中に入っているデータを確認したり眺めたりしたいと思うことが頻繁にあります。

こういった欲求を満たすためにess-R-object-popup.elというものを以前作ったのですが、これはあくまでオブジェクトのサマリーをチラ見することが目的であって、中身を細かく確認するものではありませんでした。 統計量を見るだけでもデータの特徴をある程度把握することはできるのですが、やはり生のデータを目視するのにはかないません。

生データを目視したいという需要は少なからずあるようで、RStudioでもデータビューワがあります。一方のEmacsですが、ESSにはオブジェクトを俯瞰できるrdiredというものがあるものの生のデータを眺める機能はなくて、Rのインタラクティブシェルでズラズラ出力しては眺めるという程度くらいしかできませんでした。まあこれでも良いんですがテキストが整形されているだけですし、どんどん流れていってしまうので、操作性も良くありません。

というわけで、こういった不満を解消すべくデータビューワを作ってみました。ess-R-data-view.elといいます。

インストール

本体はGitHubに置いてます。

myuhe/ess-R-data-view.el · GitHub

いろいろと依存しているのでEmacs24以降であれば、package.elを使ってインストールするのをおすすめします。MELPAに登録してもらってますので、次のような感じでpackage-archivesにMELPAを登録しておけば、、、

(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)

M-x list-packages などとして ess-R-data-view を選べばサクッとインストールできると思います。

使い方

M-x R としてRのインタラクティブシェルを起動させます。この状態でデータ名の上にキャレットを置いた状態で M-x ess-R-dv-ctable を実行します。

例えば、バンドルされているデータセット、irisでこのような操作をすると、次のようなバッファがポップアップしてくるかと思います。このバッファの中ではおなじみのn,p,f,b またはj,k,h,lに移動のコマンドがバインドされています。また、ヘッダーも固定されているので、ヘッダーとデータの対応が非常にわかりやすくなります。

https://raw.github.com/myuhe/ess-R-data-view.el/master/image/ctable.png

ess-R-data-view では、データフレームとマトリックスでこのような表が表示されるようになっています。ベクトルなど対応していないデータの場合、次のようなエラーメッセージがポップアップします。

https://raw.github.com/myuhe/ess-R-data-view.el/master/image/popup.png

M-x ess-R-dv-ctable の代わりに M-x ess-R-dv-pprint を実行すると次ようなバッファがポップアップします。

https://raw.github.com/myuhe/ess-R-data-view.el/master/image/pprint.png

このバッファにはボーダーもありませんし、ヘッダも固定されていませんが、データが多いときに軽快に動作するので重宝するのではないかと思います。データの大きさ次第でこちらを選択すると良いかと思います。

この機能を使いはじめると頻繁に使うことになるかもしれません。そうなるといちいちミニバッファにコマンドを入力するのが面倒くさくなってきます。自分のところでは、次のような感じでキーバインドさせて使ってます。

(define-key ess-mode-map (kbd "C-c v") 'ess-R-dv-ctable)
(define-key ess-mode-map (kbd "C-c V") 'ess-R-dv-pprint)

これからの予定

データフレームとマトリックスにしか対応していないので、他のデータをどうしようかと少し考えていました。特にリストとか配列あたりはhelmインターフェイスで掘っていって最後はess-R-data-viewで表示させたりすると素敵そうです。 とは言うもの現状でかなり満足してしまったというのと、そもそもRをめっきり使わなくなってしまったので、恐らくこれ以上機能を追加することはないと思います。

ctableはすごいということを言いたかった

今回のess-R-data-view.elを作りはじめたのは、実はctable.elを使って何か作ってみたかったというのがとても大きい理由だったりします。 実際、使ってみてかなり素敵なライブラリでした。ctable.elについては、また別の機会にちゃんと書こうと思います。