0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Macのメニューバーにタイマーを表示したくて、xbarで自作してみた話

Posted at

1. はじめに

投稿記事を書いたり勉強してたりすると「30分だけ集中して書き上げたい」なんて場面がよくあります。
でも、いちいちアプリを切り替えて残り時間を確認するのは地味にストレス。

「メニューバーに残り時間が常時表示されてたら便利なのに……」
そう思って探したものの、これだというアプリが見つからず。

だったら自分で作ってしまえ!ということで、xbarというツールを使って、
Macのメニューバーにタイマーを表示する仕組みを作ってみました。

2. 特徴

  • 20分、30分など時間を決めて作業に集中・没頭できる
  • 残り時間を 視線をちょっと動かすだけで確認 できる
  • ターミナルから1コマンドでタイマーを開始

3. 導入:xbarのインストール

xbarとは?

xbar は、Macのメニューバーに好きな情報を表示できるツールです。
表示内容はシェルスクリプトなどで制御できるため、
今回のようなタイマー機能も簡単に追加できます。

インストール手順

brew install --cask xbar

4. 導入:xbarプラグインを自作する

xbarでは「プラグイン」として実行間隔付きのスクリプトファイルを作ることで、メニューバーに好きな情報を表示できます。
今回は「1秒ごとに更新」されるタイマー表示を作ります。

timer.1s.sh

ファイル名は timer.1s.sh とし、xbarのプラグインディレクトリに配置します。

timer.1s.sh
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "$0")"; pwd)"
STATE_FILE="$SCRIPT_DIR/.timer_state"
NOTIFY_FLAG="$SCRIPT_DIR/.notified"
SND_FILE="/System/Library/Sounds/Ping.aiff"

if [ ! -f "$STATE_FILE" ]; then
  echo "⌛No timer"
  rm -f "$NOTIFY_FLAG"
  exit 0
fi

IFS=':' read -r START_TIME END_TIME DESCRIPTION < "$STATE_FILE"
NOW=$(date +%s)
REMAINING=$((END_TIME - NOW))

if [ "$REMAINING" -le 0 ]; then
  echo "⌛$DESCRIPTION 終了"
  echo "---"
  echo "Clear | bash='rm \"$STATE_FILE\"' refresh=true"

  if [ ! -f "$NOTIFY_FLAG" ]; then
    afplay "$SND_FILE" &
    touch "$NOTIFY_FLAG"
  fi
else
  MINUTES=$((REMAINING / 60))
  SECONDS=$((REMAINING % 60))
  printf "⏳%02d:%02d %s\n" "$MINUTES" "$SECONDS" "$DESCRIPTION"
  echo "---"
  echo "Clear | bash='rm \"$STATE_FILE\"' refresh=true"
fi

プラグインのインストール

mv timer.1s.sh "~/Library/Application Support/xbar/plugins/"
chmod +x "~/Library/Application Support/xbar/plugins/timer.1s.sh"

5. タイマーをセットするスクリプト

ターミナルから簡単にタイマーを設定できるスクリプトも用意します。
これで1コマンドでタイマーを開始できます。

xbar-timer.sh

xbar-timer.sh
#!/bin/bash

DURATION_MIN=$1
DESCRIPTION=$2

DST_DIR="$HOME/Library/Application Support/xbar/plugins/"
STATE_FILE="$DST_DIR/.timer_state"
NOTIFY_FLAG="$DST_DIR/.notified"
if [ -f "$NOTIFY_FLAG" ]; then
    rm "$NOTIFY_FLAG"
fi

START_TIME=$(date +%s)
END_TIME=$((START_TIME + DURATION_MIN * 60))
echo "$START_TIME:$END_TIME:$DESCRIPTION" > "$STATE_FILE"

echo "⏳${DURATION_MIN}分タイマー開始: $DESCRIPTION"

実行権限を付ける

chmod +x xbar-timer.sh

6. 使い方

たとえば、Qiita投稿に30分集中したいときは、次のように実行します。

./xbar-timer.sh 30 Qiita投稿

すると、メニューバーに次のように表示され、
1秒ごとにカウントダウンが進んでいきます。

image.png

タイマーが終了すると「ピンッ」という音で通知してくれます。

7. おわりに

ちょっとしたスクリプトですが、
日常の中でちょっと集中みたいな場面ではとても役に立っています。

興味のある方はぜひ試してみてください。
xbarは他にも天気やGitHub通知なども表示できるので、
いろいろカスタマイズして遊ぶのも楽しいですよ。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?