のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いていますねー。困った人の役とかに立てばいいかなー。とかそういう程度の奴でーす。むぎゅぎゅ~。更新停滞中ですね~。

autohotkey2.0勉強中(翻訳)その2~ホットストリング編~

前→(ホットキー編)

最終更新日:2017/9/17

目次

はじめに

その1のコピペ

翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)

一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う

参考:ahkwiki日本版様及び公式ヘルプ

ホットストリング編

ホットストリングとは、打った文字に対して特定の動作をさせる機能のことで、主な用途はホットキー同様になんかしらの動作をさせる
または、その打った文字を特定の文字に置換することができる機能のこと
記述方法はホットキーに似ている
前版のAHKLではUnicode対応で、日本語の置換もできたらしいが、AHK2ではUnicode対応にもかかわらず日本語は文字化けしてしまう(手元の環境でそうなってる)
上記の理由により、文字置換はあんまり有益な使用例はないかなとか

基礎編

ホットストリングは以下のように記述する

::設定したい文字列::置換結果の文字列

ex: endと打ったらendingに置換する例

::end::ending

ex: endと打ったらメモ帳を開く例

::end::
Run, Notepad
Return
  • ただその文字を打っただけでは動作せず、終了文字を打たないといけない
  • デフォルトの終了文字はこいつらで、それぞれ一文字(一つのキー)で終了文字として作用する

終了文字一覧

終了文字一覧
(二個ずつ同じ種類というかグループに分けてあるけど見やすいというか覚えやすいように)

終了文字 説明というか名前
- バー
( )
[ ]
{ }
各種括弧
' " 一重引用符、二重引用符
: ; コロン、セミコロン
/ \ スラッシュ、バックスラッシュ
バックスラッシュは日本語環境では半角の¥と同じ
, . コンマ(カンマ)、ピリオド
? ! 疑問符、感嘆符
`n `t エンター、タブキー

  • 設定で終了文字は変えられる
  • #Hotstring EndChars "設定したい文字" のように記述すればいい
  • 上の表同様に、tabは`t、enterは`nで書く

オプション

ホットキー同様にホットストリングにもあり、設定できる
ホットストリングでの置換する際の動作が設定できる
例えば入力した文字を消去しない、終了文字を送信しないなど

オプションを個別に指定する場合

各それぞれのホットストリングに対してのみ有効となる
方法はホットストリングの最初の「;」の間にオプションを挟む

ex: 個別に指定する場合、この場合[c]の文字がオプションになる

:c:キー::置換先
以降のすべてのホットストリングに適応する場合

以下の記述をしたらそれ以降のホットストリングにそのオプションが適応される

ex: 以降のホットストリングに適応する例

#Hotstring [cなどのオプション]

ただし、一度設定したらそれ以降のホットストリングに指定したオプションが設定されてしまう為注意
もし特定オプションのみ解除した場合は下記の一覧にあるオプションの取り消しを上記の方法で設定する必要がある

一応例を↓

;オプションcの設定(以降のホットストリング全てに有効)
#Hotstring c

::a::abc

;オプションcの解除(以降はcは設定されてないことになる)
#Hotstring c0
オプション一覧
  • すべてのオプションで後ろに0をつけると取り消しになる
  • ただし、b0だけが例外で、bで取り消しになる

オプション一覧

記号(オプション) その説明及び例
? 他の単語などがあっても動作させる
ex: ?を実際に使った例""の部分がホットストリングで変換された部分 :?:al::airlineで設定してあるとして practic"al"→practic"airline"
* 終了文字を不要で動作させる
つまり指定したテキストを打ったら勝手に動作するということ
まあ特定条件とか(#IfWinActive)でなら使えるかもねっていうやつ
b0 入力した文字を消さず、そのまま残す
つまり置換しなくて、その後ろに指定した単語を追加する形
このオプションはbで取り消しになる
c 大文字小文字を区別するようにする
ex: intならIntegerに置換されるが、INT,iNt,Int,inTなら置換されない
:c:int::Integer
c1 大文字小文字を区別しないが、置換する際にn文字目が大文字なら置換後の文字も大文字になるらしい
手元の環境で試したらならなく、どんなパターンでも登録された形に置換された
もしかして 訳ミス
ex: intと打ったらIntegerにINTと打ったらINTegerになる
:c1:int::Integer
Kn 遅延を指定することができる、稀にしか使わない
使うときはだいたいゲーム関連か正常に動作しない時とか
また、どの送信モード(Sendコマンドのモード)かによって動作が異なる
SI: 遅延は無効化される、使えないから
SP: デフォルトは0で-1と同等
SE: デフォ0の-1は完全に遅延なし
o 自動置換で終了文字を打った際に終了文字を入力しないようにする
例えば置換対象のテキストを打った後にEnterを打って置換をするとすると、置換はされていいもののEnterが打っていることになり、改行されてうざいとかのときに有用かな
まあ置換使ってないんだけど
Pn 優先度を指定できる
まああんまり使わないかなと
R 置換後のテキストで{Enter}のような特殊キーの解釈を行わず、そのまま置換する
ex: 以下の場合Rのオプションを使用しない場合は{Enter}がそのまま置換されず{Enter}キーが送信されてしまう
:R:ent::{Enter}
z 設定したホットストリングが発生した時点で、キー入力の記憶バッファをクリアする
つまり、以前に入力したものを考慮しなくなり、不要なホットストリングの発生を抑えれる
以下のような場合に使用するらしい
ex::b0 *?:11 :: SendInput xx Return 上記の場合zオプションがないため、111を入力すると、 最初と二個目の11、二個目以降の11の二つで、ホットストリングが2回発生してしまうらしい
これを回避するためにzオプションを使用するらしい

なんか各種送信モードも書いてあったから別途表にした
一応後に出てくる?Sendコマンドのモードなんですがまあいいや

各種送信モード

送信モードの名前 その内容等
SI(SendInput) 入力速度が全モード中最速で、実行中はユーザーのキー入力は一切受け付けずに終了後に入力される
デフォルトの送信モードはこれになっている
SP(SendPlay) 一遍にウィンドウにキーが送られるため、やや遅めである、SEの一部設定よりも速いが、SIよりは遅い
一度に送信するため、ゲームのコマンドなどに有用
SE(SendEvent) 一定の間隔をあけるながら、個々の操作イベントを生成する
つまり、一つづつキーを送るてきなことだと解釈してる
操作の再生中にユーザーによる操作の割込みが発生する可能性があるからこのモードを使用するなら注意してだって

その他基本事項

  • デフォルトの状態では、ホットストリングの入力文字の判定が大文字小文字を判定しないものになっている
    • これにより、例えば下記の例ではEndでもendでもホットストリングが動作する
    • また、一つでも小文字なら置換後のテキストはそのままの形だが、全部大文字なら置換後のテキストもすべて大文字になる
    • 下記の例ならENDのみENDINGとなる
::end::ending
  • {Enter}などの特殊キーはそのまま特殊キーが送信される
    • 特殊キーはホットキーの修飾キーや、Enter,Tabキーなど

ex: entでエンターキーが送信される

::ent::{Enter}
  • 変数はサポートしていない
  • 設定できる置換元の文字上限は40文字
    • ちなみにその逆の置換先の文字数上限はたしか4万とかだった
  • ホットストリングを複数書いた場合↑にあるホットストリングほど優先順位が高い
  • スペースかタブを置換後テキストの最後に入れたい場合はスペースかタブを最後に入れてそのあとに`をつける
ex: :*:btw::By the way \`
  • マウスのクリックによってホットストリングの判定は解除されてしまう為以下のことが起こるので注意
    • ?オプションがなくてもホットキーの発動が起こる
    • 前回まで打っていた文字の判定がリセットされるので次に続きを打っても変換されない
    • #Hotstring NoMouseをスクリプトの先頭にでも書いておくことで、マウス自体をホットストリングで無効化にできるみたいで、問題を回避できる
  • ビルトイン変数A_EndCharには終了文字が入っていて入力した終了文字によって操作を変えたい、終了文字を送信したい等に使える

ex: 終了文字を送信する場合

SendRaw %A_EndChar%

上記でSendRawを使う理由は!{}などの文字が通常のSendコマンドによって正しく送信されないから

  • スペースとタブは文字として扱われる

ex:

::btw::by the wayと::btw::" "by the wayは異なる
  • 矢印キー、PageUp、PageDown、Home、Endをエディタ内で使うと判定がリセットされる
  • どんなウインドウでもホットストリングの対象となるため文字入力画面以外でも発動する
  • GosubまたはGotoには、最初のコロンのペア(オプション記号を含む)と名前で、ホットストリングのラベルとすることができる
ex: Gosub :: xyz
  • 使用できるキーはwikiさんのキーリスト参照してくださいな (そのうちリストの表のページ多分作るけども)

エスケープシーケンス

一部文字はエスケープシーケンスを用いないと使えない
(プログラム書いてる人とかにはおなじみだけども)
詳細は以下参照

日本語版wikiさんのエスケープシーケンス

詳細は「エスケープシーケンス」を参照(後ほど作るかな)

その他便利事項

ホットストリングで置換した後に文字消したいんだけど、カーソルの位置を動かしたいんだけど
  • {bs 数}: その数バックスぺースで後ろから文字を消す
  • {left 数}: 左にその数移動する
  • {right 数}: 右にその数移動する(これいるのかな)

あくまでこれらは置換した後に動作するものになるので、入力文字列を置換したくない場合はb0オプションをつけること
また、これらを使う場合はたぶん終了文字打つのが邪魔になるから * オプションと組み合わせるといいんじゃないかな

ex: ()を打った際に一つ←に移す、b0は()を消去しないために

:b0:()::{left 1}
ウィンドウ(ソフト)ごとに個別でホットストリングの設定がしたいんだけど

#IfWinActive、#IfWinExistを使うことで、特定のウィンドウのみに適応できる
一応説明と例を書いておくと

#IfWinActive, [ウィンドウの指定]  
ホットストリング  

こんな感じの書き方をすることにより#IfWinActive以下のホットストリングは#IfWinActiveで指定したウィンドウでのみ動作するようになる

一度指定したら次に#IfWinActiveで指定しなおすまでの間に書かれているホットストリングすべてに有効になる
また、#IfWinActiveのみの記述をウィンドウを指定した後に用いることで、グローバルホットストリングに戻せる

ex:以下はメモ帳が開いてる時のみのホットキーの設定

#IfWinActive, ahk_class Notepad
^a::MsgBox You pressed Ctrl-A while Notepad is active.
#c::MsgBox You pressed Win-C while Notepad is active.

詳細はいつかここに書くか個別で書くかしたいな
まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiの#IfWinActiveのページ

一応、詳細は#IfWinActive/#IfWinExistを参照 ←まだ

次→(リマップ編)