【AutoHotkey】数字選択式の簡易ランチャーを作る2
前回の続きです。
前回作った簡易ランチャーは、実行ファイルのアドレスをリストにして、それを数字で選ぶ形式にしていました。
私自身はそれでも特に不満を覚えていませんでしたが、しかしアドレスでの表示はわかりやすいとは言いがたい感じがします。表示するのはアプリケーション名にして、数字を選ぶとアプリケーション名に紐付けられたアドレスによって実行する、という形にした方がいいかもしれません。
まず改良前のコードをおさらいします。解説は前回の記事をご参照ください。
Ins::Return ;Insertを無効化
Ins & A:: ;Insertキー+Aで実行
Description := "アプリケーションを起動します。`n"
Array := ["C:\Program Files\Git\git-cmd.exe"
,"C:\Program Files\Inkscape\bin\inkscape.exe"
,"C:\Program Files\nexusfont\nexusfont.exe"
,"C:\Program Files\Dropbox\Client\Dropbox.exe"
,"Notepad.exe"]
Address := SelectText(Array,Description)
Run, %Address%
Return
SelectText(Array,Description){
text := ""
count := 0
For index, element in Array
{
text := text . A_Index . ":" . element . "`n"
count += 1 ;この部分は「count := A_Index」でも良いです
}
height := count * 18 + 170
Loop {
InputBox, num,,%Description%番号を選択してください。`n`n%text%,,500,%height%
If ErrorLevel <> 0
Return
If (num>0&&num<=count)
Break
}
Return Array[num]
}
表示名とアドレスの二つのデータを持たせるには、配列Arrayを二次元配列にすれば良いでしょう。(連想配列でも良いですが、今回はデータが単純なものなので見た目も処理も簡単な二次元配列にします。)
;変数Arrayを二次元配列にする
Array := [["Git CMD","C:\Program Files\Git\git-cmd.exe"]
,["Inkscape","C:\Program Files\Inkscape\bin\inkscape.exe"]
,["NexusFont","C:\Program Files\nexusfont\nexusfont.exe"]
,["Dropboxの同期を開始","C:\Program Files\Dropbox\Client\Dropbox.exe"]
,["メモ帳","Notepad.exe"]]
こうすると、配列の中身が配列ということになります。例えばArray[1]には配列["Git CMD","C:\Program Files\Git\git-cmd.exe"]が入っており、Array[1][2]の中身は「C:\Program Files\Git\git-cmd.exe」になります。
さて、次は関数SelectTextに改良が必要です。SelectTextはSelectTextで他の用途に使うので、今回の用途のためのものとして新たに関数SelectTitleを作ることにします。テキストそのものではなくタイトルを選択するという意味合いです。
ひとまずホットキー部分についてArrayと関数の変更を反映しましょう。
Ins::Return ;Insertを無効化
Ins & A:: ;Insertキー+Aで実行
Description := "アプリケーションを起動します。`n"
Array := [["Git CMD","C:\Program Files\Git\git-cmd.exe"]
,["Inkscape","C:\Program Files\Inkscape\bin\inkscape.exe"]
,["NexusFont","C:\Program Files\nexusfont\nexusfont.exe"]
,["Dropboxの同期を開始","C:\Program Files\Dropbox\Client\Dropbox.exe"]
,["メモ帳","Notepad.exe"]]
Address := SelectTitle(Array,Description) ;呼び出す関数をSelectTextからSelectTitleに変更
Run, %Address%
Return
関数SelectTitleを作るために必要なことはごく簡単で、SelectTextをコピーして関数名を変えたら、ダイアログボックスに表示する値がArray[n][1]、アプリケーションの起動のためにRunコマンドに渡す値がArray[n][2]になるようにちょっと書き足せばよいだけです。
SelectTitle(Array,Description){
text := ""
count := 0
For index, element in Array
{
text := text . A_Index . ":" . element[1] . "`n" ;elementに[1]をつける
count += 1
}
height := count * 18 + 170
Loop {
InputBox, num,,%Description%番号を選択してください。`n`n%text%,,500,%height%
If ErrorLevel <> 0
Return
If (num>0&&num<=count)
Break
}
Return Array[num][2] ;Array[num]に[2]をつける
}
変わっているのは上から6行目と下から2行目の2箇所だけです。簡単ですね。
自分で説明を書き添えるなどして好きなように名付けることで、例えば「名前だけ見ても何のためのアプリケーションだったか思い出せない」という事態も回避できるでしょう。(私はフリーウェアを色々インストールしていてそういうことが割とよく起こります。)
おまけですが、前回「日時のフォーマットも複数パターン登録しておいて、前に書いた関数と合わせて呼び出せるようにしていたり」と書きました。具体的には以下のような形です。(今回作ったSelectTitleではなく前回のSelectTextを使ったものです。)
Ins & D::
text := "日時情報を挿入します。`n"
Array := ["yyyy/MM/dd HH:mm"
,"yyyy/MM/dd"
,"HH:mm"
,"yyyy-MM-dd"
,"yyyy_MM_dd"
,"yyyy年M月d日"
,"yyyy年M月d日H時m分"
,"yyyy/MM/dd HH:mm:ss"]
var := SelectText(Array,text)
InsertDate(var)
Return
InsertDate(format) {
FormatTime,TimeString,,%format%
InsertText(TimeString)
}
InsertText(Content) {
cb_bk = %ClipboardAll%
Clipboard = %Content%
Send, ^v
Sleep, 200
Clipboard = %cb_bk%
}
候補を一覧して、その中から選んで文字列を取得する、というのは色々使い途がありそうです。