📅

Karabiner-Elementsで今日の日付や現在時刻を挿入する

2024/10/22に公開

1. はじめに

私はよく作業ログを取るのですが,そのときに日付や時刻を入れています。特に日付には曜日を入れるようにしているので,いちいちカレンダーを調べて曜日を入れずに,自動的に入力してほしいところです。時刻もいちいち時計を見て入力したくないですよね。

実はつい最近,プライベートの開発環境をWindowsからmacOSに移行しました。Windows環境ではAutoHotKeyを使って日付や時刻の入力を自動化していました。今日の日付や時刻以外にも,特定の接頭辞(例えば]D)の後に日付を表す文字列(YYYYMMDD)を入力し,範囲指定してコピーすると,任意の日付に対して曜日が入力された日付に変換されるという機能も実現して,かなり便利に使っていました。

※上記を実装した「Karabiner-Elementsで日付を表す文字列をクリップボードにコピーすると曜日付き日付に変換してペーストするようにする」を書きました。

残念ながらmacOS環境にはAutoHotKeyがないので,同じような機能を持つKarabiner-Elementsを使って,曜日を含んだ今日の日付や現在時刻を自動で入力することにしました。

2. 動作環境

私が使用している環境は以下の通りです。

  • MacBook Air M3 15インチ 2024
  • macOS Sequoia 15.0.1
  • Karabiner-Elements 15.2.1

3. 設定

3.1 シェルスクリプトの作成

$HOME/bin/insert_datetime.shというファイルを作成します。

insert_datetime.sh
#!/bin/zsh

format_datetime() {
    export LC_ALL=ja_JP.UTF-8
    date "+$1" | tr -d "\n" | pbcopy && pbpaste | osascript -e 'tell application "System Events" to keystroke "v" using command down'
}

format_datetime "$1"

スクリプトに実行権限を設定しておきます。

chmod +x $HOME/bin/insert_datetime.sh

3.2 Karabiner-Elementsの設定

Karabiner-ElementsのComplex Modificationsで「Add your own rule」を押して以下を設定します。

3.2.1 日付の挿入

{
    "description": "今日の日付を挿入する(右Command+d: YYYY/mm/dd(a),右Command+D: YYYY年mm月dd日(a))",
    "manipulators": [
        {
            "from": {
                "key_code": "d",
                "modifiers": { "mandatory": ["right_command", "shift"] }
            },
            "to": [{ "shell_command": "$HOME/bin/insert_datetime.sh '%Y年%m月%d日(%a)'" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "d",
                "modifiers": { "mandatory": ["right_command"] }
            },
            "to": [{ "shell_command": "$HOME/bin/insert_datetime.sh '%Y/%m/%d(%a)'" }],
            "type": "basic"
        }
    ]
}

3.2.2 時刻の挿入

{
    "description": "現在時刻を挿入する(右Command+t: H:M:S,右Command+T: H時M分S秒)",
    "manipulators": [
        {
            "from": {
                "key_code": "t",
                "modifiers": { "mandatory": ["right_command", "shift"] }
            },
            "to": [{ "shell_command": "$HOME/bin/insert_datetime.sh '%H時%M分%S秒'" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "t",
                "modifiers": { "mandatory": ["right_command"] }
            },
            "to": [{ "shell_command": "$HOME/bin/insert_datetime.sh '%H:%M:%S'" }],
            "type": "basic"
        }
    ]
}

4. 挿入方法

以下のようにキー入力をすると,出力形式に沿って今日の日付や現在時刻を出力例のように出力します。

キー入力 出力形式 出力例
右Command + d YYYY/mm/dd(a) 2024/10/22(火)
右Command + D YYYY年mm月dd日(a) 2024年10月22日(火)
右Command + t H:M:S 14:30:45
右Command + T H時M分S秒 14時30分45秒

5. ハマリポイント

  • 環境変数LC_ALLを日本語(ここではja_JP.UTF-8)にしないとdateの出力がおかしくなったり,trpbcopy,pbpasteで日本語がきちんと扱えない。
  • shell_commandの内容は/bin/zshが実行される。カレントフォルダは/で,渡される環境変数はUSERLOGNAMEPATHPATHは最低限(/usr/bin:/bin:/usr/sbin:/sbin)しか設定されない。

6. 参考

Discussion