AutoHotkey_Lで、Operaの起動を便利にしてみた。
以前書いたOpera用AHKスクリプトの「起動時に最終セッションを退避」に「セッションをブックマークに変換」を合わせてみた。あと細かいミスも修正。
このスクリプトを実行すると、Operaの最終(前回終了時の)セッションのタイトル一覧が表示され、セッションを退避するか問われる。YESにすると、セッションを現在日時で変名し、空のOperaが起動する。また、退避する場合、自動でセッションの内容をブックマークに変換することも可能。
「前回、大量にタブ開いたまま終了したから起動がおっくうだなー」とか「最終セッション全部は必要ないなー」という場合に便利。自動変換に興味ない旧runOpera.ahkユーザーも、文字化けがなくなったので更新する価値はある、ような。
使うには、以下のコードを適当に保存し、「SessionsPath」と「BookmarksPath」を埋めれば、最低限OK。初期設定ではセッションは自動変換されないし、bookmarks.adrへの書き込みも行われないので、安全を確認してから好みの設定にするよろし。
書くべきパスはopera:about参照のこと。SessionsPathはファイル名いらないので注意。
パスの確認を最初に行うように変更。失敗しても実害ないし、そもパス間違えるやつなんていないだろHAHAHA、と思っていたら、試験で存在しないパス入れたままなのを忘れてry
; --------- --------- --------- --------- ---------
; RunOpera.ahk
; --------- --------- --------- --------- ---------
#WinActivateForce
SessionsPath := "" ; セッションフォルダのフルパスを指定。末尾は"\"。
BookmarksPath := "" ; bookmarks.adrのフルパスを指定。
AutoConvSW := 0 ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
ACMoveSW := 1 ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。
HisReadSW := 0 ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
WriteTrgSW := 0 ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。
; --------- --------- --------- --------- ---------
IfNotExist, %SessionsPath%
{
MsgBox, 48, セッションフォルダが見つかりません。`n%SessionsPath%
Exit
}
If (1 == WriteTrgSW) {
IfNotExist, %BookmarksPath%
{
MsgBox, 48, bookmarks.adrが見つかりません。`n%BookmarksPath%
Exit
}
}
IfExist, %SessionsPath%autosave.win
GoSub, SessionAnalyze
Run, C:\Program Files\Opera\Opera\opera.exe, , , OpPid
OpTitle := "パスワード"
WinWait, %OpTitle% ahk_pid %OpPid%, , 60
If(0 != ErrorLevel)
Exit
WinActivate
Sleep, 500
Exit
; --------- --------- --------- --------- ---------
SessionAnalyze:
FileRead, OSession, *P65001 *t %SessionsPath%autosave.win
If (0 != ErrorLevel) {
MsgBox, 48, Sessionの読み込みに失敗しました。`n%SessionsPath%autosave.win
Return
}
Idx := 0
WinTitles := ""
Loop {
Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
If (0 == Idx)
Break
WinNum := $1
HisNum := $2 - 1
HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
WinTitles := WinTitles " " HisTitle "`n"
}
If("" == WinTitles)
Return
MsgBox, 259, 30秒後に通常起動します。, 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, 30
IfMsgBox, Yes
{
TimeNum := A_Now
BackupName := TimeNum ".win"
Loop {
FileMove, %SessionsPath%autosave.win, %SessionsPath%%BackupName%
If(0 == ErrorLevel)
Break
BackupName := TimeNum "_" A_Index ".win"
}
If (1 == AutoConvSW)
GoSub, SessionConvert
}
IfMsgBox, Cancel
Exit
Return
; --------- --------- --------- --------- ---------
SessionConvert:
If (1 == WriteTrgSW)
FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%
CmdLine := SessionsPath BackupName
SplitPath, CmdLine, , , , SessionName
Result := "#FOLDER`n NAME=[Session] " SessionName "`n`n"
ResultBuf := Result
Idx := 0
Loop {
Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
If (0 == Idx)
Break
WinNum := $1
HisNum := $2 - 1
HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
If (0 == HisReadSW) { ; タブ履歴を無視する場合
Result .= "#URL`n NAME=" HisTitle "`n URL=" HisUrl "`n`n"
Continue
}
StringLen, HisNumLen, HisNum
If (0 == HisNum) {
Result .= "#URL`n NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n URL=" HisUrl "`n`n"
Continue
}
Result .= "#FOLDER`n NAME=" HisTitle "`n`n#URL`n NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n URL=" HisUrl "`n`n"
Loop, %HisNum% {
HisNum--
HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
Result .= "#URL`n NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n URL=" HisUrl "`n`n"
}
Result .= "-`n`n"
}
If (ResultBuf == Result)
Return
Result .= "-`n`n"
If (1 == WriteTrgSW) {
FileAppend, %Result%, %BookmarksPath%, CP65001
} Else {
FileDelete, %CmdLine%.txt
FileAppend, %Result%, %CmdLine%.txt, CP65001
}
If (1 == ACMoveSW) {
IfNotExist, %SessionsPath%AutoConv\
FileCreateDir, %SessionsPath%AutoConv\
FileMove, %CmdLine%, %SessionsPath%AutoConv\%BackupName%
If (0 != ErrorLevel)
MsgBox, 48, 変換済みセッションの移動に失敗しました。`n%SessionsPath%AutoConv\
}
Return
; --------- --------- --------- --------- ---------
GetHisTitle(ByRef OSession, WinNum, HisNum, Idx){
RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
Return $1
}
GetHisUrl(ByRef OSession, WinNum, HisNum, Idx){
RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
Return $1
}
ZeroSupply(Num, Digit){
StringLen, NumLen, Num
LoopNum := Digit - NumLen
Loop, %LoopNum%
Num := "0" Num
Return, Num
}
余談だが、SnakeCaseもPascalCaseもCamelCaseもしっくりこなくて困る。いやPascalCaseでおおむね問題ないのだが、ifとかloopとかreturnみたいな単語が大文字だと違和感が。慣れか。
.jpg)
