AutoHotKey_Lで、Sz7内のジャンプ移動してみた。

 axpathlist2.spiはとても便利なんだが、リストが長大になると探索が大変で、フォルダ分けされてればビューアのフォルダ移動機能で楽できるのになーと思ったので、AHKでそれっぽくがんばってみた。

 空行でパス群を区切ったSz7を用意し、MassiGraでAlt+Up/Downすれば、フォルダ移動みたいな感じで次/前のパス群までジャンプする。例によって、MassiGra以外にも応用できるはず。

 ただし、Sz7に記述されたパスのリンク切れなどによって、ファイル名に含まれる連番と、パスの記述順がズレるとジャンプもズレる。ビューア側からは有効パスの連番しかわからず、それを元にSz7を走査してアタリをつけているので。

;--------------------------------------------------------------------------------------
; MassiGra
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class TF811202_MassiGra_Main

; Sz7中の次/前のファイル群(空行区切り)までジャンプ

!Up::Sz7Jump(0)
!Down::Sz7Jump(1)

Sz7Jump(SW) {
  WinGet, WHwnd, ID
  WinGetTitle, WTitle, ahk_id %WHwnd%
  if !RegExMatch(WTitle, "i)^([^<]+\.sz\d+)\\([^<]+)\.[^<]+(?:\s+<.+)?$", $)
    return
  Sz7Path := $1
  ItemNum := $2
  
  FileRead, Sz7Buf, *t *P932 %Sz7Path%
  Sz7Buf := "`n`n" Sz7Buf
  
  if SW {  ; 次
    if !RegExMatch(Sz7Buf, "^(?:\n+[^\n]+){" ItemNum ",}?\n{2,}[^\n]+\.([^\n\.]+)", $)
      return
  } else {  ; 前
    if !RegExMatch(Sz7Buf, "^(?:\n+[^\n]+){0," ItemNum - 2 "}\n{2,}[^\n]+\.([^\n\.]+)", $)
      return
  }
  TxtBuf := $
  FileExt := $1
  
  ErrorLevel := 0
  while !ErrorLevel
    StringReplace, TxtBuf, TxtBuf, `n`n, `n, All
  
  StringReplace, TxtBuf, TxtBuf, `n, `n, UseErrorLevel
  DropFiles(WHwnd, Sz7Path "\" ZeroSup(ErrorLevel, 9) "." FileExt)
}



ZeroSup(Num, NumDigit) {
  RegExMatch(Num, "^0*+(\d*)$", $)
  StringLen, NumLen, $1
  LoopNum := NumDigit - NumLen
  Loop, %LoopNum%
    $1 := 0 $1
  return, $1
}


DropFiles(hwnd, files, ptX=0, ptY=0, fNC=False) {  ; AutoHotkey スレッド part11 >>332
  static char_type:= A_IsUnicode ? "UShort" : "UChar"
    , char_size := A_IsUnicode ? 2 : 1
    , isUnicode := A_IsUnicode ? 1 : 0
  files := RTrim(files, "`r`n`t ") . "`n`n"
  byte_length := StrLen(files) * char_size
  Loop, Parse, files
    If (A_LoopField = "`n")
      NumPut(0x00, files, (A_Index-1) * char_size, char_type)
  
  hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt",20 + byte_length, "Ptr")
  p := DllCall("GlobalLock", "Ptr", hDrop)
  NumPut(20 , p + 00, "Int") ; offset
  NumPut(ptX , p + 04, "Int") ; pt.x
  NumPut(ptY , p + 08, "Int") ; pt.y
  NumPut(fNC , p + 12, "Int") ; fNC
  NumPut(isUnicode, p + 16, "Int") ; fWide
  DllCall("RtlMoveMemory", "Ptr", p + 20, "Str", files, "UInt", byte_length)
  DllCall("GlobalUnlock", "Ptr", hDrop)
  PostMessage, WM_DROPFILES := 0x233, hDrop , 0, , ahk_id %hwnd%
  if ErrorLevel
    MsgBox, DropFiles Err %errorlevel%
}

 たぶん、問題ない(ジャンプ先検出の正規表現に辿り着いたのかなり偶然なのでry)。

 axpathlist2.spi(てかSz7)自体がフォルダ分けに対応してればさー。あと、ファイル名とか内臓Docで元のパスわかるようにするとかー、リンク切れはダミー画像とかー、Unicode対応とかー、別のSz7のインクルードとかー、ワイルドカードとかー、相対パスとかさー、などと好き勝手いってたら、相対パスにはとっくの昔に対応済みだったという恥ずかしエピソードが。


[PR]
by lordnoesis | 2014-02-26 20:00 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる