のら(NORA)のブログ

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

autohotkey2.0勉強中(翻訳)その5~変数編~

最終更新日: 2017/10/30

前→(スクリプト編)

目次

はじめに

その1のコピペ

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

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

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

変数編

変数の型

  • 変数やコマンドの引数として使われる値は、すべて文字列として保持される
  • 明示的に変数の型を定義する必要はなくて、任意の変数に文字列、整数、浮動小数点数、またはオブジェクトへの参照を代入することができる
  • また、数値は必要に応じて文字列に自動的に変換される
  • 変数の型を判別したい場合はType関数を使用することで判別することができる
  • 値が特定のフォーマットの場合、整数、小数、日付時刻として計算などで使うことができる
  • どのような書式が 各コマンドが対応(原文:出力)する整数・小数の文字列表現フォーマットなのかは、SetFormatコマンドで設定できる

変数のスコープと宣言

  • 関数のローカル変数を除いて、すべての変数はグローバル変数として扱われる
  • 関数内で定義された変数を除いて、変数をグローバル宣言する必要はない
  • 変数を使用することによってその変数が存在するようになる(定義されたことになる、使用できるようになる)
  • スクリプト起動時に、各変数の値はemptyまたはblankでスタートする

変数の名前

  • 変数名は大文字と小文字は区別されない(たとえばCurrentDateはcurrentdateと同じ)
  • 変数名は最大253文字で、文字、数字、アンダースコア、ASCII以外の文字で構成され、変数名は数字で始めることはできない

予約語

以下の単語は演算子として、もしくは制御フロー文の名前として予約または使用されているため、変数名として使用できない
まあつまり既にこれらの名前はahkに使われてるから使えないってこと
また、関数、クラス、およびウィンドウグループでも変数と同じ検証を使用するため以下の単語が使えない
予約語の一覧(abc順)

and break catch continue else
Finally For Gosub Goto If
in is Loop LoopFile LoopParse
LoopRead LoopReg new not or
Return Throw Try Until While

変数への値の代入(格納)

  • 変数に値を代入するには「:=」の後に数字、引用符付き文字列、または他のタイプの式を書く
  • ahk2からは「=」は使えず、「:=」に統一された←ここ重要
ex: 代入の例  
Var := 123  ;数値*123*の代入  
Var := "Var" ;文字列*Var*の代入
  • 値が割り当てられていない変数には、デフォルトで空(blank/null)の文字列が含まれている

変数に割り当てられたメモリの解放

ex: Var := "" という風に空の値を割り当てることで、割り当てられたメモリを開放できる
  • 変数には、コマンドの出力変数として間接的に値を割り当てることもできる

関数の出力変数を用いて間接的に変数への代入を行う

ex: アクティブウィンドウのタイトルを関数の出力変数*Title*に代入
WinGetTitle *Title*, A
  • 変数が整数の場合、64ビット整数(long)相当の値が扱える
  • 変数が少数の場合、double値相当の値が扱える
  • 変数とは別に、環境変数(後述)も扱うことが出来る(どこからこれ持ってきたんだろう?)
  • EnvSetコマンドで環境変数に代入する
  • この環境変数は、Runコマンドなどで起動したプログラム内から参照できる
  • 変数の展開では、通常の変数も環境変数も展開できるが、未定義の変数は長さ0の文字列に展開される
  • 1変数の容量の上限は64KBである(#MaxMem指令で変更可能)
  • 組み込み変数は「組み込み変数」を参照

変数の値(内容)を取得する

  • 変数の内容を文字列に含めるには、変数名をパーセント記号「%」で囲めばいい
ex: MsgBox、変数Varの値は%Var%です  
MsgBox( "変数Varの値は%Var%です" )
  • また、パーセント記号「%」は式の変数参照(引用符付き文字列以外、式内など)では省略していい
ex: MsgBox( "XとYの合計は(X + Y)です" )

エスケープシーケンス(エスケープ処理)

  • ファイルパスの「\」のエスケープの必要をなくすため、エスケープ文字は「`」(Shift+@)になっている
  • 以下に示すエスケープシーケンスが使える
  • それ以外の文字をエスケープした場合、その文字自身になる(例:「`x」→「x」)
  • EscapeChar指令でエスケープ文字を変更できるらしい

  • 任意のコマンドの最初のカンマを省略することができる
  • (最初の引数が空白の場合や::=などの代入演算子で開始する場合、またはコマンドが継続セクションの一番上にある場合を除く)
  • 例外1:MsgBox内のカンマはエスケープする必要はない
  • 例外2:コマンドの最後の引数のカンマはエスケープする必要はない

エスケープシーケンス一覧

  • コマンドの区切りと区別するため、エスケープが必要
  • なお、コマンドの最後の引数内では、文字としてのカンマであることが自明なため、カンマをエスケープする必要は無い
  • `; 「;」で、半角スペースかTab文字の次に来る場合のみ、コメントの開始記号と区別するためにエスケープする必要がある
  • `:: 文字列「::」(コロン二つ)ホットストリングなどで使用
  • `% 「%」(パーセント記号)
  • `n 改行(LF/0x0A)
  • `r 復帰(CR/0x0D)
  • `t Tab文字(0x09)
  • `v 垂直Tab(0x0B)
  • `b BackSpace文字(0x08)
  • `a Bell文字(0x07)
  • `f 改ページ(0x0C)
  • `` 「`」自身なんかバックスラッシュ二個と同じ意味合いをもつらしい
  • `, 「,」(カンマ)の文字 プログラム最後のカンマとMsgBoxではエスケープしなくていい
  • `"または`' 一重引用符と二重引用符は同じ意味を持つが、一重引用符で囲まれた文字列の中では二重引用符を使用するとそのまま二重引用符が扱える、説明しにくいので以下の例を見て
ex:一重引用符の中に二重引用符を用いる例で、以下の二つは同じ結果  
Var := "The color \`"red\`" was found."  ;「"」をエスケープ「\`"」して書いた場合  
Var := 'The color "red" was found.'  ;「'」で囲んでいるので中にある「"」はエスケープしなくてもよい

Sendモードにおけるエスケープシーケンス

Sendコマンドまたはホットストリングをデフォルト(非raw)モードで使用すると、{} ^!+#などの文字は特別な意味を持つため、
これらを文字通り使用するには、中括弧で囲む

ex: Send {^} {!} {{}

次→(式編)

setpointさんがまじでsetpointさんなので強制的にアプリ設定がリセットされないようにした(autohotkey2)

はじめに

setpointさんがパソコン(win10)が起動するたんびにアプリケーションの設定がリセットされるのでautohotkeyさんを使って強制的にリセットされないようにした
setpoint(無能)さんまじでsetpoint(無能)さん
いくつかのサイトではデバイスのappoverrideだったかなんかを消せば解決するってなっていたけども自分のバージョンではできなかった
ダウングレードすればできたけどなんか気に入らなかったからというかいろいろあったから最新版にした(最新版でも解決してるならなんのせいだろうね)
autohotkeyさんについては検索でもしてほかの方の説明を見ればいいんじゃないかな
かなり細かく書いているので、操作がわかる人は基本的に太字の文のみ読めば大丈夫
まあ自己責任で
ということで環境とやり方↓

環境

  • win10 1703(アップデートしてなければ)
  • setpoint コントロールセンター : 6.67.83
  • setpoint ドライババージョン : 5.90.41 (関係ないと思うけどまあなんとなく)
  • Autohotkey2.0a3なんちゃらだった気が

やり方

事前にuser.xml(setpointの設定)とsetpointの起動ショートカットのコピーを別の場所に作成しておき、PCの起動時に上書きをする
その後、setpointさんの起動をする
このため、元から設定されているスタートアップは消すもしくは無効化しておく
スタートアップとかuser.xmlのコピーとかの説明はいらないんだよってひとはこれをクリック

  1. まずはsetpointのスタートアップを無効にする

    1. タスクマネージャーを開く

      • キーボードだけでやるやり方

        1. 「Ctrlキー」「Shiftキー」「Escキー」を同時に押す
        2. windowsキー」に「Xキー」を同時に押す、その後「Tキー」を押す
      • マウスでやるやり方

        1. タスクバーのスタートボタンを右クリック、出てきたタスクマネージャーをクリック(「Tキー」でもいい)
        2. タスクバーの何もないところを右クリック、出てきたタスクマネージャーをクリック(「Kキー」でもいい)
    2. スタートアップをクリック

    3. Logicool setpoint ・・・ を右クリック
    4. 無効をクリック
  2. setpointの設定のコピーを作成する

    1. setpointのAppdataフォルダを開く
    2. C:\Users\ユーザー名\AppData\Roaming\Logitech\SetPoint\エクスプローラーなどで開く 表示されていない場合

      • windows10なら「windowsキー」と「iキー」を同時に押し、検索欄で「フォルダ」で検索をし、出てきた「すべてのファイルとフォルダの表示」をクリック
      • windows7ならコントロールパネルを開いて「デスクトップのカスタマイズ」をクリックし、「エクスプローラーのオプション」のすべてのファイルとフォルダを表示をクリック
        その後、ファイルとフォルダの表示の「隠しファイル…を表示する」をクリックをすれば表示されるようになる
    3. 中にある user.xml をコピーする

    4. autohotkeyスクリプトなどを格納するためのフォルダとバックアップのためのフォルダを作成する
    5. 作成した両方のフォルダにペーストする
  3. setpointのショートカットのコピーを作成する

    1. setpointのプログラムフォルダを開く
    2. 64bit版ならC:\Program Files\Logicool\SetPointP\ 、32bit版ならC:\Program Files\Logicool\SetPointP\エクスプローラーなどで開く 自分のOSが何bitかわからない場合はスタートボタンを右クリックして出てきたメニューのシステムをクリック、出てきた画面の中にある64ビットもしくは32ビットと書いてあるのを探し、それが自分のOSのビットになる
    3. マウスおよびキーボードの設定.lnkをコピーする
    4. 先ほど作った二つのファルダにペーストする
    5. setpoint.lnk に名前を変更する
  4. autohotkeyスクリプトを書く

    1. なんでもいいのでテキストエディタ(メモ帳)で以下のコードをコピー&ペーストする - 何の変更もしなくて大丈夫

    FileCopy, user.xml, %A_Appdata%\Logitech\SetPoint\user.xml, 1
    Run, setpoint.lnk
    Return

    1. 「名前を付けて保存」で、先ほど作ったフォルダに好きな名前を付けて末尾に「.ahk」をつけて保存する これがスクリプトファイルになる
      ※今までのすべてのファイルが同じフォルダにないと正常に動作しない
  5. 保存したスクリプトをスタートアップに登録する

    1. 保存したスクリプトのショートカットを作成する
    2. 作成したショートカットをカットする
    3. C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ を開く
    4. ペーストする
  6. 設定してない人向け) 「.ahk」ファイルにアイコン(緑色のアイコン)がついてない人は「.ahk」ファイルの関連付けを行う

    1. 先ほど保存したスクリプト(.ahk)を右クリックし、「プログラムから開く」の「別のプログラムを開く」を選択
    2. 「その他のアプリ」の「このPCで別のアプリを探す」をクリック
    3. autohotkeyの実行ファイル(Autohotkey.exe)があるところに移動し、選択し、OKを押す

あとがき

疲れた
とりあえず写真欲しいね
ていうかautohotkeyで各ソフトにも割り当てればいいと思ったけどいいや
まあいつも通り困ってる人がいてその役に立てばいいかなっていう記事
動作保証等はしかねるので自己責任ですー。

autohotkey2.0勉強中(翻訳)その4-2~スクリプト編その2~

最終更新日:2017/10/30日(整形のみ)

前回のその1はこちら

目次

はじめに

その2では、これらの事について扱っている
これらは知らなくても普通に使えるため、結構適当
一部コンテンツ記載してないけど
+ AHKコマンドライン引数 + スクリプト文字コード + スクリプトのEXE化(コンパイル)

その1はこちら

その1のコピペ

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

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

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

スクリプト編(その2)

プログラムのコマンドライン引数

AutoHotkeyコマンドラインの書式は以下の通り

AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]

コンパイル済みのexe(実行ファイル)については以下の通りになる

CompiledScript.exe [Switches] [Script Parameters]

以下ではそれぞれの場所に使用できるものについて書いてある

[Switches] に使用できるオプション

オプションのため、使用しなくても構わない コンパイル後でも使用できるもの、できないものがある

コンパイル後でも使えるもの

  • /f(または/force):警告ダイアログを出さずに、強制的に起動
    • #SingleInstance Offと同じ効果
  • /r(または/restart):スクリプトを再読み込みしたいときに使用
  • /ErrorStdOut:文法エラーをダイアログ表示せずに標準出力に出力する
    • 詳細については「#ErrorStdOut」を参照(後ほど)
    • これを/iLibと組み合わせて、スクリプトを実行せずに検証することができる(ただしコンパイルしていたらできない)

コンパイル後では使えないもの

  • /Debug:デバッグクライアントに接続する
    • 詳細については、「対話型デバッグ」を参照(後ほど)
  • /CP「n」:スクリプトファイルの読み取りに使用されるデフォルトの文字コードを上書きする
  • /iLib "Outfile" AutoHotkeyスクリプトをロードしますが、実行せず、ライブラリ機構を介して自動的にインクルードされるスクリプトファイルごとに、OutFileで指定されたファイルに2行づつ書き込まれる

    • 書き込まれる行は、次の形式で記述される

    LibDirはLibフォルダのフルパスで、LibFileはライブラリのファイル名 \#Include LibDir\ \#IncludeAgain LibDir\LibFile.ahk

  • 出力ファイルが既に存在する場合は上書きされる

  • OutFileは、「"」の代わりに「*」で囲むと標準出力(stdout{standardout})にできる
    • 詳細は「標準出力」を参照(後ほど)
  • スクリプトに構文エラーが含まれていると、出力ファイルが空になることがある
    • プロセス終了コードを使用してこの状態を検出できる
    • 構文エラーがある場合、終了コードは2になる
    • /ErrorStdOutスイッチ(↑のやつ)を使用すると、エラーメッセージを抑制またはキャプチャできる

[Script Filename] に使用できるオプション

  • [Script Filename] は引数がない場合は省略可能
  • [Script Filename] を省略した場合(スタートメニューから直接AutoHotkeyを実行する場合など)は、「~.ahk」の名前のファイル(詳細は後述)を以下の順で検索する
1.AutoHotkey実行可能ファイルを含むディレクトリ
2.現在のユーザーのドキュメントフォルダの順番で検索される
  • ファイルが存在しない場合、デフォルトのファイルを作成するかをたずねるダイアログが出る
  • スクリプトに引数を渡したい場合は省略できない
  • また、検索するファイル名(上記の「~.ahk」)は、スクリプトを実行するために使用される実行ファイルの名前によって異なる
    • AutoHotkey.exeの名前をMyScript.exeに変更すると、MyScript.ahkが検索される
引数なしで*AutoHotkeyU64*.exeを実行すると、*AutoHotkeyU64*.ahkが検索される

[Script Parameters] に使用できるオプション

  • [Script Parameters] には任意の数の文字列をスペース区切りで渡せる
  • 文字列スペースを含みたい場合は「"」で囲む
    • 引用符で囲まれた引数(「"C:\ My Documents \"」など)のバックスラッシュは、リテラルの引用符として扱われる(つまり、スクリプトは「"C:\ My Documents"」という文字列を受け取る)
    • この引用符を削除するには、A_Args [1] := StrReplace(A_Args [1]、 "")とすればいい
  • 渡された引数は、組み込み変数「A_Args」に配列に格納され、配列構文を使用して参照できる
  • 「A_Args [0]」には引数の数が格納されるらしい
  • スクリプトに渡される引数の数がわからない場合(一連のファイルをスクリプトドラッグアンドドロップした時など)、次の例を使用してそれらを1つずつ抽出できる

ex:

for n, param in A_Args  ; For each parameter:  
{  
    MsgBox "Parameter number " n " is " param "."  
}
  • 引数がファイル名である場合、次の例を使用して、ファイルシステムに格納されている大文字と小文字を区別した長い名前に変換できる(完全/完全パスを含む)

ex:

for n, GivenPath in A_Args  ; For each parameter (or file dropped onto a script):
{
    Loop Files, GivenPath, "FD"  ; Include files and directories.
        LongPath := A_LoopFileFullPath
    MsgBox "The case-corrected long path name of file`n" GivenPath "`nis:`n" LongPath
}

スクリプトファイルの文字コード

スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される まあ大体UTF-8で書くだろうからあんま気にしなくていいんじゃないかな
ボム付きにすれば基本的に問題ないんじゃない?

ファイルがUTF-8またはUTF-16(LE)バイト順序マークで始まる場合、適切な文字コードが使用され、/CP「n」スイッチ(コマンドライン引数のswitchオプションの/CPnのこと前述済み)は無視される
/CP「n」スイッチがコマンドラインで渡されると、文字コード「n」が使用される
有効な文字コード識別子の数値一覧については、「MSDN」を参照(後ほど)
それ以外の場合は、システムのデフォルトの「ANSI」が使用される

これは、AutoHotkeyで読み込まれたスクリプトファイルにのみ適用され、スクリプト自体の中でI/Oファイルには適用されないことに注意
FileEncodingは、スクリプトによって読み書きされるファイルのデフォルトのエンコーディングを制御する
IniReadおよびIniWriteは常にUTF-16またはANSIを処理する
すべてのテキストが(必要な場合)ネイティブの文字列形式に変換されるため、無効またはネイティブコードページに存在しない文字は、プレースホルダ' 'に置き換えられる
これは、スクリプトファイルにエンコーディングエラーがある場合、またはファイルの保存とロードに使用されたコードページが一致しない場合にのみ発生する
RegWriteを使用して、エクスプローラから起動されたスクリプトのデフォルトを設定することができる(ファイルをダブルクリックするなど)

ex:HELPそのまま、autohotkeyがインストールされている前提

; 下の行のコメントを外すか、コメントにすべてコメントしておく
; 現在のビルドのデフォルトにリセットするなど、必要に応じて変更する
; ↑のコメント二つ適当に訳した
; codepage := 0        ; システムデフォルトのANSI  
; codepage := 65001    ; UTF-8  
; codepage := 1200     ; UTF-16  
; codepage := 1252     ; ANSI ラテン語 1; 西ヨーロッパ(Windows)  
if (codepage != "")
    codepage := " /CP" . codepage
cmd := Format('"{1}"{2} "%1" %*', A_AhkPath, codepage)
key := "AutoHotkeyScript\Shell\Open\Command"
if A_IsAdmin    ; Set for all users.
    RegWrite cmd, "REG_SZ", "HKCR\" key
else            ; Set for current user only.
    RegWrite cmd, "REG_SZ", "HKCU\Software\Classes\" key

スクリプトのEXE(実行ファイル)化

方法

Ahk2Exe.exe / in MyScript.ahk [/ out MyScript.exe] [/ icon MyIcon.ico] [/ bin AutoHotkeySC.bin] [/ mpress 0or1]

スペースを含む引数は二重引用符で囲む必要がある
"out"項目を省略すると、EXEはスクリプト自体と同じベースファイル名を持つようになる

ex)Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
  • 引数がAhk2Exeに渡されると、コンパイルプロセスの成功または失敗を示すメッセージがstdoutに書き込まれる。メッセージはコマンドプロンプトに表示されないが、出力をファイルにリダイレクトするなどの手段で「キャッチ」できる
  • さらに、エラーの場合、Ahk2Exeには、発生したエラーの種類を示す終了コードがあり、これらのエラーコードはGitHub(ErrorCodes.md)にあるってさ
  • リソースハッカー(フリーウェア)などのユーティリティを使用して"AutoHotkeySC.bin"ファイルを編集することで、コンパイル済みのスクリプトにバージョン情報(エクスプローラのファイルプロパティダイアログに表示されるやつ)を編集(追加)できる
  • また、Compile_AHK IIを使うとこのプロセスを容易にできる

コンパイルされたスクリプトを圧縮するには

Tips

  • コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない
  • #NoTrayIconコマンドと "Menu、Tray、ShowMainWindow"コマンドは、コンパイルされたスクリプトの動作に影響する
  • 「Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる
  • スクリプト側が、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する、「1」ならコンパイルされている(それ以外は「0」)
  • コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる
  • 作成した実行ファイルの配布は自由
  • 実行可能ファイルを圧縮すると、メモ帳やPEリソースエディタなどのプレーンテキストエディタを使用してスクリプトソースコードを簡単に検査することはできませんが、その目的専用のツールでソースコードを抽出することができなくなる

次→(autohotkey勉強中その5)

autohotkey2.0勉強中(翻訳)その4-1~スクリプト編その1~

最終更新日: 2017/12/23

前→(リマップ編)

目次

はじめに

その1ではスクリプトの基礎編として知っておくべき事柄を抜擢して並べてみた
(エスケープシーケンス入ってないけど)
内容としては以下の通りになっている
AHKの最新版(a081)では全ての関数が関数(function)に変更され、第一引数との間のカンマが不要になっているなど変更点あり
また、エスケープシーケンスも異なる仕様になったので注意

  1. スクリプトの書き方
  2. 自動実行セクション
  3. コメントの書き方
  4. エスケープシーケンス
  5. 行を複数行に分割する方法
  6. 継続セクション(分割の一部)
  7. デバッグ

その2では、AHKコマンドライン引数、スクリプト文字コードについて、、スクリプトのEXE化(コンパイル)について扱っている
これらは知らなくても普通に使えるから後回し
その2はこちら

その1のコピペ

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

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

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

スクリプト編その1

スクリプトの書き方(基礎)

スクリプトは基本的に1行1命令(関数)で書く
スクリプトを起動したら、スクリプトは一行ずつ読み込まれ、最適化、検証されるため、エラーがあったら通知してくれる
また、エラーがあった場合は、そのエラーが修正されるまでプログラムを実行できない

関数の引数に文字列を指定する場合は、「"」で括はないといけない

ex: 一行分のスクリプト どちらもOK

以下のスクリプトの詳しい説明

MsgBox [なんちゃら]で[なんちゃら]を画面に表示する(メッセージを表示する関数)
下記の例はスクリプトの一行分になり、その内容は、MsgBox関数を用いて、引数This is script.をMsgBox関数に渡している
引数が文字列だが、スクリプト内になるため、「"」を使用しなくていいため使用してない

MsgBox "This is script."

スクリプトの起動とAuto-execute(自動実行)セクション(以下自動実行セクション)

スクリプトを起動した際の動作について書かれていて、スクリプトを記述する際、どういう風に動作するのかが書かれてる

スクリプトが読み込まれる(ahk.exeで実行される)と、Return、Exit、ホットキー、ホットストリング、スクリプトの終わりのいずれかに達するまで先頭から自動的に実行される
この部分(スクリプトが自動実行される範囲)のことを、自動実行セクションと呼ぶ

自動実行セクションが終了した際に、ホットキーなど(以下参照)がスクリプト中に記述されている場合はスクリプトが常駐状態にされる
(まあスクリプトが勝手に終わってホットキーとかが動作しないとかなったら大変だしね)
常駐状態にならない場合、スクリプトは終了する

常駐状態の場合は、ホットキー、ホットストリング、GUIイベント、カスタムメニュー項目、タイマーなどのイベントに応答して、待機(アイドル)状態で動作し続ける

自動実行セクションの完了後にこれらの条件が変更された場合や、(たとえば、最後のタイマーが無効になった場合)、最後に実行されたスレッドが完了するか、最後のGUIが終了すると、スクリプト(自動実行セクション)が終了する

自動実行セクションが終了しない例

  • ホットキー
  • ホットストリング
  • 可視GUI(アクティブなGUI)
  • アクティブなメッセージモニタ
  • タイマー
  • OnClipboardChangeコールバック関数
  • カスタムトレイメニュー項目
  • および#Persistent指令(ディレクトリ)
  • Lock系キーの固定

ホットキー、カスタムメニューアイテム、タイマーで起動されるスレッドでは、下記に記載する関数での設定はそれぞれ独立している

これらの初期値は自動実行セクション内で設定できる
設定が行われる前にスレッドが呼び出されると、期待した動作にならないことがあるので、自動実行セクションのできるだけ最初の方で設定しよう
デフォルトでは自動実行セクションが完了すると、下記の設定は再度初期値に更新される
だからホットキー、ホットストリング、タイマー、またはカスタムメニュー項目を含むスクリプトの一番上でデフォルト値を変更するのがいい

自動実行セクションが完了するまでに長い時間がかかる場合(または完了しない場合)、設定のデフォルト値は100ミリ秒後に有効になる

実行時に設定が初期化される該当関数設定一覧

  • DetectHiddenWindows
  • DetectHiddenText
  • SetTitleMatchMode
  • SetBatchLines
  • SetKeyDelay
  • SetMouseDelay
  • SetWinDelay
  • SetControlDelay
  • SetDefaultMouseSpeed
  • Thread attributes
  • CoordMode
  • SetStoreCapslockMode
  • AutoTrim
  • SetFormat
  • StringCaseSense

コメントの書き方

コメントの書き方は以下の3通りある
スクリプトを書いたときにどんなことをするために書いたのか、戻る値がなんなのかなどを書いておくことに使う

  1. 行頭がセミコロン「;」の行はコメント
  2. 関数のあとに半角スペースを空けてセミコロンがあれば、それ以降は行末までコメント(行コメント)
  3. /* …… */で囲まれた範囲もコメントになる(複数行コメント)

ex:

;コメント   
Run "autohotkey.exe" ;これ以降はコメント(1行に限る)  
/*
複数行  
に  
わたる  
コメント  
*/

エスケープシーケンス

AutoHotkeyエスケープ文字は、キーボードの左上にあるアクセント/バッククォート( )です 引用符は引用符で囲まれた文字列の中に含めるためにエスケープすることが出来る たとえば、 """", "" およびChr(34)という式はすべて二重引用符を含む文字列を生成する 特定の特殊文字も、エスケープシーケンスを用いて使用することが出来る
t(タブ),n(改行)、 r(改行)など

長い一行のスクリプトを分割する方法

スクリプトの一行がとてつもなく長いと読みづらいよね
そこで、長いなら分割すればいいじゃないか、ということになったのか何なのか知らないが、複数行に分割することができる
なお、分割しても実行の速度は変わらない←ここ重要
ヘルプの書き方だと主に引数に使用するっぽい

方法その1

やり方

and、 or、||、&&、カンマまたはピリオドで始まる行はそのすぐ上の行と自動的に結合(併合)される
++/--を除く他のすべての式演算子についても同じように一つ上の行と結合される(演算子詳細はまた今度)

これらの行の接続詞のあとにインデントは入れる必要はないが、入れたほうが可読性は上がると思う
また、上の行とつながっていることを示すコメントを入れておくことで、可読性が増す

いずれかの行と行の間または文末に、空白行またはコメントを追加することができる

方法その1の例(長いので折り畳み)

全ての例で[*]で囲んでる部分がスクリプトの結合をしている部分

ex1: 2行目がコンマで始まるため、最初の行に2行目が追加(結合)される

FileAppend "This is the text to append.`n"   ; ここにコメントを書くことが出来る、`nは改行のこと
*,* %A_ProgramFiles%\SomeApplication\LogFile.txt  ; Comment.

ex2:"and"または "or"で始まる例

if (Color = "Red" or Color = "Green" or Color = "Blue" ;コメント
*or* Color = "Black" or Color = "Gray" or Color = "White")   ;コメント
*and* ProductIsAvailableInColor(Product, Color)   ; コメント

ex3: その他の例 この場合は三項演算子

ProductIsAvailable := (Color := "Red")  
*?* false  ; この部分は単純に三項演算子として使われているっぽい  
*:* ProductIsAvailableInColor(Product, Color)

方法その2

「複数の行を結合する」または「結合したい行が"方法その1"に適していない」場合に使用する必要がある
この方法はホットストリングの自動置換に特に便利らしい

この方法を継続セクションというのだが、長いので、簡易的なやり方と、継続セクションについてがっつりで項目を分けた

やり方

結合したい複数の行を「()」で囲むだけでいい
また、初めの「(」は必ず改行してから始めなければならない
()で囲った部分は継続セクション(継続節)と言う
次の章で扱うオプションを用いないとデフォルトの状態だと各行の結合に改行が用いられるので注意

また、途中に)で始まる行を含めたい場合は、`)のようにエスケープする

方法その2の例

ex1: 継続セクションの例
「"」で囲んでいるのは変数「Var」に継続セクションを文字列で代入しているから
式に該当するので、「"」で囲まないといけない

Var := "  
(  ;ここから  
Line 1 of the text.  
Line 2 of the text. By default, a linefeed (`n) is present between lines.  
)"  ;ここまでは継続セクション

結合した結果: Line 1 of the text.
Line 2 of the ~
(改行で結合されるということが言いたい9)  

ex2: 継続セクションのあとにオプションがくる場合の例かな?
下の例の一番下の行には、最初の行のFileAppendの最後の引数が含まれていて、このような書き方もできるらしい
このような場合にはカンマが引数を区切るためのカンマと認識される

FileAppend "  
(  ;ここから  
A line of text.  
By default, the hard carriage return (Enter) between the previous line and this one will be   written to the file as a linefeed (`n).  
By default, the tab to the left of this line will also be written to the file (the same is true for spaces).  
By default, variable references such as %Var% are resolved to the variable's contents.
)", C:\My File.txt  ;ここまで( )まで)は継続セクション

継続セクション

デフォルトでは、継続セクション内の引用符は、エスケープされているかのように動作する
つまり、「"」記号はそのまま「"」として扱われる
さらに、継続セクション内の最初の行のインデントに基づいて、その後の各行の先頭のインデントが省略される
行の始まりがスペースとタブの二つで始まっているとすると、継続セクションの一番先頭の行に用いられているほうが省略される
いずれかの行が最初の行よりもインデントされているか、または間違った文字でインデントされている場合、その行の先行するすべてのインデントは消されず、そのまま残ってしまう

このデフォルトの動作を無効化させたい場合は、セクションの開始括弧の右側に次のオプションの1つ以上を設定すればいい

(LTrim Join|

式(:= 演算子を用いた代入)でも利用が可能だが、引用符の位置に注意が必要。例は↑のex1
継続セクション内にコメントは入れれない、下記に記述するCオプションで指定すれば可能になる
また、[()]から始まる行にはコメントを入れることができる

ex: コメント可能な行には ; 可能と書いてある

FileAppend,   ; コメント可能
; コメント可能
( LTrim Join    ; コメント可能
     ; これはコメントにならないで文字列として扱われる
), C:\File.txt   ; コメント可能

エスケープシーケンスはそのまま使える(`オプションが指定されている場合を除く)

継続セクションのオプション

継続セクションの動作は、セクションの開始括弧の右側に次のオプションの1つ以上を含めることで上書きできる
複数のオプションが存在する場合は、それぞれのオプションをスペースで区切って記述すればいい

ex:複数のオプションを設定する場合(下記のLTrimとJoinはオプション)

(LTrim Join
a
b
c
)

オプション一覧

案の定長いのでたたんでる

オプション 説明
Join [文字] 各行の結合に使用する文字列を改行(\`n)以外に変更する
単にJoinと指定すると、各行がそのまま連結される
[文字] には15文字までの文字列が指定できる
また、[文字]の部分にはエスケープシーケンスが使用できる
セクション内の最後の行もjoinオプションの文字で終了させるには、セクションの閉じ括弧のすぐ上に空白行を入れればいい
ex: 以下の例では、各行をスペースで結合するようにしている
MsgBox, 
(Join `s ;`sは半角スペース
a
b
c
)

結合した結果: a b c
LTrim 各行の行等の半角スペースや、Tab文字を無視する
LTrim0 LTrimの無効
個別では使わないかなというかどういうときに使うの?
RTrim0 行末の末尾の半角スペースやTab文字を無視しないようにする
RTrimはない
C [;]によるコメントを有効にする
あくまで[;]によるコメントのみなので、*/\*....\*/の形式のコメントは使用できない**
各行の最後に書いても、改行して単独で書いても問題ない
Cの代わりにComments、Comment、Commと書いてもいい
` `n、`t などの特殊文字エスケープ文字としてではなく、そのまま出力されるようになる
, カンマ(,)が自動的に[`,]としてエスケープされるのを抑止する
関数の引数の区切りなどとして扱われるようになる
Q(またはQuates) 継続セクションを式で使用する場合で、継続セクション内の引用符で閉じることができるようになる
多分ほとんど使わない
ex: Qオプションがない場合とある場合の例
Var := " ;Qなし
(
テスト
この後の引用符までが文字列として扱われる
)"

Var := " ;Qあり
(Q
テスト
この後の引用符までが文字列として扱われる"
)  ;この括弧の後ろに"をもう一度書くとエラーになる
) 継続節(の先頭)ではなく式として再解釈する
ただしJoinオプションは除く
多分式が長い場合や継続セクションのオプション(Join)が使いたい場合に有用なのかな
説明わかりにくいし例も例でわけわかめ例や説明いいのあったらいいな
ex: [)]の例、この場合括弧をエスケープする必要なく動作するらしく有用みたいよ
どの[)]を示してるのかがわからないんだよね
(x.y)[z]\()  

その他

書いてあったから一応書くけどもあんまりいらないというか別に今読まなくてもとか

  • 一行は最大16383文字までらしい(そんな書かない気がするんだけど)

  • 関数とは別に「#」で始まるプリプロセッサ指令のようなものがある また、このプリプロセッサ指令のようなものは、スクリプトが実行される前の段階で処理されるので、引数に変数を含めることは出来ない

スクリプトデバッグ

基本的なデバッグの方法

方法その1

MsgBoxを利用する

スクリプト要所要所にMsgBox関数を入れて、動作状況や変数の内容を表示させる

例えば、If文の各分岐先にMsgBox関数をいれるなど

ex:要所要所にMsgBox関数を入れたデバッグの方法

変数 "a" の内容によってifで分岐するのだが、ifの中の動作が変数を操作するなど、視覚的でない場合、どっちに分岐したかわからないとか、ifのあとでの変数の値(中身)を見たいとか

if ( a == 1 ) {
    b := 0
} else {
    b := 1
}

方法その2

ListVars,Pauseなどの関数を利用する

ListVarsやPauseなどの関数は、スクリプト中の挿入した所に「ブレークポイント」を作成する

スクリプト上記の2つの関数に遭遇すると、検証のためにすべての変数の現在の内容が表示される
全ての変数が表示されるため、目的の変数のみでいい場合はMsgBox関数を使用するのがよい

再開する準備ができたら、[ファイル]メニューまたは[トレイ]メニューからスクリプトの一時停止を解除する、すると、スクリプトは、次の「ブレークポイント」(存在する場合)に達するまで続く

その他:

これらのデバッグは、アクティブウィンドウが変わってしまうと正常に動作しないようなところでは使用できないので注意が必要である

また、これらのデバックではWinActivate関数の直前など、アクティブなウィンドウがスクリプトに関係しない位置に、これらの「ブレークポイント」を挿入するのが一般的で、こうすれば、スクリプトを再開したときに正常な動作で再開することができる

また、ListLines,KeyHistory,OutputDebug といった関数もデバッグには有用である
誤字や欠落した「グローバル」宣言などの一般的なエラーは、警告を有効にすることで検出できる(デフォルトの状態)

対話型デバッグ

DBGpクライアントを用いた対話型デバッグが可能である
DBGpクライアントを用いてできること

  • ブレイクポイントの設置と撤去(ブレイクポイントに達するとスクリプトの実行は一時停止される)
  • 1行ずつコードをステップ実行することができる(関数やサブルーチン自体、あるいはそれらをまたいでも可)
  • 全て、あるいは特定の変数の検査
  • 実行中のサブルーチンや関数のスタックを表示できる

やり方

対話型デバックをするにはまず対応しているデバッガクライアントを起動し、/ Debugコマンドラインスイッチを使用してスクリプトを起動する

ex: AutoHotkey.exe /Debug[=SERVER:PORT] ...

ex: Server および Port は省略可能で、以下の二つは同じ

  AutoHotkey /Debug "myscript.ahk"  
  AutoHotkey /Debug=localhost:9000 "myscript.ahk"

実行中のスクリプトにデバッガを接続するには、以下のようにメッセージを送信すればいい

ex:実行中のスクリプトをデバッガに接続

ScriptPath := "" ;スクリプトのフルパスを入れる  
DetectHiddenWindows On  
if WinExist("%ScriptPath% ahk_class AutoHotkey")  
    ; オプションの引数:  
    ;   wParam  = the IPv4 address of the debugger client, as a 32-bit integer.  
    ;   lParam  = the port which the debugger client is listening on.  
PostMessage, % DllCall("RegisterWindowMessage", "str", "AHK_ATTACH_DEBUGGER")

その他:
デバッガクライアントが接続されると、"detach" DBGp関数を送信してスクリプトを終了することなく切断されることがある
なおコンパイルしたスクリプトではこの機能は利用できない
コンパイルについては次回のその2で扱っている

スクリプト編その2へ続く

autohotkey2.0勉強中(翻訳)その3~リマップ編~

前→(ホットストリング編)

最終更新日: 2017/12/23

目次

はじめに

最後の方訳すのめんどくさくなってきた

その1のコピペ

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

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

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

リマップ編

リマップとはキーボードのキーをの入力を別のキーの入力にすること(みたいな感)
キーの指定の方法はホットキーと同じようにできる
例えば右Ctrlなら>^

基礎

レジストリ書き換えとは異なるため、AHKの指定スクリプトが動作していないとリマップされない
逆にAHKスクリプトさえ起動していなければ通常のキーとなる
スクリプトの停止を切り替えることによってなんかできるかもね

リマップの仕方

以下のように書けば置換ができる

置換元キー::置換先キー

ex: aキーをbキーに、左Ctrlキーを右Ctrlキーに(適当だから間違ってるかも)

a::b
<^::>^
キーの入れ替え

以下のように書くと二つのキーを入れ替えることになる

a::b
b::a
  • a::B とすると大文字のBが入力される -まあ使わなさそうだけどこんな使い方出来るっていう
  • コンビネーションキー(&)は設定できない
ex: a & c::b は使えない

マウスのリマッピング

なんでこの表作ったんだろうね

マウスのリマッピング用表

名前 どのボタンか
LButton マウスの左ボタン(左クリック)
MButton マウスの真ん中のボタン(中クリック)
RButton マウスの右ボタン(右クリック)
XButton1 マウスの拡張ボタン1
他ボタンマウスのボタンのことで、OSのデフォルトで戻るに割り当てられているもの
XButton2 マウスの拡張ボタン2
他ボタンマウスのボタンのことで、OSのデフォルトで進むに割り当てられているもの
WheelUp ホイールアップ(↑スクロール)
WheelDown ホイールダウン(↓スクロール)
WheelLeft チルト左(横スクロールの←)
WheelRight チルト右(横スクロールの→)

その他便利事項的な

キーの入力の無効化

以下のように書くとキーの入力を無効化できる
これリマップだと思うんだけどねなんかホットキーに書かれてた

キーの指定::Return

ウィンドウ(ソフト)別に設定したいんだけど

  • #IfWinActive等(#IfWinActive/Exist項目)または#ifを使うことで、特定のウィンドウのみに適応できる

まあホットキーの時と一緒で、まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiさんの#IfWinActiveのページ

なんか正常に動作しないんだけど

ロック系キー(CapsLockなどのロックキー、カタカナ/ひらがなキー)のリマップをしたらおかしくなった

日本語配列では、ロック系キーなどをリマップすることはできないというか推奨されてない
なぜなら、AHK内でUnKnownKeyとして扱われることが多く、動作が不安定になる
例えば、カタカナ/ひらがなキーをリマップしたが、関係ないキーを押した際に勝手にWindowsキーが押されるとか(実際にあった)
これにより、ロック系キーのリマップはレジストリを使うのが良い

リマップしたキーが思ったように動作しないだけど(タイトルつけづらい)

a::bと置き換えた場合、^a のキーを押したら ^a としては機能せず、^b として機能するので注意

AltキーにリマップしたのにAltTabが動作しない

Altキーになるようにキーまたはマウスボタンをリマップしたとしても、そのリマップしたキーはAltTabの動作をしないことが多いらしい

回避策として、以下のホットキーを追加することで出来るようになるが、本当のAltキーの方でAlt-Tabを実行する際に正常に動作しない可能性がある
まあ推奨しないけどさ、もしこうするなら本当の方を使わないでリマップの方のみでAlt-Tabをやることをお勧めするよ
(こんな感じのこと書いてあった(随分意訳な気がするけど))
そうしたくないならレジストリで設定するか諦めるのがいいんじゃないかな

*Tab :: Send "{Blind} {Tab}"
自動実行セクションにSendModeが書いてある場合

SendModeが自動実行セクション(最上部に書くスクリプトのこと)で使用されている場合は、全てのリマップに影響するらしい

例えば、SendPlayモードを使用している場合で、リマップではSend {Blind}を使用してリマップしているらしく、SPモードでは、{Blind}を完全にサポートしていない
このため、SendPlayモード(特にControl、Shift、Alt、Win)ではリマッピングが正しく機能しないことがあるので注意
この問題を回避するには、スクリプト内にリマップがあるときにSPを自動実行セクションで使用しないこと
そうしても使いたい場合は、スクリプトの別の場所(自動実行セクション以外)でSPを使用する
また、SendEvent(SE)を使用したホットキーを用いたリマップも可能みたいなことが書いてあった

ホットキー用のコマンドがリマップにも影響する

スクリプトのどこかに以下の関数が書いてある場合はそれのせいかもしれない

Suspend関数あるいは、HotKey関数
(使ったことないからわかんないから書けない)

ex: 一応例↓

Suspend "On"  
Hotkey "*a, off"  
Hotkey "*a up, off"  

リマップの仕組み(応用)

スクリプトが起動されると、各リマップは1組のホットキーに変換されるらしい
たとえば、a :: bのリマップは実際には次の2つのホットキーの組み合わせになっている

*a::
SetKeyDelay -1   ; 置換先キーがマウスボタンの場合、代わりにSetMouseDelayが使用されます
Send "{Blind}{b DownTemp}"  ; DownTempはDownと似ているが、他のSendコマンドではDownしていないように認識されている点で異なるってさ  
return

*a up::
SetKeyDelay -1  ; これらのSetKeyDelaysのいずれかでpress-durationが指定されていない理由については、下記の注を参照してください。
Send "{Blind}{b Up}"
return

説明: (あってるかわかんないけど)

まず最初のホットキー

  1. 何かしらのキーと[a]キーが押されたときに{Blind}が送信される {Blind}は現在の各種修飾キー、Capsキーの状態を保持するコマンドみたいなもので、これにより各種修飾キーの状態が保持されたままになる

  2. この状態で、bを送信するので、例えばCtrlが押されたままならCtrl-bの動作になる

二個目のホットキー

  1. [a]キーが離されたときに再度{Blind}を送信する 多分さっき指定した{Blind}の状態を解除しているんだと思う、(公式ヘルプに何も書いてなかったから再度指定する意味が分からないからこんなところかなと)

  2. さっき下げた[b]キーを上げてもとに戻す

ちなみにSetKeyDelay -1 はキーの送信の速度を遅延なしにしている(他の動作に邪魔されないため)

ただし、上記のホットキーは次の状況により違う動作になる

  1. 置換元キーがLCtrlなどの修飾キーの場合

Send "{Blind} {LAlt DownTemp}"の行がSend "{Blind} {LCtrl Up} {LAlt DownTemp}"に置き換えられる
置換元キーがRCtrlの場合は、{RCtrl up}が使用される以外は同じになる

  1. マウスのボタン(RCtrl :: RButtonなど)にリマップしている場合

SetKeyDelayの代わりにSetMouseDelayが使用される
さらに、上記の一番最初のホットキーは次のように置き換えられ、キーボードのオートリピート機能によるマウスクリックが繰り返し発生することを防ぐようになっている

*RCtrl::
SetMouseDelay -1
if not GetKeyState("RButton") ; マウスの右ボタンはこの時点ではまだ押し下げられていない
    Send "{Blind}{RButton DownTemp}"
return

注:
上記のホットキーでは、SetKeyDelayの2番目のパラメータ(押下時間)が省略されている
これは、{b down}や{b up}のようなダウンまたは、アップ専用のイベントにはプレス時間が適用されないため
ただし、Shift / Ctrl / Alt / Winキーの状態の変更は、a::B ,a::^bなどのリマップに影響を及ぼすので、スクリプトの自動実行セクションを介して適応された押下時間がリマップ全てに影響を及ぼすため、注意してね的な

カスタムコンビネーションキーをリマップに使用したい

カスタムコンビネーションキーを1つのキーに直接リマップすることはできないが、上記のように、リマップはホットキーに変換されるため、それを利用してあたかもそうかのように設定できるみたい

ex: 例えば、a & c :: b というリマップをしたい場合
上記の *a:: を a & c:: に、また、*a up:: をa & c up:: に変更すればいい
どのような動作をしてるかは↑で既に記述したのでそちらを参照

a & c::
SetKeyDelay -1  
Send "{Blind}{b DownTemp}"  
return

*a & c up::
SetKeyDelay -1  
Send "{Blind}{b Up}"
return

次→(autohotkey勉強中その4-1)

simplenoteさんの勧め

Simplenoteさんを個人的に使っていて結構便利かなと思っているので、勝手ながら紹介させてもらう。
Simplenote公式ページ
サイトは英語で書かれているけどもアプリは(ソフトも?)日本語で書かれているので完全に英語だけってわけではないです。
僕は特に簡単なメモ用に使用しています。

Simplenoteさんの特徴

  • 前述したとおりにAndroidiOSもアプリがありパソコンとスマホ間で書いたノートの内容が共有できる
  • パソコンの場合はソフトを入れなくてもWEBアプリでの利用も可能なので手軽
  • アカウントでの紐づけで、ネットワーク環境があり、ログインさえできれば、複数のパソコン間でも共有できて非常に便利
  • ちなみにパソコンのソフトでは、WindowsMacLinuxに対応しています
  • また、有料版、有料オプションなどはなく現状完全無料で使える
  • 使う上で便利な機能がそろっていて使い勝手がとてもいい

機能面の紹介

  • ピン留め
    ピン留めするようにしたノートは上位に表示されるようになりアクセスがしやすくなる
  • Markdownに対応
    Markdown形式に対応しているので、Markdownでメモしたくて複数デバイスで共有したいんだって人には最適ではないかと思います。(ほかのやつあるか知らないからいいのあるかもだけど)
  • Publish機能
    ノートをPublishすると、URLが作られ、そのノートを他人に簡単に見せることができる!
  • リストア(履歴)機能
    ノートを以前の状態に戻したい、間違えてしまって消すのがめんどくさいなどの時にこの機能を使えば以前の状態にノートが戻せるのでとても便利です。
  • タグ付け機能
    各ノートに複数のタグが設定でき、タグで絞り込みをかけることができるので、アクセスがしやすくなっています。
  • ゴミ箱機能
    言わずもがな、消してしまっても復元できる。さらにリストアと組み合わせると消したものを復元してさらに昔の状態に戻せて地味に便利なことも
  • Share機能
    共有して、他のSimplenoteユーザーと共同編集ができる
  • zip形式でダウンロード
    使ってないからわからないけどzip形式でノート全部?がダウンロードできるのかな

Sublime Textの有料版買ってね!!が表示されたら閉じるのをahk2で作ってみた(勉強中)

はじめに

まあ無料で使えるなら無料で使い倒そうという魂胆で使っていますが、
まだ使い始めたばかりなのでそんなにがっつりやってるわけでもなく。
初心者なのでそのうち使いこなしてSublimeさんに恋をしたら有料版買おうかなって思っているので取り合えず邪魔なので消させてもらう。
決して有料版を買わないようにの催促ではないのでお金ある人は買ってあげて(ボソッ

学習中の身のため間違えることが多いので、もし動作しないことや間違い等があったら指摘してくれるとありがたいです。(説明内容含む)、また、正常に動作する保証はありません
間違えたコードは何個かまでは履歴として残して勉強用(戒め)に使ってますので間違えてコピペしてしまうと動作しないぞこのやろってなります。

autohotkeyさんについては検索してもらえれば良い紹介文でもあるかと思います。

取り合えずSublime Textさんの紹介

Sublime Text公式ホームページ
恋に落ちるテキストエディタというキャッチコピーのテキストエディタソフトです。
まだそんな使いこなしてないからがっつり紹介はできないけども高機能でpackageを追加することで色々カスタマイズできるんだよね、そのくせ軽いわ軽いわ。プログラミングの入門とかで使うエディタとしては結構いいんじゃないかな。まあそんなとこ

以下ahk2(autohotkey2)のコード
これ単独では完全に機能しないので別途ソフト起動時に呼び出すものがいります。

改善版

SetTitleMatchMode, 3
    ProcessExist,ids,sublime_text.exe
    countersi := 0
    while(ids <> 0 and countersi < 100){
        ProcessExist,ids,sublime_text.exe
        Sleep, 1000
        If WinExist("This is an unregistered copy ahk_class #32770")
            WinClose
        countersi++
    }
    If (ids <> 0){
        Reload
    } else {
        Return
    }

説明入れると、プロセスが存在する限りwhileループするようにして、その中の最後にカウンターとして変数をインクリメントで一つずつ増加させていって100回ループしたらこのスクリプトを再起動させるようにして正常に起動するように保っている(なんか時間たった時だったかなんかのときにsublimeさん終了されててプロセスないのにスクリプトが終わんなかったから)

追記

5/31 コード大幅に変更、ahkclassだけだとwordかなんかのやつも勝手に閉じられて困ってたからsublimeさんがアクティブだった時だけって思ってたけど完全一致で指定すれば被らないじゃんってことで簡素なのになった
削除要請等あったら消します

ていうかあまり賢くない方法でやってる気が…まあいいか。
Vimに乗り換えたのでもう使ってないのでー。