見出し画像

【AutoHotkey】あの手この手で日時を表示してみる

前の記事で、文字列をそのまま入力する(貼り付ける)関数を紹介しました。

InsertText(Content) {
  cb_bk = %ClipboardAll%
  Clipboard = %Content%
  Send, ^v
  Sleep, 200
  Clipboard = %cb_bk%
}

さて、頻繁に入力するものとして、他に日時情報があります。AutoHotkeyには日時を扱うコマンド(FormatTime)もあるので、簡単に現在日時(あるいは他の指定した日時)を自動入力することができます。

例えばこんな感じ。

vk1D & T::		;無変換キー+Tを打った時
FormatTime,TimeString,,yyyy/MM/dd HH:mm	;指定したフォーマットで変数TimeStringに現在日時を代入
Send,%TimeString%	;変数TimeStringの内容に従ってキーを自動で入力
Return			;処理を終了

指定した書式でフォーマットした文字列を変数TimeStringに入れ、その内容をSendで順番に自動入力しています。

これでも動くのですが、しかし一つ問題があります。これだと「文字列に従って、そのキーを押す」ということで入力されるので、IMEがオンになっていると妙なことになってしまうのです。
フォーマットが「yyyy/MM/dd HH:mm」なので、例えば「2022/09/06 09:49」だとすると、全角で「2022・09・06」と打ってきたところでスペースが打たれるので変換・確定し、そして「09:49」と打ってこの部分が全角入力未確定の状態になります。つまり「2022/09/0609:49」(09:49は確定待ち)となるのです。

これを解決するために、前の記事で紹介した関数を組み込みます。

vk1D & T::
FormatTime,TimeString,,yyyy/MM/dd HH:mm
InsertText(TimeString)	;Sendで自動入力するのではなくクリップボード経由で貼り付ける
Return

となります。こうすると変数TimeStringの内容がそのまま貼り付けられるので、IMEのオンオフに関わらず「2022/09/06 09:49」がパッと入力されます。

ところで、時刻を含めたいときと、年月日だけで良いときとがあるかと思います。別々に指定しても良いですが、ひとつの関数にまとめても面白いと思います。
例えばこんな感じ。InsertDate関数を新たに作ってみます。

InsertDate(time) {
  If(time=true)		;引数timeの中にtrueを入れておいた場合
    FormatTime,TimeString,,yyyy/MM/dd HH:mm
  Else			;引数timeの中にfalseを入れておいた場合
    FormatTime,TimeString,,yyyy/MM/dd
  InsertText(TimeString)
}
vk1D & Z::InsertDate(false)	;無変換キー+Zでyyyy/MM/dd
vk1D & X::InsertDate(true)	;無変換キー+Xでyyyy/MM/dd HH:mm

これはtrueかfalseかで判定していますが、文字列での判定にすればもっと複雑に分岐することも可能です。
これ自体はごく短いコードなのでわざわざ関数を通すまでもないものではありますが、練習として作ってみてちょっとした感動はありました。簡単なものでもプログラムを初めて試した時にはいつも「おお」と思います。

別なやり方でフォーマットを指定してみましょう。InsertDate関数を以下のように書き直します。

InsertDate(format) {
  FormatTime,TimeString,,%format%	;引数formatに入れた文字列に基づいてフォーマットする
  InsertText(TimeString)
}
vk1D & D::InsertDate("yyyy年M月d日")	;無変換キー+D

こうすると、引数に代入した形式でフォーマットされます。つまりこの場合「2022年9月6日」となるのです。

その都度決めることもできます。例えばこう書き換えます。

InsertDate() {
  MsgBox, 4,,時刻を含めますか?	;Yes/Noを答えるダイアログを表示する
  IfMsgBox, No
    FormatTime,TimeString,,yyyy/MM/dd
  Else
    FormatTime,TimeString,,yyyy/MM/dd HH:mm
  InsertText(TimeString)
}
vk1D & D::InsertDate()	;無変換キー+D

MsgBoxはダイアログを表示して内容を確認したりYes/Noを問うたりすることができるコマンドです。カンマの数には意味があるので注意してください。

あるいはこうします。

InsertDate() {
  InputBox, format, , フォーマットを入力してください。	;変数formatに代入する文字列の入力ダイアログを表示する
  FormatTime,TimeString,,%format%	;入力した文字列に基づいてフォーマットする
  InsertText(TimeString)
}
vk1D & D::InsertDate()	;無変換キー+D

InputBoxはダイアログを表示して文字列の入力を促すコマンドです。例えば「yyyy-MM-dd」と入力してOKすれば「2022-09-06」が表示されます。
(わかりやすくするため)エラー処理をしていないのでこれだけだとちょっと心許ないところがあるコードですが、とりあえずダイアログを表示して指定できるということは伝わったかと思います。

実際に日時の入力の際にダイアログを経由させるのは現実的ではありませんが、一度試してみれば他に何かしたい時に応用が利くと思います。

なお日時部分についての私の設定を整理しておくと、今のところ全体はこうなっています。(これを他の設定と併せて.ahkファイルに書いているということです)

vk1D & Z::InsertDate("yyyy/MM/dd")		;無変換キー+Zでyyyy/MM/dd
vk1D & X::InsertDate("yyyy/MM/dd HH:mm")	;無変換キー+Xでyyyy/MM/dd HH:mm
vk1D & C::InsertDate("HH:mm")			;無変換キー+CでHH:mm

InsertText(Content) {
  cb_bk = %ClipboardAll%
  Clipboard = %Content%
  Send, ^v
  Sleep, 100
  Clipboard = %cb_bk%
}
InsertDate(format) {
  FormatTime,TimeString,,%format%	;引数formatに入れた文字列に基づいてフォーマットする
  InsertText(TimeString)
}

この記事が気に入ったらサポートをしてみませんか?