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
}

BattleLine Conquest

1年くらい前にBattleLineをプレイし、弓兵の可愛さにDVDROMも購入したのですが
プレイしすぎてすぐに飽きてしまった
久々に公式を覗いてみたらコンクエストなるもののβが公開されてた
これはやるしかない

戦う女の子

あっ…あんたのことなんて…〜冷酷な瞳に秘められし想い〜

魔法筋肉少女隊


ただいまデッキ調整中
と言っても一番上のみ、他はなんとなく組んだだけで使用してない
無印BattleLineから女性ユニットのみでデッキを組む事をメインに置いている
ハビドの弓兵がいなくて泣いた
しかしエレメンタリストが使いやすくなっていて歓喜
おにゃのこの良いかほりが漂うー

Renamer.ahk

いろいろ付け足していったらごちゃごちゃになったので見なおして再投稿


大抵のリネームソフトについてるF2でフォーカスが変わる機能は便利なんだけど
それすらも面倒になったため、ファイル名後にドットを打てばファイル名のみを
ドットを打った後に拡張子を書けば拡張子だけを変えるようなモノを書いた
これだけだと寂しいので以下を追加、それらのメモ


?は、元のファイル名から拡張子を除いた文字列と同じ位置の文字
*は、元のファイル名から拡張子を除いた文字列
\は、Edit3に記入した数字からの連番。それ以降すべてのファイルに処理
:a:は、元のファイル名から拡張子を除いた文字列の、位置aの文字。$はファイル名の最後を表す
:a,b:は、元のファイル名から拡張子を除いた文字列の、位置aから位置bまで抜き出した文字列。$はファイル名の最後を表す

で囲むとその部分を大文字化
で囲むとその部分を小文字化

Autohotkey正規表現置換
チェックボックスの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();
}