はじめに
VS code には code time というプラグインがあります。オープンソースで開発されているこのプラグインは VS code を使ってプログラムを書いている時間を自動的に計測してくれます。これいいなーと思っていましたが、わたしのエディタはそう、Emacs。すなわち「Emacs でも code time したい」そう思うのは必然です。この記事は Emacs でコーディング時間を計測するための方法をお教えするものです。
Wakatime とは
Wakatime はコーディング時間を自動的に計測してくれるオープンソースの実装です。これを利用することで Emacs でもコーディング時間を計測できます。Emacs でこれを利用するときは wakatime-mode パッケージをインストールするのが吉です。しかしパッケージをインストールするだけでは正しく動作しませんので、いくつか設定をしなければいけません。順序としてはこうなります。
- Emacs で wakatime-mode パッケージを入れる。
- Emacs の設定ファイル ~/.emacs.d/init.el にいくつかの設定を加える。
- HomeBrew で wakatime-cli をインストールする。あるいは、
- wakatime-cli をダウンロードして、適切な場所に設置する。
- wakatime-cli の設定ファイルである ~/.wakatime.cfg を記述する。
ではやっていきましょう。
Emacs で wakatime-mode パッケージを入れる。
宗教的観点から言えば、また、この記事が KDIX CS Advent Calendar のために書かれた記事であることを鑑みれば、イマドキの学生さんに Emacs を布教するべく、Emacs をインストールするところからお教えするのが筋かもしれません。しかし面倒臭い。macOS であれば HomeBrew から emacs パッケージを、MacPorts からであれば emacs-app パッケージをインストールしてください (おざなり (しれっと MacPorts の布教をする)) 。
いまどきの Emacs にはパッケージ管理ツールが備わっており、
M-x package-list-packages
と入力すると (M- というのは「Metakey を押しながら」の意味ですが、みなさまのキーボードに Metakey がないのであれば「ESC を押したあとで」の意味で理解してください) パッケージ管理バッファが開きます。Ctrl-s で I-search: モードに入って wakatime と入力すると wakatime-mode を見つけることができるでしょう。
その操作をしている時点であなたば *Packages* バッファにいて、カーソルは wakatime-mode に合わせていると思うので、そこで return を押すと *Help* バッファが開いて内容が表示されます。Ctrl-x o (other-window) で *Help* バッファに移動し、Tab キーを押すと Install にカーソルが移動するはずです。そこで return を押せば wakatime-mode のインストールが始まります。かんたんですね! どうしてみんな Emacs 使わないんでしょう!
*Help* バッファにはなにげに大事なことが書かれてあり、
Enable WakaTime for the current buffer by invoking `wakatime-mode'. If you wish to activate it globally, use `global-wakatime-mode'.
Set variable `wakatime-api-key' to your API key. Point `wakatime-cli-path ' to the absolute path of the CLI binary available from https://github.com/wakatime/wakatime-cli/releases.
とあります。翻訳すると、いまのバッファで wakatime-mode を有効にしたければ M-x wakatime-mode とするよろし。起動時からグローバルに有効化したければ (Emacs の設定ファイルで) global-wakatime-mode を使え、とのこと。また Wakatime の利用には API キーが必要なのでこれを指定することと、wakatime-cli のバイナリの在処をフルパスで wakatime-cli-path に設定せよ、と述べられています。
ここからはグローバルで wakatime-mode を有効にする方向で説明をしていきましょう。
Emacs の設定ファイル ~/.emacs.d/init.el にいくつかの設定を加える。
wakatime-mode から wakatime-cli のバイナリ本体が見えなければいけないのですが、これには 2 通りのやり方があります。
- exec-path に wakatime-cli が入っているパスを追加する (HomeBrew で wakatime-cli を入れているときはこちらの方が便利) 。
- wakatime-cli-path に wakatime-cli のフルパスを指定する (wakatime-cli 本家からバイナリをダウンロードしている場合に便利) 。
当初は前者を採用していたのですが、後述する環境上の問題から後者の方法のほうが合理性があるのでは、ということに気付いたので両方説明していきます。
exec-path に wakatime-cli が入っているパスを追加する。
括弧書きで記した通り、このやり方は HomeBrew で wakatime-cli をインストールしている場合に便利なやり方です。HomeBrew で wakatime-cli をインストールするのは brew install wakatime-cli とでもすればいいでしょう (雑な説明) 。
最近の Emacs は ~/.emacs.d/init.el が設定ファイルとなっており、こちらで exec-path という、外部コマンドを探すときのフォルダを指定する変数を変更することで、Emacs が wakatime-cli を見つけることができるようになります。
HomeBrew は (普段使っていないので間違っていたらごめんなさい) パッケージを入れたときのバイナリを /opt/homebrew/bin 以下にインストールすると思いますので、
(setq exec-path (append exec-path '("/opt/homebrew/bin"
)))
のように記載します。この記法であれば /opt/homebrew/bin 以外にもパスを通しておきたいディレクトリがある場合に、改行してダブルクオーテーションで括ったフルパスを追加していけば良いので便利です。
wakatime-cli-path に wakatime-cli のフルパスを指定する。
wakatime-cli 公式リポジトリからバイナリをダウンロードする場合はこちらになります。前に述べた「環境上の理由」というのは「自分が HomeBrew を使っておらず、かつ、MacPorts には wakatime-cli パッケージは存在しない」というものです。てめえのニッチな環境のせいじゃねえか。
wakatime-cli の公式リポジトリの releases のページには各 OS、CPU アーキテクチャごとのバイナリが配布されています。Apple Silicon の macOS を使っている場合は wakatime-cli-darwin-arm64.zip をダウンロードしましょう。ダウンロードされた zip ファイルをダブルクリックすると wakatime-cli-darwin-arm64 バイナリが展開されます。これはどこに置いても良いのですが、あちらこちらに散逸するのもよろしくないのと、wakatime-mode がデフォルトで wakatime のワークディレクトリと見做しているのが ~/.wakatime であるということもあるので、ここに配置することにしましょう。
% mkdir ~/.wakatime
% mv Downloads/wakatime-cli-darwin-arm64 .wakatime/
Emacs の設定ファイル init.el では末尾に以下のように追記しておきましょう。
;; wakatime
(use-package wakatime-mode
:ensure t
:config
(setq wakatime-cli-path "/Users/reo/.wakatime/wakatime-cli-darwin-arm64")
(global-wakatime-mode))
use-package はパッケージがインストールされているかどうかを確認する関数であり、:ensure が t になっていると、未インストール時に勝手にインストールしてくれます。すなわち、この init.el を保存しておいて、他の環境に持っていったとき、あるいは自分の環境をクリーンインストールして Emacs 環境を再構築するときに、このように記載しておけばパッケージを勝手にインストールしてくれるので大変に便利、となります。
末尾に (global-wakatime-mode) とありますが、*Help* バッファに記載されていたとおり、グローバルに wakatime-mode を有効にするときは init.el でこれを指定しておくと Emacs 起動時には wakatime-mode が有効になるので便利です。
wakatime-cli の設定ファイルである ~/.wakatime.cfg を記述する。
wakatime-cli はデフォルトで ~/.wakatime.cfg を設定ファイルとして読み込みますので、これを作りましょう。wakatime-cli の USAGE.md に .wakatime.cfg の雛形がありますので、これをコピーして ~/.wakatime.cfg を作りましょう。ただし [project_api_key] の箇所だけは指定するとそのプロジェクトの API キーを取得しようとしますので、これは行頭を # にしてコメントアウトしておきましょう。その他の部分は特にコメントアウトせずとも動作するようです。
さて、この設定項目を見ると分かるように、wakatime-cli は api.wakatime.com にある API を叩きます。そのために api_key の設定が必要です。wakatime.com にアクセスして login ボタンを押してみると GitHub 連携もできるので、GitHub アカウントをお持ちの方であればさくっとアカウントを作成することができます。
ログインができたら右上のメニューから Settings を選びます。Personal settings の Account の項目の一番上に API key の記載があるので、[click to show] は無視してもらってよろしくて、その右の copy アイコンを押せばコピーバッファに Secret API Key がコピーされます。これを先ほどの ~/.wakatime.cfg の api_key に予め記載されていた your-api-key に置き換えれば OK です。
これで Emacs を起動すれば wakatime-mode が動作するはずです。
Let's enjoy wakatime-life!


