見出し画像

【AutoHotkey】任意の文字列を呼び出す

AutoHotkeyを導入したよ、という話を前の記事でしました。

あるキーに別のキーの役割を持たせるというだけでも、キーボードの操作感は随分違います。
長年の「慣れ」があるので、便利なはずの新たなキー配置を使いこなせるようになるまでにそれなりの時間が必要になりそうですが、適応できればこれまで小指や手首にかかっていた妙な負担もなくなり、文章を書くことが肉体的に楽になるであろうと思います。多分馬鹿にならない違いです。

しかしAutoHotkeyにできることはキー配列の置き換えに留まりません。例えば、関数を使って複雑な機能を各キーに持たせることもできるのです。
あまりにも多くのことができてしまうので、プログラミングの知識の乏しい私には到底全貌を見渡すことなどできませんが、ごく簡単なものなら少しの理解で活用することができます。

シンプル且つ自分の中で極めて大きい需要のあるものが、任意の文字列をぱっと入力できるようにする、ということです。
これまでは単語登録で何とかしてきたわけですが、候補の選択をするのが少し煩わしい場合もあり、キーを二つ三つ打鍵するだけで良いのならそちらの方が楽です。

参考にしたのは以下の記事です。

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

こちらは大変に便利です。特にIMEのオンオフに左右される日本語話者にとっては、IMEの状況がどうであれ決まった文字列をそのまま入力できるのは非常にありがたいものです。アルファベットなら押すべきキーの打鍵を順番に再現すればいいだけでも、日本語ではそうはいきません。

更にこのコードは、クリップボードを利用して実装されていますが、元々入っていたデータを取っておいて最後に元に戻すので、発動前のクリップボードの中身を保持できるところが良いです。

コードの詳しい解説は上記の記事内にあるので、是非読んでみてください。
なお「Sleep」の値を私は100に設定していますが、もう少し短くてもいいのかもしれません。確実に動かすためには、気にならない範囲でなるべく大きく取った方がいいかも、とは思います。

この関数を利用して、例えば以下のように設定しています。

AutoTrim, off ;変数代入時の空白文字自動除去をoff

::h1::
InsertText("# ")
Return

これの意味は、「h」「1」を続けて打ってEnterかSpaceかTab、あるいはいくつかの記号のいずれか(具体的には-()[]{}':;"/,.?!)を打つと、入力した「h1」は消えて代わりに「# 」が記述されるということです(ホットストリングと言います)。
IMEのオンオフには関係なく発動するので、日本語入力中でも半角記号を楽に打つことができます。

なお、最初の「AutoTrim, off」は、関数に代入する文字列の両端の半角スペースを反映させるためのものです。これを最初の方に書いておかないと、例えば上記の例なら「#」だけしか入力されません。
Trimしてくれた方がありがたい場合もあると思いますが、今回に関してはそうされない方が嬉しいのでoffにします。

同じようにして、h2やh3も設定します。こうしておくとMarkdownの編集が楽になります。

::h2::
InsertText("## ")
Return

::h3::
InsertText("### ")
Return

さて、この関数をほんのちょっとだけ応用したいと思います。例えばこんな関数を作ってみます。

InsertBracket(Content) {
  InsertText(Content)	;先述の関数を中に組み込み、同じ引数(Content)を渡す
  Send,{Left}		;←キーを自動で打鍵する(キャレットが括弧内に入る)
}

;この関数をホットキーとして設定する
vk1D & ]::InsertBracket("【】")	;無変換キー+]で【】を入力し、キャレットを括弧内に入れる

これは以下のように書くのと同じことですが、複数の括弧について設定するなど同じ形を二回以上用いる場合は、ごく簡単なものでも関数にした方が便利かと思います。

vk1D & ]::
InsertText("【】")
Send,{Left}
Return

プログラミングに縁のなかった人は、こういう「ちょっと足す」「ちょっと変える」を試して色々な関数を作ってみてもいいと思います。後から「関数にするほどでもなかった」と思ったら解体すればいいだけです。

もう一段階、If分岐も使って日時の入力に応用したいと思いますが、それは次回にします。

なおWikiに詳しい解説がまとめられています(が、プログラミング的なものに慣れていないとちょっとハードルが高いように感じます…)。


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