AutoHotkeyを使ったスクリプティング

  • Windowsの世界では[AutoHotkeyを使ったスクリプティング]が、[ソフトウェア的なキーボード沼]の一種として存在する。
  • Windows用のテンキー付き日本語キーボード〔REALFORCE/日本語 30g 静音 フルNキー〕にこそ、不要不急の余計なキー〔アサイン可能な予備ボタン〕がたくさん付いているので、[AutoHotkeyを使ったスクリプティング]で遊べる余地が大きい。
  • AutoHotkeyを使ったキーマッピングの変更/キーへの独自アサインメントの一例。
  • ■[無変換]は、[マウス左クリック]。
  • ■[無変換+Space]は、[マウスによる選択範囲をクリップボードに読み込み、そのワードでGoogle検索]。
  • ■[Caps]は[c]にしたから、[Ctrl+Caps]=[Ctrl+c]。
  • ■[Ctrl+Tab]は、[すべてを選択+貼り付け]。
  • ■[Ctrl+Back Space]は、[ブラウザーバック]。
  • ■[Shift+Ctrl+Back Space]は、[ブラウザーフォワード]。
  • ■[Windowsロゴボタン+w]は、[WZ EDITOR起動]。
  • ■[Windowsロゴボタン+s]は、[サクラエディタ起動]。
  • ■[Windowsロゴボタン+s〔二度押し〕]は、[ファイルAをサクラエディタで開く]。
  • ■[Windowsロゴボタン+s〔長押し〕]は、[ファイルBをサクラエディタで開く]。
  • ■[Scroll Lock]は、[クリップボードを使った、正規表現による文字置換〔AutoHotkey V2.1のみ〕]。
  • そういう機能を、[AutoHotkey.ahk]というテキストファイルの中に、スクリプトとして書き込んでいく。
  • こうしてキーボード操作だけで作業が完結する範囲が増えることによって、マウス操作が減るので効率的。
  • こういう工夫の世界が面白いので、しょっちゅう[AutoHotkey.ahk]を書き換えている。これがキーボード沼。

以下のコードを[AutoHotkey.ahk]というファイル名にして、[C:\Users%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup]に置いておくことで、毎度、Windowsを立ち上げるごとに[AutoHotkey.ahk]を実効するようにしておく。

;■<a href="https://www.onlinemictest.com/ja/keyboard-test/" target="_blank" rel="nofollow">キーボードテスト – あなたのキーボードをテストしましょう</a><br>
;●●●[AHK Quick Convertor V2]を使ってコードをコンバートしてある
;■<a href="https://github.com/mmikeww/AHK-v2-script-converter?tab=readme-ov-file" target="_blank" rel="nofollow">GitHub - mmikeww/AHK-v2-script-converter: AHK v1 -> v2 script converter</a><br>


;全角/半角|vkF3 または vkF4
;変換|vk1C
;無変換|vk1D
;カタカナ/ひらがな/ローマ字|vkF2
;windows|#
;Alt|!
;Ctrl|^
;Shift|+
;左のモディファイアキーを使用(NT系専用)|<
;右のモディファイアキーを使用(NT系専用)|>

;●●●Windowsキー + w キーを同時押ししてWZ Editor 10を起動する
#UseHook                 ;UseHookをOnにした状態で使用
#w::
{
key := "w"
ErrorLevel := !KeyWait(key, "T0.3")
If(ErrorLevel){          ;長押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\note-archive.html")
	ErrorLevel := !KeyWait(key)
	return
	}
ErrorLevel := !KeyWait(key, "D, T0.2")
If(!ErrorLevel){        ;2度押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\bookmarkstoday.html")
	ErrorLevel := !KeyWait(key)
	return
}else{                      ;短押しした場合
	Run("C:\Program Files\WZ EDITOR 10\wzeditor.exe")
	ErrorLevel := !KeyWait(key)
	return
	}
}


;●●●Windowsキー + s キーを同時押ししてサクラエディターを起動する
#UseHook                 ;UseHookをOnにした状態で使用
#s::
{
key := "s"
ErrorLevel := !KeyWait(key, "T0.3")
If(ErrorLevel){          ;長押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\note-archive.html")
	ErrorLevel := !KeyWait(key)
	return
	}
ErrorLevel := !KeyWait(key, "D, T0.2")
If(!ErrorLevel){        ;2度押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe C:\Users\" A_UserName "\Documents\bookmarkstoday.html")
	ErrorLevel := !KeyWait(key)
	return
}else{                      ;短押しした場合
	Run("C:\Program Files (x86)\sakura\sakura.exe")
	ErrorLevel := !KeyWait(key)
	return
	}
}


^Tab::
{
    if (KeyWait("c", "D T0.5") = 0)  ; cキーが0.5秒以内に押されないのを待つ
    {
        ; cキーが押された場合
        Send "^a"  ; すべてを選択
        Send "^v"  ; クリップボードの内容を貼り付ける
        Send "{Enter}"  ; [Enter]
    }
    else
    {
        ; cキーが押されなかった場合
        Send "^a"  ; すべてを選択
        Send "^v"  ; クリップボードの内容を貼り付ける
    }
}


;●●●[Shift]+[Tab]で全選択貼り付け
+Tab::
{
        Send "^a"  ; すべてを選択
        Send "^v"  ; クリップボードの内容を貼り付ける
}


;●●●[Alt]+[無変換vk1D]でハイライト箇所のワードでGoogle検索
!vk1D::
{
    Send("^c")
    Sleep(450)
    ClipboardText := A_Clipboard
    if (ClipboardText != "")
    {
        Run("https://www.google.com/search?q=" ClipboardText)
    }
return
}


;●●●[無変換vk1D]+[Space]でハイライト箇所のワードでGoogle検索
vk1D & Space::
{
    Send("^c")
    Sleep(450)
    ClipboardText := A_Clipboard
    if (ClipboardText != "")
    {
        Run("https://www.google.com/search?q=" ClipboardText)
    }
return
}


vk1D::
{
    MouseClick("left", , , , , "down")
    KeyWait("vk1D")
    MouseClick("left", , , , , "up")
return
}


;●●●[Ctrl]+[Back Space]で[ブラウザ戻る]
^Backspace::
{
Send("{Browser_Back}")
return
}


;●●●[Shift]+[Ctrl]+[Back Space]で[ブラウザ進む]
+^Backspace::
{
Send("{Browser_Forward}")
return
}


;●●●ScrollLock 音声リーダー[音声および動画ファイルの自動文字起こし]の余計な空白などを除去し整える
;●●●http://www7a.biglobe.ne.jp/~khh/ss/ss012.html
;●●●http://ahkwiki.net/RegEx
ScrollLock::
{
A_Clipboard := ""
Send("^a")
Send("^x")
Errorlevel := !ClipWait(1)
if (ErrorLevel != 0)
{
return
}
a01 := A_Clipboard
a01 := RegExReplace(a01, "([!-~]) +([^ -~\r\n\t])", "$1$2")	;([!-~])=半角
a01 := RegExReplace(a01, "([^ -~\r\n\t]) +([!-~])", "$1$2")	;([^ -~\r\n\t])=全角
a01 := RegExReplace(a01, "([^ -~\r\n\t]) +([^ -~\r\n\t])", "$1$2")
a01 := RegExReplace(a01, "〜", "~")
a01 := RegExReplace(a01, "。 +", "。")
a01 := RegExReplace(a01, "\(", "(")
a01 := RegExReplace(a01, "\)", ")")
a01 := RegExReplace(a01, "\[", "[")
a01 := RegExReplace(a01, "\]", "]")
a01 := RegExReplace(a01, "( +|)([」)〉》〕】}]’”〟])", "$2")
a01 := RegExReplace(a01, "([」)〉》〕】}]’”〟])( +|)", "$1")
a01 := RegExReplace(a01, "( +|)([「(〈《〔【{[‘“〝])", "$2")
a01 := RegExReplace(a01, "([「(〈《〔【{[‘“〝])( +|)", "$1")
a01 := RegExReplace(a01, "((.*?))", "〔$1〕")
a01 := RegExReplace(a01, "「(.*?)」", "[$1]")
a01 := RegExReplace(a01, "([^ -~\r\n\t])\.", "$1。")
a01 := RegExReplace(a01, "( +|):", ":")
a01 := RegExReplace(a01, ":( +|)", ":")
a01 := RegExReplace(a01, "( +|):", ":")
a01 := RegExReplace(a01, ":( +|)", ":")
a01 := RegExReplace(a01, "\!", "! ")
a01 := RegExReplace(a01, "\?", "? ")
a01 := RegExReplace(a01, "。", "。`r`n")
a01 := RegExReplace(a01, "(\r\n)+。", "。")
a01 := RegExReplace(a01, "(\r\n)+。", "。")
a01 := RegExReplace(a01, "(\r\n)+\.", "。")
a01 := RegExReplace(a01, "(\r\n)+\.", "。")
a01 := RegExReplace(a01, "!", "! ")
a01 := RegExReplace(a01, "?", "? ")
a01 := RegExReplace(a01, "! +", "! ")
a01 := RegExReplace(a01, "? +", "? ")
a01 := RegExReplace(a01, "! ", "! `r`n")
a01 := RegExReplace(a01, "? ", "? `r`n")
a01 := RegExReplace(a01, "\. +", ". `r`n")
a01 := RegExReplace(a01, "(\r\n)+", "`r`n")
a01 := RegExReplace(a01, "(\r\n) +", "$1")
a01 := RegExReplace(a01, "([!-~])。", "$1.")
a01 := RegExReplace(a01, "? (\r\n)", "、")
a01 := RegExReplace(a01, "名刺", "名詞")
a01 := RegExReplace(a01, "現停止|限定し", "限定詞")
a01 := RegExReplace(a01, "大抵", "たいてい")
a01 := RegExReplace(a01, "([ぁ-ん])伴([わいうえおっ])", "$1ともな$2")
a01 := RegExReplace(a01, "オークの", "多くの")
a01 := RegExReplace(a01, "([ぁ-ん])関([し])", "$1かん$2")
a01 := RegExReplace(a01, "([ぁ-ん])持([たちつてとっ])", "$1も$2")
a01 := RegExReplace(a01, "([ぁ-ん])呼([ばびぶべぼ])", "$1よ$2")
a01 := RegExReplace(a01, "([ぁ-ん])時([一-龠〃々〆〇])", "$1▼じ▲$2")	;【1】待避
a01 := RegExReplace(a01, "([ぁ-ん])時", "$1とき")	;【2】置換
a01 := RegExReplace(a01, "([ぁ-ん])▼じ▲([一-龠〃々〆〇])", "$1時$2")	;【3】待避回収
a01 := RegExReplace(a01, "([ぁ-ん])際([一-龠〃々〆〇])", "$1▼さい▲$2")	;【1】待避
a01 := RegExReplace(a01, "([ぁ-ん])際", "$1さい")	;【2】置換
a01 := RegExReplace(a01, "([ぁ-ん])▼さい▲([一-龠〃々〆〇])", "$1際$2")	;【3】待避回収
a01 := RegExReplace(a01, "文系", "文型")	;特殊な語句間違い
A_Clipboard := a01
Send("^v")
Send("^a")
Send("^c")
Errorlevel := !ClipWait(1)
if (ErrorLevel != 0)
{
return
}
}


;●●●PrintScreen LaTeXでコンパイルする
PrintScreen::
{
Send("{Alt down}{Ctrl down}{,}{Ctrl up}{Alt up}")
return
}


;●●●vk1C 変換キー=クリップボードを毎日がエブリデイファイルに追記する
vk1C::
{
Send("{Ctrl down}{Alt down}{t}{Alt up}{Ctrl up}")
Sleep(1800)
Send("{R}")
Sleep(200)
Send ("{Ctrl down}{PgDn}{Ctrl up}{Home}")
Sleep(200)
Send ("{Enter}")
Sleep(200)
Send ("●●●")
Sleep(200)
Send ("{Enter}")
Sleep(200)
Send ("{Ctrl down}{PgDn}{Ctrl up}{End}")
Sleep(200)
Send ("{Enter}")
Sleep(200)
Send ("{F2}")
}


;●●●Pauseキー=クリップボードを毎日がエブリデイファイルに追記する
Pause::
{
Send("{Ctrl down}{Alt down}{t}{Alt up}{Ctrl up}")
Sleep(1800)
Send("{R}")
Sleep(200)
Send ("{Ctrl down}{PgDn}{Ctrl up}{Home}")
Sleep(200)
Send ("{Enter}")
Sleep(200)
Send ("●●●")
Sleep(200)
Send ("{Enter}")
Sleep(200)
Send ("{Ctrl down}{PgDn}{Ctrl up}{End}")
Sleep(200)
Send ("{Enter}")
Sleep(200)
Send ("{F2}")
}


;●●●vkF2 ひらがな/カタカナキー=ドラッグしてハイライトされた文字列を引用する
vkF2::
{
Send("{Ctrl down}{.}{Ctrl up}")
Sleep(450)
Send("{Q}{Q}")
Sleep(450)
Send("{Ctrl down}{a}{c}{Ctrl up}")
Sleep(800)
Send("{Enter}")
Sleep(800)
Send("{Enter}")
return
}


;●●●AppsKeyの押し方で動作を変える。
;■<a href="https://pouhon.net/ahk-keywait/2848/" target="_blank" rel="nofollow">[AutoHotKey]1つのキーで3つの機能!長押しや2度押しに機能を割り当てる</a><br>
;■<a href="https://ameblo.jp/hinatahugu29/entry-12842214165.html" target="_blank" rel="nofollow">【AutoHotKey】今のキーボードに合わせたカスタマイズに向けて【情報収集】 | ふぐのようす</a><br>
#UseHook                 ;UseHookをOnにした状態で使用
AppsKey::
{
key := "AppsKey"
ErrorLevel := !KeyWait(key, "T0.3")
If(ErrorLevel){          ;長押しした場合:MIFES
    Run('C:\Program Files\MIFES11\MIW.exe')
    ErrorLevel := !KeyWait(key)
    return
                    }
ErrorLevel := !KeyWait(key, "D, T0.2")
If(!ErrorLevel){         ;2度押しした場合
    Send("{Ctrl down}{.}{Ctrl up}")    ; Firefox ShortcutKey2U
    Sleep(500)                                  ; 待て
    Send("{G}{N}")                             ; ShortcutKey2URLに登
    ErrorLevel := !KeyWait(key)
    return
}else{                     ;短押しした場合
    Send("{Ctrl down}{.}{Ctrl up}")    ; Firefox ShortcutKey2U
    Sleep(500)                                  ; 待て
    Send("{G}{G}")                             ; ShortcutKey2URLに登
    Sleep(500)                                  ; 待て
    Send("{Ctrl down}{a}{c}{Ctrl up}{Enter}")
    ErrorLevel := !KeyWait(key)
    return
       }
}

;●●●
^Up::
{
MouseMove(0, -10, 0, "R")
return
}

;●●●
^!Up::
{
MouseMove(0, -50, 0, "R")
return
}

;●●●
^Down::
{
MouseMove(0, 10, 0, "R")
return
}

;●●●
^!Down::
{
MouseMove(0, 50, 0, "R")
return
}

;●●●
^Left::
{
MouseMove(-10, 0, 0, "R")
return
}

;●●●
^!Left::
{
MouseMove(-50, 0, 0, "R")
return
}

;●●●
^Right::
{
MouseMove(10, 0, 0, "R")
return
}

;●●●
^!Right::
{
MouseMove(50, 0, 0, "R")
return
}

動画編集ソフトとAutoHotkey

  • AutoHotkey.ahkのショートカットをスタートアップに登録しておき、Windows起動時にAutoHotkey.ahkを実行するので、ふだんは意識することなく、キーマッピング変更後の環境で、毎日PCが使える。
  • ただし、本当のキーボード沼は、DaVinci Resolve Speed Editorの導入かもしれない。
  • DaVinci Resolveでは、Pythonスクリプトを使えば、カット編集の自動化やバッチ処理が可能になるようである。
  • DaVinci Resolveの制御をFFmpegで行なうこともできるようだ。
  • なお、PerplexityにAutoHotkeyのスクリプティングを依頼すると、V2.1を指定しても、V1.0のスクリプトを返してくるので、[AHK-v2-script-converter|GitHubにある]で置換する必要がある。
  • Google検索でヒットする[AutoHotkeyのスクリプト例]は、ほぼすべてがV1.0のスクリプト。
  • [AHK-v2-script-converter]は必須だし、V2.1の細かい仕様をPerplexityなどに調べさせるのも必須。
  • 長いマニュアルを読まなくても済むだけ、Perplexityでラクをさせてもらっている。
  • Windowsの世界は、ユーザが多いだけに、いろいろと細かいところが発達している。
  • 機械学習モデルを走らせる場合、CPUよりもGPUが働くようだ。
  • ローカルで機械学習モデルを走らせることが、今後は増えていくことだろう。
  • このとき、macOS環境よりも、Windows環境やLinux環境のほうが、グラフィックカードを取り替えて、演算能力を増強しやすい。
  • その一方で、写真・動画・印刷・出版の世界では、macOS機が事実上の標準であるらしく、色彩に関係する仕事に携わるには、macOS機がないと困るようだ。
  • 写真・動画の色彩を正確に調整するには、[Mac mini+EIZOのカラーマネジメントモニター]が必要かもしれない。
  • 多くの人が、本当にやりたいことを自由にできるようになるためには、Windows機とmacOS機を両方とも買わなければならないのが、現状だろうと思う。
  • スクリプト言語によるDaVinci Resolveのカット編集は可能か?