2008年1月3日

AutoHotKeyでesExt5(未完成)

ずっとやってみたかった物

;esExt5.ahk
;2008/01/03作成
;esExt5のiniを読み込んでメニュー作成
;=AutoHotKeyでesExt5を作ってみた

;=また作る必要のない物を作ってみた

;仕様
;・このスクリプトのIniFileにesExt5.iniのパスを書いておく
;・引数がないとメッセージ出して終了
;・未完成

;問題点
;・フォルダ内にまたフォルダがあった場合おかしくなる
;・[folder]の実装未定
;・オプションの実装未定
;・(まずサブメニュー作らないといけないからいろいろ面倒)

;todo
;・問題点の改善
;・完成させる

#NoTrayIcon

;esExt5.iniの場所
IniFile = C:\Program Files\tool\.S\esExt\esExt5.ini
;DropFile = C:\Program Files\tool\AutoHotkey\scripts\Menu\test.txt
;存在フラグ
ExistFlag = 0
;フォルダフラグ
FolderFlag = 0
Line = 0
Count = 0
X = 0

;引数があった場合
If 0 <> 0
{
DropFile = %1%
}
;引数がなかった場合
else
{
Msgbox, 引数がありませんでした
return
}

;Msgbox, %DropFile%
SplitPath, DropFile, , , Ext
SearchWord = [.%Ext%]
;Msgbox, %SearchWord%
;esExt5.ini読み込み
Loop, Read, %IniFile%
{
Line++
;まだ発見できてない場合
If ExistFlag = 0
{
;[拡張子]のメニューだった場合
IfInString, A_LoopReadLine, %SearchWord%
{
;Msgbox, %A_LoopReadLine%
;存在フラグを立てる
ExistFlag = 1
}
;[all]のメニューだった場合
IfInString, A_LoopReadLine, [all]
{
;Msgbox, %A_LoopReadLine%
;存在フラグを立てる
ExistFlag = 1
}
}
;発見できた場合
else
{
;%endだった場合
IfInString, A_LoopReadLine, `%end
{
;存在フラグを戻す
ExistFlag = 0
;次の行へ
Continue
}
;+だった場合
else IfInString, A_LoopReadLine, +
{
;区切り線挿入
Menu, esExtMenu, Add
;区切り線もカウントされるため+1
Count++
;次の行へ
Continue
}
;サブメニュー化だった場合
else IfInString, A_LoopReadLine, {
{
;サブメニューの名前取得
StringSplit, Folder, A_LoopReadLine, {
;サブメニューフラグを立てる
FolderFlag = 1
;Msgbox, フォルダ開始, %Folder2%
}
else IfInString, A_LoopReadLine, }
{
;サブメニューの元を作成
Menu, esExtMenu, Add, %Folder2%, :%Folder2%
;フォルダフラグを戻す
FolderFlag = 0
;Msgbox, フォルダ終わり
}
;オプションだった場合
else IfInString, A_LoopReadLine, >
{
;Msgbox, オプション
Loop
{
;Msgbox, %Line%
SearchLine := Line - A_Index
FileReadLine, SearchWord, %IniFile%, %SearchLine%
IfNotInString, SearchWord, >
{
;オプションのタブ削除
StringReplace, OptionPath, A_LoopReadLine, %A_Tab%
;パスと名前に分割用
StringReplace, OptionPath, OptionPath, %A_Space%|%A_Space%, `,
;パスと名前に分割
StringSplit, OptionArray, OptionPath, `,
;オプションの元になるアプリのタブ削除
StringReplace, Path, SearchWord, %A_Tab%
;パスと名前に分割用
StringReplace, Path, Path, %A_Space%|%A_Space%, `,
;パスと名前に分割
StringSplit, Array, Path, `,
;パス、名前、オプションパス、オプション名
Msgbox, %Array1%, %Array2%, %OptionArray1%, %OptionArray2%
;Menu, %Array2%, Add, %OptionArray2%, OptionCmd
Break
}
}
}
else
{
;後でフルパスを取得するためにカウント+1
Count++
;名前がない時用
Array2 =
;パスと名前に分割用
StringReplace, Path, A_LoopReadLine, %A_Space%|%A_Space%, `,
;パスと名前に分割
StringSplit, Array, Path, `,
;名前がない時
If Array2 =
{
;アプリの名前で代用
SplitPath, Array1, , , , Array2
;Msgbox, %Array0%, %Array1%, %Array2%
}
;フォルダ内の時
If FolderFlag = 1
{
Menu, %Folder2%, Add, %Array2%, FolderCmd
;オプションのタブ削除
StringReplace, Array1, Array1, %A_Tab%
X++
;パス確保
FolderArray%X% := Array1
;名前確保
FolderNameArray%X% := Array2
Continue
}
;それ以外
Menu, esExtMenu, Add, %Array2%, MenuCmd
;パス確保
PathArray%Count% := Array1
;Msgbox, %Array1%, %Array2%, %Count%
}
}
}
Menu, esExtMenu, Show
return

;メニュー用コマンド
MenuCmd:
;テスト用
OptionCmd:
;パス確保
Name := PathArray%A_ThisMenuItemPos%
;関連づけが.ahkの場合
IfInString, Name, .ahk
{
Run, %A_AhkPath% "%Name%" "%DropFile%"
}
;その他
else
{
Run, %Name% "%DropFile%"
}
return

;フォルダ用コマンド
FolderCmd:
;Msgbox, a:%X%, %A_ThisMenuItem%
;パス確保用番号取得ループ
Loop, %X%
{
;検索する名前作成
SearchArray := FolderNameArray%A_Index%
;Msgbox, b:%SearchArray%
;
IfInString, SearchArray, %A_ThisMenuItem%
{
;パスのある番号取得
Pos = %A_Index%
break
}
}
;Msgbox, c:%Pos%
;パス確保
Name := FolderArray%Pos%
;関連づけが.ahkの場合
IfInString, Name, .ahk
{
Run, %A_AhkPath% "%Name%" "%DropFile%"
}
;その他
else
{
Run, %Name% "%DropFile%"
}
return

サブメニュー先に作っておかないといけないからいろいろ面倒
自分にはまだ早かった