メインコンテンツへスキップ

ターミナルで動作する Google Calendar のクライアントアプリ 「Gcal.js」

こんにちは.M2 の藤原です. 今回は,ターミナルで動作する Google Calendar のクライアントアプリ 「Gcal.js」について解説します. 前回の記事 の時点からいろいろアップデートし,便利になっていると思います!!

Gcal.js とは
#


Gcal.js は,ターミナルでカレンダを管理したい というモチベーションで開発した TUI アプリケーションです. 有名な TUI アプリケーションとして Lazygit (Git 操作を GUI っぽく扱える),Yagi(Rust 製ファイルマネージャ) がありますが,カレンダ管理アプリケーションは良さそうなものが見当たりませんでした. そこで,私と研究室の有志で開発したものが Gcal.js です.

なぜターミナルでカレンダ管理するの?
#


ターミナルでカレンダ管理するメリットは,カスタマイズ性シンプルな UI・操作ロマン だと思っています. 自分好みのキーバインドで,コマンド一つで予定を確認,作成,複製することができます.

例えば以下のようなことが可能です.

  • 左右の2つのペインで,今日の予定と去年の予定を比較.
  • 右のペインから既存の予定を選択し,任意の日時に複製. (予定のコピペ)
  • 任意のワードで予定を検索.(「前回の歯医者はいつ?」,「今月何回バイト入った?」などすぐ調べられる.)

また,最近は Google ToDo リスト と連携し,ToDo 管理もできるようにしました!

ロマンについては説明不要だと思いますが,ターミナルでカレンダ管理ってなんかかっこいいと思いませんか?

使っている様子
#


前置きが長くなりましたが,実際に使っている様子を説明します. まず,起動すると左側に予定のリスト,右側に予定が埋まっている部分を可視化するグラフ,ログが表示されます.

image.png

#### 基本操作 左の予定のリスト上で青くハイライトされている部分にカーソルが当たっています. このカーソルは矢印キーおよび `j` `k` キーで移動します(Vim のキーバインド) . また,カーソルを当てている際に `Enter` を押すことでその日に予定・タスクを追加したり,その予定を編集・コピーすることができます.
スクリーンショット 2026-04-27 14.43.19.png

予定の追加はテキストベースで行うため,エディタが開きテンプレートを編集します. 環境変数$EDITORで指定されたエディタが開くので,好きなエディタを設定してください.(私は Nvim を設定しています)

スクリーンショット 2026-04-27 14.41.03.png

便利な機能
#


私のイチオシは2つの予定表示ペインを用いた予定のコピー機能です.


#### なぜ予定をコピーするの? 予定って意外と周期性があると思いませんか? 例えば,1ヶ月に1回美容院に行ったり,2ヶ月に1回歯医者に行ったり... また,研究室でも周期的に行われている予定が多かったりします. (夏の研修会や乃村杯,研究の打ち合わせなど)

このような予定は,過去の予定をコピーし日付だけ変更することで簡単に作成できるという考えのもと開発しました.


#### 利用例 第423回 GN 検討打ち合わせが終わり,次回の予定をカレンダに追加する場合を例に説明します. まず,`shift` + `y` キーを押し,右のペインで降順に予定を表示します. 左のペインで,次回の会議予定日 (5/20) にカーソルを当て, 右のペインで,コピーしたい予定 (第423回 GN 検討打ち合わせ) にカーソルを当て,`c` キーを押します.
スクリーンショット 2026-04-27 14.42.45.png

そこで,予定の追加先のカレンダを選択し,会議の時間およびタイトルを編集しエディタを閉じ,ctrl + s で保存し予定を作成します. (GN 検討打ち合わせの場合は Title を第n+1に変更する必要があり,編集する手間がかかりますが,単にバイトなどの予定だと時間を変更するだけで予定を作成可能です)

スクリーンショット 2026-04-27 14.41.51.png

左のペインで空いている日を探しつつ,右のペインでコピーしたい予定(過去の予定)を参照できるのが Gcal.js の一つの強みとなっています.

まとめ
#


ここでは少しの機能しか紹介できなかったですが,この他にも様々な機能があり使っていくうちに慣れてくると思います. 気になった方はぜひ使ってみてください. https://github.com/fujiwara-e/Gcal.js