foobar2000
土日はちょこちょことfoobar2000のカスタマイズしていた
微妙な変更ばかりだったので前のメモに画像の更新とWSHのスクリプト内容を書き加わえる形をとったが
完全に泥沼にはまり、正直よくわからなくなってきたので新しく書き直すことにした
あの忌々しいイヤホンスパイラルの日々を思い出しちゃうよぅお兄ちゃん…
Panel Stack Splitter ├WSH Panel Mod ├Graphical Browser └EsPlaylist Panel Stack Splitter $puts(ww,150) $puts(hh,20) $puts(col1,70-70-70-255) $puts(col2,10-10-10-255) $puts(grop,horizontal nonlinear) $gradientrect(0,0,$get(ww),$get(hh),$get(col1),$get(col2),$get(grop)) $gradientrect($sub(%_width%,$get(ww)),0,$get(ww),$get(hh),$get(col2),$get(col1),$get(grop)) $puts(ww,300) $puts(hh,10) $puts(col1,50-50-50-255) $puts(col2,0-0-0-255) $gradientrect(0,$sub(%_height%,$get(hh)),$get(ww),$get(hh),$get(col1),$get(col2),$get(grop)) $gradientrect($sub(%_width%,$get(ww)),$sub(%_height%,$get(hh)),$get(ww),$get(hh),$get(col2),$get(col1),$get(grop)) //ResizeButton $puts(bw,10) $puts(bh,5) $puts(bx,$div($sub(%_width%,$get(bw)),2)) $puts(by,140) $puts(size1w,%_width%) $puts(size1h,600) $puts(size2w,%_width%) $puts(size2h,150) $puts(fcol,100-100-100) $puts(Mfcol,255-255-255) $font(,5,) $ifequal(%Resize%,1, $textbutton($get(bx),$get(by),$get(bw),$get(bh),▼,▼,WINDOWSIZE:$get(size1w):$get(size1h);SETGLOBAL:Resize:0,fontcolor:$get(fcol),fontcolor:$get(Mfcol)), $textbutton($get(bx),$get(by),$get(bw),$get(bh),▲,▲,WINDOWSIZE:$get(size2w):$get(size2h);SETGLOBAL:Resize:1,fontcolor:$get(fcol),fontcolor:$get(Mfcol))) WSH シークバー兼TF function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); } var g_titlefmt = fb.TitleFormat("[%album%] - [%title%] - [%artist%]"); var g_font = gdi.Font("MeiryoKe_UIGothic", 12, 0); var g_drag = 0; function on_paint(gr){ var ww = window.Width, wh = window.Height, wx = 0, wy = 0; var col = 0, i = 0, txt = g_titlefmt.Eval(), grad = fb.PlaybackTime/fb.PlaybackLength; while (i < ww) { col = (i<=grad*ww) ? RGB(10,10,10) : RGB(5,5,5); gr.FillSolidRect(wx+i,0,4,wh,col); i += 5; } gr.DrawRect(wx,-1,ww,wh,1.0,RGB(10,10,10)); gr.DrawString(txt,g_font,RGB(255,255,255),0,0,window.Width-3,wh,0x11005000); } function on_mouse_lbtn_down(x,y){ g_drag = 1; } function on_mouse_lbtn_up(x,y){ on_mouse_move(x,y); g_drag = 0; } function on_mouse_move(x,y){ var ww = window.Width, wx = 0; var v = (x-wx-3)/ww; if *1 fb.PlaybackTime = fb.PlaybackLength * v; } function on_mouse_wheel(delta){ fb.PlaybackTime += delta; } function on_playback_new_track(info){ window.Repaint(); } function on_playback_stop(){ window.Repaint(); } function on_playback_seek(time){ window.Repaint(); } function on_playback_time(time){ window.Repaint(); } Graphical Browser //NowPlaying $if(%gb_isplaying%, $if($draw_image(0,15,90,90,$replace(%path%,%filename_ext%,)*.jpg,255,), $draw_image(0,105,90,90,$replace(%path%,%filename_ext%,)*.jpg,255,,6) $draw_image(0,105,90,90,.\overlay.png,255), $draw_image(0,15,90,90,.\cover.jpg,255,) $draw_image(0,83,90,90,.\cover.jpg,255,,6) $draw_image(0,94,90,90,.\overlay.png,255)), // Focus $if(%gb_focused%, $if($draw_image(5,20,80,80,$replace(%path%,%filename_ext%,)*.jpg,255,), $draw_image(5,100,80,80,$replace(%path%,%filename_ext%,)*.jpg,255,,6) $draw_image(5,100,80,80,.\overlay.png,255), $draw_image(5,16,80,80,.\cover.jpg,255,) $draw_image(5,76,80,80,.\cover.jpg,255,,6) $draw_image(5,86,80,80,.\overlay.png,255)), // Mouse over $if(%gb_mouse_over%, $if($draw_image(5,20,80,80,$replace(%path%,%filename_ext%,)*.jpg,255,), $draw_image(5,100,80,80,$replace(%path%,%filename_ext%,)*.jpg,255,,6) $draw_image(5,100,80,80,.\overlay.png,255), $draw_image(5,16,80,80,.\cover.jpg,255,) $draw_image(5,76,80,80,.\cover.jpg,255,,6) $draw_image(5,86,80,80,.\overlay.png,255)), // Default $if($draw_image(10,5,70,70,$replace(%path%,%filename_ext%,)*.jpg,255), $draw_image(10,75,70,70,$replace(%path%,%filename_ext%,)*.jpg,255,,6) $draw_image(10,75,70,70,.\overlay.png,255), $draw_image(10,5,70,70,.\cover.jpg,255,) $draw_image(10,58,70,70,.\cover.jpg,255,,6) $draw_image(10,66,70,70,.\overlay.png,255) ))))
*1:g_drag) && (wx<=x) && (x<=wx+ww
Param.ahk for fenrir
前々から書こうと思ってはやめ思ってはやめを繰り返していたがなんとなく書く事にした
fenrirで引数を渡すためのもの
fenrir上でパスを選択すれば""で囲んでCUIに渡す
相対パスは引数を渡すターゲットの親フォルダを基準とする
引数ではパスを""で囲んでいればワイルドカードが使用できる
複数ヒットすれば半角スペースで区切り列挙
"ワイルドカードを含むPath;" で、複数ヒットした場合に列挙せずに、ヒットしたパスをひとつずつ代入して処理
".\hoge\*.txt;" ".\hoge\*.ini;"
のように2つ以上の場合は、これらを一つのパスとみなして、ヒットしたパスをひとつずつ代入して処理
2つ以上書く場合は半角スペースで区切り列挙しないとErrorを吐く
"wildcard;" でヒットした一つのパスを表す
/ahkmax | /ahkmin | /ahkhide でAutohotkeyのRunオプションMax | Min | Hide
区切り文字を指定してコマンドを区切れる デフォルトは |
IME_GetConverting()はIME.ahkのものを使用
#SingleInstance Force #NoEnv SetBatchLines, -1 ListLines, Off ;Option x = 695 y = 515 Weight = 524 Height = 20 ParseString = | ;OptionExit Count = %0% Loop % Count ? Count : 1 ParamCui( %A_Index%) ExitApp #If WinActive("ahk_class AutoHotkeyGUI") && !IME_GetConverting() Enter:: RunwithParam() Tab:: WinActivate, ahk_class fenrirMainWindow Del:: EditDelString("ahk_class AutoHotkeyGUI", "Edit1") #If WinActive("ahk_class fenrirMainWindow") && !IME_GetConverting() Enter:: EditPasteSelectedPath("ahk_class AutoHotkeyGUI", "Edit1") Tab:: WinActivate, ahk_class AutoHotkeyGUI Del:: EditDelString("ahk_class AutoHotkeyGUI", "Edit1") #If WinExist("ahk_class fenrirListWindow") && !IME_GetConverting() ;fenrirのフォルダ、親フォルダ展開キーを指定 Left:: Right:: Send, {%A_ThisHotkey%} ControlGet, List, List,, SysListView321, ahk_class fenrirListWindow Return ParamCui( Path) { global x, y, Weight, Height Gui, Margin, -1 0, 0 Gui, +AlwaysOnTop +ToolWindow Gui, Add, Edit, W%Weight% H%Height%, % Path ? """" Path """" A_Space : Gui, Show, X%x% Y%y% W%Weight% H%Height% Pause, On Gui, Destroy Return GuiClose: GuiEscape: ExitApp } RunwithParam() { global ParseString WinGetText, Text, A Text := RTrim( Text, "`r`n") Loop, Parse, Text, % ParseString { Param := Trim( A_LoopField) Target := RegExMatch( Param, "(?<=^\x22)[^\x22]*?(?=\x22)|(?<=^)[^\s\x22]*?(?=\s|$)", $) ? $ : Param SetWorkingDir, % RegExReplace( Target, "\\[^\\]*$") If !Target || RegExMatch( Target, "[*?]") && FileExist( RegExReplace( $, "\\[^\\]*$")) ErrorCode := """illegal Characters in Target""" While RegExMatch( Param, "(?<=/ahk)max(?=\s|$)|(?<=/ahk)min(?=\s|$)|(?<=/ahk)hide(?=\s|$)", $) { IfGreaterOrEqual, A_Index, 2, { ErrorMessage := RegExReplace( ErrorMessage ? ErrorMessage : Text, "/ahk" $, "<$0>") ErrorCode := ErrorCode ? ErrorCode A_Space "&&" A_Space """/ahkCommand""" : """/ahkCommand""" } Option := $ Param := RegExReplace( Param, "/ahk" $ "\s*?") } While RegExMatch( Param, "(?<=\x22)[^\x22]*?[*?][^\x22]*?(?=;\x22)", $, Pos1 ? Pos1 : 1) { If !FileExist( RegExReplace( $, "\\[^\\]*$")) { Pos1 := InStr( Param, """" $ ";" """") + StrLen( """" $ ";" """") Continue } If ErrorCheck { If RegExMatch( Param, "\x22wildcard;\x22\s\x22" RegExReplace( $, "([.*?+\[\]{}|()^$\\])", "\$1") ";\x22") Loop, % $, 1, 0 FilePaths .= """" A_LoopFileFullPath """" "," Else { ErrorMessage := RegExReplace( ErrorMessage ? ErrorMessage : Text, "\x22" RegExReplace( $, "([.*?+\[\]{}|()^$\\])", "\$1") ";\x22", "<$0>") ErrorCode := ErrorCode ? ErrorCode A_Space "&&" A_Space """wildcard;Command""" : """wildcard;Command""" } StringReplace, Param, Param, % A_Space """" $ ";" """" } Else { Loop, % $, 1, 0 FilePaths .= """" A_LoopFileFullPath """" "," Pos1 := InStr( Param, """" $ ";" """") + StrLen("""widlcard;""") StringReplace, Param, Param, % """" $ ";" """", "wildcard;" ErrorCheck := True } } If ErrorCode { MsgBox, 0x40000, ParamError, % ErrorCode "`r`n" ErrorMessage Return } Else { While RegExMatch( Param, "(?<=\x22)[^\x22]*?[*?][^\x22]*?(?=\x22)", $, Pos2 ? Pos2 : 1) { If !FileExist( RegExReplace( $, "\\[^\\]*$")) { Pos2 := InStr( Param, """" $ """") + StrLen( """" $ """") Continue } Loop, % $, 1, 0 TempFilePaths .= """" A_LoopFileFullPath """" A_Space Pos2 := InStr( Param, """" $ """") + StrLen( TempFilePath) StringReplace, Param, Param, % """" $ """", % RTrim( TempFilePaths) TempFilePaths := } If FilePaths { FilePaths := RTrim( FilePaths, ",") Loop, Parse, FilePaths, CSV Run, % RegExReplace( Param, "\x22wildcard;\x22", A_LoopField), % WorkingDir, % Option "UseErrorLevel" FilePaths := } Else Run, % Param, % WorkingDir, % Option "UseErrorLevel" If ErrorLevel { MsgBox, 0x40000, TargetError, % """NotFound""" "`r`n" Target Return } } } Pause, Off Return } EditPasteSelectedPath( class, edit) { global list ControlGet, SelectedCol, List, Selected, SysListView321, ahk_class fenrirListWindow SelectedPath := Instr( SelectedCol, ":") ? SelectedCol : RegExReplace( List, "(.*?)`n.*", "$1") SelectedCol Control, EditPaste, % SelectedPath ? """" RTrim( SelectedPath, "\") """" A_Space : , % edit, % class Return } EditDelString( class, edit) { WinGetText, String, % class String := RegExReplace( String, "\x22[^\x22]*?\x22\s*$|\s*[^\s\x22]*?\s*$") ControlSetText, % edit,, % class Control, EditPaste, % String, % edit, % class Return } IME_GetConverting(WinTitle="A",ConvCls="",CandCls="") { ;IME毎の 入力窓/候補窓Class一覧 ("|" 区切りで適当に足してけばOK) ConvCls .= (ConvCls ? "|" : "") ;--- 入力窓 --- . "ATOK\d+CompStr" ; ATOK系 . "|imejpstcnv\d+" ; MS-IME系 . "|WXGIMEConv" ; WXG . "|SKKIME\d+\.*\d+UCompStr" ; SKKIME Unicode . "|MSCTFIME Composition" ; Google日本語入力 CandCls .= (CandCls ? "|" : "") ;--- 候補窓 --- . "ATOK\d+Cand" ; ATOK系 . "|imejpstCandList\d+|imejpstcand\d+" ; MS-IME 2002(8.1)XP付属 . "|mscandui\d+\.candidate" ; MS Office IME-2007 . "|WXGIMECand" ; WXG . "|SKKIME\d+\.*\d+UCand" ; SKKIME Unicode CandGCls := "GoogleJapaneseInputCandidateWindow" ;Google日本語入力 VarSetCapacity(stGTI, 48, 0) NumPut(48, stGTI, 0, "UInt") ; DWORD cbSize; hwndFocus := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) ? NumGet(stGTI,12,"UInt") : WinExist(WinTitle) WinGet, pid, PID,% "ahk_id " hwndFocus tmm:=A_TitleMatchMode SetTitleMatchMode, RegEx ret := WinExist("ahk_class " . CandCls . " ahk_pid " pid) ? 2 : WinExist("ahk_class " . CandGCls ) ? 2 : WinExist("ahk_class " . ConvCls . " ahk_pid " pid) ? 1 : 0 SetTitleMatchMode, %tmm% return ret }
Renamer.ahk
いろいろ付け足していったらごちゃごちゃになったので見なおして再投稿
大抵のリネームソフトについてるF2でフォーカスが変わる機能は便利なんだけど
それすらも面倒になったため、ファイル名後にドットを打てばファイル名のみを
ドットを打った後に拡張子を書けば拡張子だけを変えるようなモノを書いた
これだけだと寂しいので以下を追加、それらのメモ
?は、元のファイル名から拡張子を除いた文字列と同じ位置の文字
*は、元のファイル名から拡張子を除いた文字列
\は、Edit3に記入した数字からの連番。それ以降すべてのファイルに処理
:a:は、元のファイル名から拡張子を除いた文字列の、位置aの文字。$はファイル名の最後を表す
:a,b:は、元のファイル名から拡張子を除いた文字列の、位置aから位置bまで抜き出した文字列。$はファイル名の最後を表す
で囲むとその部分を大文字化 | |||
で囲むとその部分を小文字化 |
チェックボックスのAllはそれ以降全てのファイルに同じ処理をさせる
変更する前にリストボックスで確認できるようにした
単体起動とD&Dをできるようにした
次と前のファイルへ移動できるようにボタンを追加
昇順で並び替えるソートボタンを追加
サブフォルダを読み込むチェックボックスを追加
;; foobar.ini ; . → foobar.ini ; baz. → baz.ini ; .txt → foobar.txt ; * → foobar ; baz*. → bazfoobar.ini ; ???baz. → foobaz.ini ; baz????. → bazbar.ini ; |?|??. → Foo.ini ; :1,$-3:. → foo.ini ;<foo,bar><bar,baz>. → bazbaz.ini ;|*|baz<foo,bar><bar,baz>. → BAZBAZbaz.ini ; foo.ini bar.txt ; \ 001 → 001 002 ; \. 002 → 002.ini 003.txt ; \.ini 001 → 001.ini 002.ini ; ??\. 001 → fo001.ini ba002.txt ; *\. 001 → foo001.ini bar002.txt ; baz\. 001 → baz001.ini baz002.txt ;<foo|bar,baz\> 001 → baz001.ini baz002.txt ; All ; foo.ini bar.txt baz.log ; ?. →f.ini b.txt b.log ; |?|?. →Fo.ini Ba.txt Ba.log ; |?|:2,$: →Foo.ini Bar.txt Baz.log #NoEnv SetBatchLines, -1 ListLines, Off ;Option Poschr = ? Allchr = * Serialchr = \ Upper = | | Lower = || || StrMid = : : RegEx = < > SubDir = 1 ListBox = 1 GuiWeight = 500 ListHeight = 150 NextButton = 0 BackButton = 0 SortButton = 0 ;OptionExit Poschr := RegExReplace( Poschr, "([.*?+\[\]{}|()^$\\])", "\$1") Allchr := RegExReplace( Allchr, "([.*?+\[\]{}|()^$\\])", "\$1") Serialchr := RegExReplace( Serialchr, "([.*?+\[\]{}|()^$\\])", "\$1") RegExMatch( RegExReplace( Upper, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", Upper) RegExMatch( RegExReplace( Lower, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", Lower) RegExMatch( RegExReplace( StrMid, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", StrMid) RegExMatch( RegExReplace( RegEx, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", RegEx) FileCount += %0% Renamer( PathSet(FileCount)) PathSet(FileCount){ Loop % FileCount FilePaths .= %A_Index% "|" Return FilePaths } Renamer( FilePaths){ global SubDir, All, Serialchr, ListBox, GuiWeight, ListHeight, NextButton, BackButton, SortButton, FileCount static Drop, TempFilePaths, SubCount, Gui, InputStr, SerialNumber Sort, FilePaths, D`| U FileCount -= ErrorLevel + SubCount TempFilePaths := FilePaths FilePaths := RegExReplace( FilePaths, "\|$") If SubDir { SubCount := "0" Loop, Parse, FilePaths, `| Loop, %A_loopField%\*.*, 1, 1 { SubCount++ FilePaths .= "|" A_LoopFileFullPath } FileCount += SubCount } If Drop { Gui := True Pause, Off Exit } FileNumber := "1" Goto, Gui Gui: Gui := False Loop, Parse, FilePaths, `| FilePath := A_LoopField Until A_Index = FileNumber SplitPath, FilePath, FileName, Folder, Extension, NameNoExt Gui, Destroy Gui, Add, Edit, Disabled, %FileName% Gui, Add, Edit, w%GuiWeight% vInputStr, % RenameList ? InputStr : FileName Gui, Add, Edit, w50 vSerialNumber, % StartSerialNumber ? StartSerialNumber : "001" Gui, Add, Button, x200 y60 Default, OK Gui, Add, Button, x250 y60, Cancel IfEqual, NextButton, 1, Gui, Add, Button, x330 y60, &Next IfEqual, BackButton, 1, Gui, Add, Button, x390 y60, &Back IfEqual, SortButton, 1, Gui, Add, Button, x450 y60, &Sort Gui, Add, Checkbox, % All ? "x90 y65 vAll Checked " : "x90 y65 vAll", &All Gui, Add, Checkbox, % SubDir ? "gSubDir Checked" : "gSubDir", &SubDir IfEqual, ListBox, 1, Gui, Add, ListBox, x10 w%GuiWeight% h%ListHeight%, % RenameList ? RenameList : FilePaths Gui, Show,, % FilePath ? FileNumber "/" FileCount : "Renamer.ahk" VarSetCapacity( RenameList, 0) Pause, On SetFormat, FloatFast, % "0" StrLen( SerialNumber) ".0" Goto, % Gui ? "Gui" : OldInputStr = InputStr && StartSerialNumber = SerialNumber && All = States ? "FileMove" : ListBox ? "List" : "FileMove" GuiDropFiles: Drop := FilePaths ? True : False Gui, Submit, Nohide FileCount += A_EventInfo FilePaths := TempFilePaths RegExReplace( A_GuiEvent, "`n", "|") "|" Renamer( FilePaths) ButtonOK: Gui, Submit, Pause, Off Return List: OldInputStr := InputStr StartFileNumber := FileNumber StartSerialNumber := SerialNumber SerialNumber -= 1 Rename := ConvertStr( InputStr, Extension, NameNoExt) If RegExMatch( Rename, Serialchr) { All := True Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) } RenameList = %FilePath% → %Rename% If All { FileNumber++ Loop, Parse, FilePaths, `| If A_Index = % FileNumber { FileNumber++ SplitPath, A_LoopField, FileName,, Extension, NameNoExt Rename := ConvertStr( InputStr, Extension, NameNoExt) Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) RenameList = %RenameList%|%A_LoopField% → %Rename% } } FileNumber := StartFileNumber States := All Goto, Gui FileMove: SerialNumber -= 1 Rename := ConvertStr( InputStr, Extension, NameNoExt) If RegExMatch( Rename, Serialchr) { All := True Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) } FileMoveDir, %FilePath%, %Folder%\%Rename%, R FileMove, %FilePath%, %Folder%\%Rename% StringReplace, FilePaths, FilePaths, %FilePath%, %Folder%\%Rename%, All If All { FileNumber++ Loop, Parse, FilePaths, `| If A_Index = % FileNumber { FileNumber++ SplitPath, A_LoopField,, Folder, Extension, NameNoExt Rename := ConvertStr( InputStr, Extension, NameNoExt) Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) FileMoveDir, %A_LoopField%, %Folder%\%Rename%, R FileMove, %A_LoopField%, %Folder%\%Rename% StringReplace, FilePaths, FilePaths, %A_LoopField%, %Folder%\%Rename%, All } } If FileNumber >= % FileCount ExitApp FileNumber++ Goto, Gui ButtonCancel: ExitApp GuiEscape: ExitApp GuiClose: ExitApp SubDir: Gui, Destroy SubDir := !SubDir If SubDir { SubCount := "0" Loop, Parse, FilePaths, `| Loop, %A_loopField%\*.*, 1, 1 { SubCount++ FilePaths .= "|" A_LoopFileFullPath } FileCount += SubCount } If !SubDir { FilePaths := TempFilePaths FileCount -= SubCount SubCount := "0" } FilePaths := RegExReplace( FilePaths, "\|$") Gui := True Pause, Off Return ButtonNext: If FileNumber < % FileCount FileNumber++ Gui := True Pause, Off Return ButtonBack: If FileNumber > 1 FileNumber-- Gui := True Pause, Off Return ButtonSort: Sort, FilePaths, D`| Gui := True Pause, Off Return } ConvertStr( InputStr, Extension, NameNoExt){ global Poschr, Allchr, Upper1, Upper2, Lower1, Lower2, StrMid1, StrMid2, RegEx1, RegEx2 RegExReplace( RegExReplace( InputStr, StrMid1 ".*?" StrMid2,"", MidField), Upper1 ".*?" Upper2 "|" Lower1 ".*?" Lower2,"", ULField) OutputStr := RegExReplace( RegExReplace( RegExReplace( RegExReplace( InputStr, RegEx1 ".*?" RegEx2,"", RegExField) , "^\.(.*)$", NameNoExt . "." . "$1"), AllChr, NameNoExt), "^(.*)\.$", "$1" . "." . Extension) Loop % MidField { MidOption := RegExReplace( RegExReplace( OutputStr, ".*?" StrMid1 "(.*?)" StrMid2 ".*", "$1","", 1), "\$", StrLen( NameNoExt)) pos1 := RegExMatch( MidOption, "^(\d*?)\s*?-\s*?(\d*)\,?", pos1) ? pos11 - pos12 : RegExReplace( MidOption, "\,.*$") pos2 := RegExMatch( MidOption, "\,?(\d*?)\s*?-\s*?(\d*)$", pos2) ? pos21 - pos22 : RegExReplace( MidOption, "^.*\,") StringMid, MidStr, NameNoExt, %pos1%, % pos2 - pos1 + 1 OutputStr := RegExReplace( OutputStr, StrMid1 ".*?" StrMid2, MidStr,"", 1) } Loop, Parse, OutputStr, % RegExReplace( Poschr, "\\([.*?+\[\]{}|()^$\\])", "`$1") { RegExReplace( A_loopField, Upper1 "|" Upper2 "|" Lower1 "|" Lower2,"", ExStrCount) ExStr += ExStrCount StringMid, PoschrStr, NameNoExt, % RegExMatch( OutputStr, PosChr) - ExStr, 1 OutputStr := RegExReplace( OutputStr, PosChr, PoschrStr, "", 1) } Loop % RegExField { RegExMatch( InputStr, RegEx1 "(?P.*?)" RegEx2, RegEx) InputStr := RegExReplace( InputStr, RegEx1 "(.*?)" RegEx2,"","", 1) If !RegExMatch( RegExParam, "^\s*?(.*?[^\\]?)\,\s*?(.*?)\,\s*?(.*?)\,\s*?(.*?)$", Param) && !RegExMatch( RegExParam, "^\s*?(.*?[^\\]?)\,\s*?(.*?)\,\s*?(.*?)$", Param) && !RegExMatch( RegExParam, "^\s*?(.*?[^\\]?)\,\s*?(.*?)$", Param) RegExMatch( RegExParam, "^\s*?(.*)\s*?$", Param) OutPutStr := OutputStr ? RegExReplace( OutputStr, param1, param2,"", param3 ? param3 : "-1", param4 ? param4 : "1") : RegExReplace( NameNoExt "." Extension, param1, param2,"", param3 ? param3 : "-1", param4 ? param4 : "1") } Loop % ULField OutputStr := RegExReplace( RegExReplace( OutputStr, Lower1 "(.*?)" Lower2, "$L{1}", "", 1), Upper1 "(.*?)" Upper2, "$U{1}", "", 1) Return OutputStr }
PPx + Autohotkey
PPcでファイル操作をするとコメントにその操作を書いてくれるAutohotkeyスクリプト
といっても常駐ホットキーなんだけど
現在はPPcのコマンドで R, K, \K, U, M, \M, C, \C, \D, ファイルオペレーションのDeleteのみ
Deleteはファイルが削除されればコメントを消す
DllCallなんぞわかりません
三項演算子を最近少し覚え、嬉しくなったので無理やりにでもところどころに使用中
IME_GetConverting()はIME.ahkのものを使用
#NoEnv #SingleInstance Force #MaxThreadsPerHotkey 20 SetBatchLines, -1 ListLines, Off UnpackFirstWaitTime = 10 ;Unpackで最初の展開ダイアログが表示されるまで待つ時間 DialogWaitTime = 2 ;U, C, M, \Dコマンドでダイアログが表示されるまで待つ時間 EnvMult, OperationWaitTime, 1000 GroupAdd, PPc, ahk_class PaperPlaneCUIW GroupAdd, PPc, ahk_class PaperPlaneCombo Return #If WinActive("File Operation Options ahk_class PPfileW") && !IME_GetConverting() Enter:: FileOperation("") #If #If WinActive("名前変更 ahk_class #32770") && Control("Edit1|Edit2|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Rename") #If #if WinActive("ディレクトリ作成 ahk_class #32770") && Control("Edit1|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Makedir") #If #if WinActive("ファイル作成 ahk_class #32770") && Control("Edit1|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Makefile") #If #if WinActive("Unpack ahk_class #32770") && Control("Edit1|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Unpack") #If #If WinActive("Execute ahk_class #32770") && Control("Edit1|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Execute") #If #If WinActive("Move ahk_class #32770") && Control("Edit1|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Move") #If #If WinActive("Copy ahk_class #32770") && Control("Edit1|Button1|Button2|Button3") && !IME_GetConverting() Enter:: FileOperation("Copy") #If #If WinActive("エントリ削除") && Control("Static1|Static2|Button1|Button2") && !IME_GetConverting() Enter:: FileOperation("Delete") #If Control(ControlList){ WinGet, CtrlList, ControlList StringReplace, CtrlList, CtrlList, `n, |, 1 Return InStr(CtrlList, ControlList) } GetCurrentDir(Option){ ;%1を渡すとPPcカレントディレクトリ、%2を渡すと反対窓PPcのカレントディレクトリを返す WinGetTitle, Title, ahk_group PPc If Option = `%2 { WinGetTitle, OppTitle, ahk_group PPc,, %Title% If !OppTitle { ControlGetText, OppText, PaperPlaneCUIW1, ahk_group PPc IfEqual, Title, %OppText%, ControlGetText, OppText, PaperPlaneCUIW2, ahk_group PPc } } Return % Option = `%1? RegExReplace( Title, "PPC\[\D\]") : OppText ? RegExReplace( OppText, "PPC\[\D\]") : RegExReplace( OppTitle, "PPC\[\D\]") } ConvertPath(InputPath, CurrentDir){ ;引数が絶対パスならそのまま、文字列なら相対パス等に変えて ;そのパスから存在するフォルダまで遡りそのパスを返す InputPath := RegExReplace( InputPath, "\\$") OutputPath := FileExist( InputPath) ? InputPath : InputPath = "#0:" ? A_Desktop : InputPath = "-#5" ? A_MyDocuments : InStr( InputPath, `%TEMP`%) ? RegExReplace( InputPath, "i )" `%TEMP`%, A_TEMP) : FileExist( CurrentDir "\" InputPath) ? CurrentDir "\" InputPath : "" While !OutputPath { SplitPath, InputPath,, InputPath OutputPath := !InputPath ? CurrentDir : InStr( InputPath, ":") && FileExist( InputPath) ? InputPath : FileExist( CurrentDir "\" InputPath) ? CurrentDir "\" InputPath : "" } Return OutputPath } FileOperation(Label){ global OperationWaitTime, CloseWaitTime, UnpackFirstWaitTime, DialogWaitTime WinGet, ID,, A WinGetText, Text, ahk_id %ID% Loop, Parse, text, `r`n { OperationArray0++ OperationArray%A_Index% := A_LoopField } CurrentDir := GetCurrentdir("%1") Goto, % Label ? Label : OperationArray1 = "Act&ion: Move" ? "Move" : OperationArray1 = "Act&ion: Copy" ? "Copy" : "Delete" Return Rename: Send, {Enter} WinWaitClose, ahk_id %ID%,, %CloseWaitTime% If ErrorLevel || OperationArray0 = 9 Return FileRead, OldComment, %CurrentDir%\00_INDEX.txt Comment := FileExist( CurrentDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Comment .= RegExReplace( OldComment, """" RegExReplace( OperationArray1, "([.*?+\[\]{}|()^$\\])", "\$1") """" "\t(.*)`r`n") . """" OperationArray3 """" A_Tab "*Rename`r`n" FileDelete, %CurrentDir%\00_INDEX.txt FileAppend, %Comment%, %CurrentDir%\00_INDEX.txt Return Makedir: Send, {Enter} WinWaitClose, ahk_id %ID%,, %CloseWaitTime% If ErrorLevel || OperationArray0 = 7 Return Comment := FileExist( CurrentDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Comment .= """" . OperationArray1 . """" . A_Tab . "*Makedir`r`n" FileAppend, %Comment%, %CurrentDir%\00_INDEX.txt Return MakeFile: Send, {Enter} WinWaitClose, ahk_id %ID%,, %CloseWaitTime% If ErrorLevel || OperationArray0 = 7 Return Comment := FileExist( CurrentDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Comment .= """" . OperationArray1 . """" . A_Tab . "*MakeFile`r`n" FileAppend, %Comment%, %CurrentDir%\00_INDEX.txt Return Unpack: DestDir := ConvertPath( OperationArray1, CurrentDir) Loop, %DestDir%\*, 1 FileList .= """" A_LoopFileName """" Gosub, ExitWait Comment := FileExist( DestDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Loop, %DestDir%\*, 1 IfNotInString, FileList, "%A_LoopFileName%" Comment .= """" . A_LoopFileName . """" . A_Tab . "*Unpack`r`n" FileAppend, %Comment%, %DestDir%\00_INDEX.txt Return Execute: DestDir := ConvertPath( OperationArray1, CurrentDir) If DestDir = %CurrentDir% { SplitPath, CurrentDir,, DestDir ControlSetText, Edit1, %DestDir%, A } Loop, %DestDir%\*, 1 FileList .= """" A_LoopFileName """" Gosub, ExitWait Comment := FileExist( DestDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Loop, %DestDir%\*, 1 IfNotInString, FileList, "%A_LoopFileName%" Comment .= """" . A_LoopFileName . """" . A_Tab . "*Execute`r`n" FileAppend, %Comment%, %DestDir%\00_INDEX.txt Return Move: DestDir := Label ? ConvertPath( OperationArray1, CurrentDir) : ConvertPath( OperationArray33, CurrentDir) IfEqual, DestDir, %CurrentDir%, Return Loop, %CurrentDir%\*, 1 FileList .= A_LoopFileName "`r`n" Gosub, % Label ? "ExitWait" : "OperationExitWait" FileRead, SourceComment, %CurrentDir%\00_INDEX.txt Comment := FileExist( DestDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Loop, Parse, FileList, `r`n If A_LoopField && FileExist( DestDir . "\" . A_LoopField) && !FileExist( CurrentDir "\" A_LoopField) { Comment .= """" A_LoopField """" A_Tab "*Move`r`n" SourceComment := RegExReplace( SourceComment, """" RegExReplace( A_LoopField, "([.*?+\[\]{}|()^$\\])", "\$1") """" "\t(.*)`r`n") } FileDelete, %CurrentDir%\00_INDEX.txt If SourceComment && SourceComment != """" . "00_INDEX.txt" . """" . A_Tab . "CommentFile`r`n" FileAppend, %SourceComment%, %CurrentDir%\00_INDEX.txt FileAppend, %Comment%, %DestDir%\00_INDEX.txt Return Copy: DestDir := Label ? ConvertPath( OperationArray1, CurrentDir) : ConvertPath( OperationArray33, CurrentDir) IfEqual, DestDir, %CurrentDir%, Return Loop, %DestDir%\*, 1 FileList .= """" A_LoopFileName """" "`r`n" Gosub, % Label ? "ExitWait" : "OperationExitWait" Comment := FileExist( DestDir "\00_INDEX.txt") ? "" : """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" Loop, %DestDir%\*, 1 IfNotInString, FileList, "%A_LoopFileName%" { FileGetSize, Copysize, %DestDir%\%A_LoopFileName% FileGetSize, SourceSize, %CurrentDir%\%A_LoopFileName% If Copysize = %Sourcesize% Comment .= """" A_LoopFileName """" A_Tab "*Copy`r`n" } FileAppend, %Comment%, %DestDir%\00_INDEX.txt Return Delete: Gosub, % Label ? "ExitWait" : "OperationExitWait" Loop, Read, %CurrentDir%\00_INDEX.txt Comment .= FileExist( CurrentDir "\" RegExReplace( A_LoopReadLine, """" "(.*)" """" "\t(.*)", "$1")) ? A_LoopReadLine "`r`n" : "" FileDelete, %CurrentDir%\00_INDEX.txt If Comment && Comment != """" "00_INDEX.txt" """" A_Tab "CommentFile`r`n" FileAppend, %Comment%, %CurrentDir%\00_INDEX.txt Return OperationExitWait: Send, {Enter} WinGetTitle, Title, ahk_id %ID% IfEqual, Title, File Operation Options, Exit WinWaitClose, ahk_id %ID% Return ExitWait: Send, {Enter} First := True Loop { WinWait, ahk_class #32770,, % Label = "Unpack" && First ? UnpackFirstWaitTime : DialogWaitTime, %ExTitle% IfEqual, ErrorLevel, 1, Return If % Label = "Unpack" || Label = "Execute" ? Control("Button1|Button2|SysListView321|SysHeader321|Static1|Static2|Static3|Static4|msctls_progress321|Static5") || Control("Static1|Static2|Static3|Static4|Static5|Static6|Static7|msctls_progress321|Button1") : Control("SysAnimate321|Static1|Static2|msctls_progress321|Static3|Button1") { WinWaitClose IfNotEqual, Label, Unpack, Return First := False } Else { WinGetTitle, Title ExTitle .= Title A_Space } } Return }
PaperPlanexUI
たいした設定は全くしてないが
PaperPlanexUIのホットキーメモ
&LEFT %K"@^LEFT &RIGHT %K"@^RIGHT ^\TAB %K"@\F6 ^TAB %K"@F6 ^V_H46 %K"@\J ^V_H50 %K"CUSTOMIZE \Q *cd %0..\Qonoha %:Qonoha.exe %#FCD \V *cd %0..\MassiGra %:MassiGra.exe %#FCD \S *cd %0..\Scan %:Scan.bat %#FCD T *cd %0..\Mery %:Mery.exe %#FCD V *script %0\Script\ppv.js
USBメモリにいれていても動作するように心がけてるため
絶対パスではなく相対パスでパスを渡している
書庫内のファイルパスを渡すために*cdでカレントディレクトリを指定している
ppv.jsはここの連動ビューの on/off トグルをおこなう。syncview.js:の9行目を
PPx.Execute('*cd %0 %:%Oi '+ppvname+' /r /bootid:'+useppv+' %FDC');
に変更して使用
foobar2000
以前foobar2000の外見を変更したときは
マウス操作のことを考えてEsPlayListを上下に並べた
しかし殆ど使っていないことに気づいた。つーか邪魔
やっぱり必要だった
いつのまにかEsPlayListのβ版が更新されていたし
いい機会なので再び外見をものすごくちょびっと変えた
そのメモ
WSHはここを参考にした
あんまよくわかってない
EsPlayListを一つ消去
カラムを全て中央揃えにし、トラックナンバー消去、アルバムアートを表示
RowHeightを14にした
Vertical splitter
├WSH Panel Mod
├EsPlaylist…(1)
├Channel spectrum panel
└EsPlaylist…(2)
WSH シークバー兼タイトルフォーマット function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); } var g_titlefmt = fb.TitleFormat("[%album%] - [%title%] - [%artist%]"); var g_font = gdi.Font("MeiryoKe_UIGothic", 12, 0); var g_drag = 0; var hofset = 10; var wh = 12; function on_paint(gr){ var vofset = (window.Height-wh)/2; var length = fb.PlaybackLength; var txt = g_titlefmt.Eval(); var ww = window.Width - 25; var grad = 0; var i = 0; if (length > 0) { grad = fb.PlaybackTime/fb.PlaybackLength; } while (i < ww+1) { var col = (grad<=0) ? RGB(0,0,0) : (i<=grad*ww) ? RGB(40,40,40) : RGB(0,0,0); gr.FillSolidRect(hofset+1+i,vofset,4,wh,col); i = i +5; } gr.DrawString(txt,g_font,RGB(255,255,255),0,vofset,ww,wh,0x11005000); } function on_mouse_lbtn_down(x,y){ g_drag = 1; } function on_mouse_lbtn_up(x,y){ on_mouse_move(x,y); g_drag = 0; } function on_mouse_move(x,y){ var ww = window.Width - 25; if(g_drag){ var v = (x-hofset)/ww; v = (v<0) ? 0 : (v<1) ? v : 1; fb.PlaybackTime = fb.PlaybackLength * v; } } function on_mouse_wheel(delta){ fb.PlaybackTime = fb.PlaybackTime + delta; } function on_playback_new_track(info){ window.Repaint(); } function on_playback_stop(){ window.Repaint(); } function on_playback_seek(time){ window.Repaint(); } function on_playback_time(time){ window.Repaint(); }