AutoHotKey_Lで、パスリストをX-Finderのクリップフォルダに変換。Ver.1.2

 先々週書いたEverythingの検索結果をX-Finderで開くシリーズの最新版なんだけど、関数をEverything以外でも使えるようにしてみた。これで\n区切りのパスリストがあれば、なんでもサムネで確認できるよ!やったねry
 もっと機能追加してからPostしようと思って大していじらず1週間たってしまったのでエターナる前にPost。

 使用例は相変わらずEverything。検索結果の任意のアイテムを選択状態にしてF11を打鍵すると、X-Finderでクリップフォルダとして開く。Ctrl+F11なら、前回のクリップフォルダに追加。

 Everything以外は各自勝手に。InputBoxでIni名指定できたらブックマーク的に使えて便利かも。

 デフォルトのIni名にプレフィックスつけたんで、X-Finderのクリップフォルダ設定に;Extra:%X-Finder%CF_*.iniと加えとくと便利。

;--------------------------------------------------------------------------------------
; Everything
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class ahk_class EVERYTHING

F11::
  #ClipboardTimeout 200000
  
  ClipWaitNull()
  Send, ^c
  ClipWait, 3
  if !ErrorLevel {
    CFPath := Path2ClipFld(Clipboard, "CF_Everything.ini")
    Run, "C:\X-Finder\XF.exe" "Extra:%CFPath%"  ; X-Finderのフルパス。
  }
  ClipWaitRestore()
return

^F11::
  #ClipboardTimeout 200000
  
  ClipWaitNull()
  Send, ^c
  ClipWait, 3
  if !ErrorLevel {
    CFPath := Path2ClipFld(Clipboard, "CF_Everything.ini", 1)
    Run, "C:\X-Finder\XF.exe" "Extra:%CFPath%"  ; X-Finderのフルパス。
  }
  ClipWaitRestore()
return


Path2ClipFld(PathList, ClipFldPath = 0, AddSW = 0) {  ; Ver.1.2
  XFPath := "C:\X-Finder\"  ; パスリストのデフォルト保存先。
  if ClipFldPath {
    IfNotInString, ClipFldPath, :\
      ClipFldPath := XFPath ClipFldPath
  } else {
    ClipFldPath := XFPath "CF_.ini"
  }
  
  StringReplace, PathList, PathList, `n, `n, UseErrorLevel
  PathNum := ErrorLevel + 1
  
  if AddSW
    IniRead, IniCnt, %ClipFldPath%, X-Finder, Count, 0
  else
    IniCnt := 0
  
  if !IniCnt
    ClipFldBuf := "[X-Finder]`nCount=" PathNum
  
  Loop, Parse, PathList, `n, `r
  {
    if ("\" == SubStr(A_LoopField, 0))
      ItemPath := SubStr(A_LoopField, 1, -1)
    else
      ItemPath := A_LoopField
    
    SplitPath, ItemPath, ItemName
    ItemNum := A_Index + IniCnt - 1
    
    ClipFldBuf .= "`nName" ItemNum "=" Str2RefStr(ItemName) "`nPath" ItemNum "=""" Str2RefStr(ItemPath) """`nType" ItemNum "=1"
  }
  
  if AddSW {
    IniCnt += PathNum
    IniWrite, %IniCnt%, %ClipFldPath%, X-Finder, Count
  } else {
    FileDelete, %ClipFldPath%
  }
  
  FileAppend, %ClipFldBuf%, %ClipFldPath%, CP932
  return, ClipFldPath
}

Str2RefStr(StrBuf) {
  Transform, StrBuf, HTML, %StrBuf%, 2
  SetFormat, Integer, H
  Loop {
    if !RegExMatch(StrBuf, "&#(\d+);", $)
      break
    
    TipNum := 0 + $1
    StringTrimLeft, TipNum, TipNum, 2
    if (0 != TipLen := 4 - StrLen(TipNum))
      Loop, %TipLen%
        TipNum := "0" + TipNum
    
    StringReplace, StrBuf, StrBuf, &#%$1%;, &#x%TipNum%;, All
  }
  SetFormat, Integer, D
  StringReplace, StrBuf, StrBuf, &, &, All
  return, StrBuf
}


ClipWaitNull(SW = 1) {
  if SW {
    global CBBackup
    CBBackup := ClipboardAll
  }
  
  Clipboard :=
  while Clipboard
    Sleep, 100
}

ClipWaitRestore() {
  global CBBackup
  
  ClipWaitNull(0)
  Clipboard := CBBackup
  ClipWait
}

 先人の作った「list2xf.exe」との違いは――AHKで応用しやすいってのと、Unicode文字対応ってあたりかなー。

 Everything Ver.1.4は普通のListViewになってたので、Clipboard経由せずControlGet, PathList, List, Selected, SysListView321, Aで取得して加工してもよい。



おまけ。
[PR]
by lordnoesis | 2014-01-17 19:25 | テクノロジ | Trackback(1) | Comments(0)

AutoHotKey_Lで、Everythingの検索結果をX-Finderで開けるように。 Ver.1.1.1

 Everythingの検索結果をX-Finderのクリップフォルダに変換するAHKスクリプトを微修正。どうせ手作業で編集しないのだから、パスも文字参照にして、X-Finder上で扱いやすく。使い方等は前回参照。

;--------------------------------------------------------------------------------------
; Everything
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class ahk_class EVERYTHING

F11::
  ClipWaitNull()
  Send, ^c
  ClipWait, 3
  if !ErrorLevel {
    Path2ClipFld(Clipboard)
    IfWinExist, ahk_class TXFinder.UnicodeClass
      WinActivate
    else
      Run, "C:\X-Finder\XF.exe"  ; X-Finderのパス。
  }
  ClipWaitRestore()
return

Path2ClipFld(PathList) {
  ClipFldPath := "C:\X-Finder\EverythingResult.ini"  ; パスリストの保存先。
  
  StringReplace, PathList, PathList, `n, `n, UseErrorLevel
  ClipFldBuf := "[X-Finder]`nCount=" ErrorLevel + 1
  
  Loop, Parse, PathList, `n, `r
  {
    if ("\" == SubStr(A_LoopField, 0))
      ItemPath := SubStr(A_LoopField, 1, -1)
    else
      ItemPath := A_LoopField
    
    SplitPath, ItemPath, ItemName
    
    ItemPath := Str2RefStr(ItemPath)
    ItemName := Str2RefStr(ItemName)
    
    ItemNum := A_Index - 1
    ClipFldBuf .= "`nName" ItemNum "=" ItemName "`nPath" ItemNum "=""" ItemPath """`nType" ItemNum "=1"
  }
  FileDelete, %ClipFldPath%
  FileAppend, %ClipFldBuf%, %ClipFldPath%, CP932
}

Str2RefStr(StrBuf) {
  Transform, StrBuf, HTML, %StrBuf%, 2
  SetFormat, Integer, H
  Loop {
    if !RegExMatch(StrBuf, "&#(\d+);", $)
      break
    
    TipNum := 0 + $1
    StringReplace, StrBuf, StrBuf, &#%$1%;, &#%TipNum%;, All
  }
  SetFormat, Integer, D
  StringReplace, StrBuf, StrBuf, &#0, &#, All
  StringReplace, StrBuf, StrBuf, &, &, All
  return, StrBuf
}



ClipWaitNull(SW = 1) {
  if SW {
    global CBBackup
    CBBackup := ClipboardAll
  }
  
  Clipboard :=
  while ("" != Clipboard)
    Sleep, 50
}

ClipWaitRestore() {
  global CBBackup
  
  ClipWaitNull(0)
  Clipboard := CBBackup
  ClipWait
}


[PR]
by lordnoesis | 2014-01-04 17:56 | テクノロジ | Trackback | Comments(3)

AutoHotKey_Lで、Everythingの検索結果をX-Finderで開けるように。

 Everything Search Engineのような、NTFSのMFTに対応した検索ソフトはとても高速だが、どうしてもMFTの情報だけでは絞り込めなかったり、条件に当てはまるファイルを俯瞰したい場合などに、エクスプローラのようなサムネイルの一覧表示が欲しくなるが、そういうソフトは中々ない。というわけで、Everythingの検索結果を、X-Finderのクリップフォルダ(任意のファイル等を集約できる仮想フォルダ)として開くAHKスクリプト書いた。

;--------------------------------------------------------------------------------------
; Everything
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class ahk_class EVERYTHING

F11::
  ClipWaitNull()
  Send, ^c
  ClipWait, 3
  if !ErrorLevel {
    Path2ClipFld(Clipboard)
    IfWinExist, ahk_class TXFinder.UnicodeClass
      WinActivate
    else
      Run, "C:\X-Finder\XF.exe"  ; X-Finderのパス。
  }
  ClipWaitRestore()
return

Path2ClipFld(PathList) {
  ClipFldPath := "C:\X-Finder\EverythingResult.ini"  ; パスリストの保存先。
  
  StringReplace, PathList, PathList, `n, `n, UseErrorLevel
  ClipFldBuf := "[X-Finder]`nCount=" ErrorLevel + 1
  
  Loop, Parse, PathList, `n, `r
  {
    if ("\" == SubStr(A_LoopField, 0))
      ItemPath := SubStr(A_LoopField, 1, -1)
    else
      ItemPath := A_LoopField
    SplitPath, ItemPath, ItemName
    
    Transform, ItemName, HTML, %ItemName%, 2
    
    SetFormat, Integer, H
    Loop {
      if !RegExMatch(ItemName, "&#(\d+);", $)
        break
      
      TipNum := 0 + $1
      StringReplace, ItemName, ItemName, &#%$1%;, &#%TipNum%;, All
    }
    SetFormat, Integer, D
    StringReplace, Itemname, ItemName, &#0, &#, All
    
    Loop, %ItemPath%, 1
      ItemPath := A_LoopFileShortPath
    
    ItemNum := A_Index - 1
    ClipFldBuf .= "`nName" ItemNum "=" ItemName "`nPath" ItemNum "=""" ItemPath """`nType" ItemNum "=1"
  }
  FileDelete, %ClipFldPath%
  FileAppend, %ClipFldBuf%, %ClipFldPath%, CP932
}



ClipWaitNull(SW = 1) {
  if SW {
    global CBBackup
    CBBackup := ClipboardAll
  }
  
  Clipboard :=
  while ("" != Clipboard)
    Sleep, 50
}

ClipWaitRestore() {
  global CBBackup
  
  ClipWaitNull(0)
  Clipboard := CBBackup
  ClipWait
}

 Everythingで検索結果を選択し、F11を打鍵するとX-Finder形式のiniを吐く。ウチのX-Finderはクリップフォルダを開きっぱなしの想定なので、アクティブ化or起動に留めたが、そうでないなら引数にExtra:%X-Finder%EverythingResult.iniとでも。

 それと、ツール>基本オプション>その他>クリップフォルダへのパス登録を忘れないように。大抵の場合、既にClipFolder:があるはずなので、ClipFolder:;Extra:%X-Finder%EverythingResult.iniとなる。

 INIはS-JISでユニコード文字は文字参照という仕様なのだが、文字列中のユニコード文字だけ文字参照に置き換える簡単な方法は思いつかず、文字列すべて文字参照とショートネームにしたった。どうせ手作業で編集することなんてないしね。

voidtools > Everything
タブファイラー・X-Finder


[PR]
by lordnoesis | 2014-01-02 19:58 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、EverythingSearchのカラムとウィンドウ幅を自動調整してみた。

 一般的なListView等には「Ctrl+NumpadAdd(テンキーのプラス)」でカラム(列)幅の自動調整を行うショートカットが存在するらしく、Everythingも例外ではない。だが当然ながらこの機能はカラム幅を変更するだけで、ウィンドウサイズはそのままだ。ゆえに、普段はウィンドウを小さくしている場合、面倒なことになる。
 Everythingの1.3βにはウィンドウサイズの変更ショートカットがあり、「自動」もあるのだが、この機能はマルチモニタ環境を考慮しないため、ひとつのモニタに収まりきらない可能性がある。そもそも二回もショートカット使うというのがスマートでない。自動化すべきである。

 というわけで、Everything上でCtrl+NumpadAddすると、カラム幅を自動調節したのち、それがすべて見渡せるようにウィンドウ幅も自動調節する(ウィンドウのあるモニタ幅が上限)AHKスクリプト書いた。少し変えればEverything以外にも使えるかも?

;--------------------------------------------------------------------------------------
; Everything
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class ahk_class EVERYTHING

$^NumpadAdd::
  ACtrl :=
  while ("EVERYTHING_LISTVIEW1" != ACtrl) {
    ControlFocus, EVERYTHING_LISTVIEW1
    ControlGetFocus, ACtrl
  }
  Send, ^{NumpadAdd}
F12::
  WinGetPos, WinX, WinY, WinW, WinH
  WinYC := WinH // 2 + WinY, WinXC := WinW // 2 + WinX
  MntNum := 2  ; 有効なモニタ数(頻繁に変更するなら↓をアンコメント)
  ;~ SysGet, MntNum, 80
  Loop, %MntNum%
  {
    SysGet, Mnt, MonitorWorkArea, %A_Index%
    if (MntTop < WinYC) && (WinYC < MntBottom) && (MntLeft < WinXC) && (WinXC < MntRight)
      break
  }
  if (MntLeft < WinX)
    AftWinX := WinX
  else
    AftWinX := MntLeft
  AftWinW := MntRight - AftWinX
  
  Sleep, 50
  SysGet, FW, 32
  SysGet, VSW, 2
  ControlGet, Hwnd, Hwnd, , EVERYTHING_LISTVIEW1
  GetScrollInfoAll(Hwnd, SB_HORZ, , nMax)
  AftWinW2 := nMax + VSW + FW * 2 + 1
  if (AftWinW > AftWinW2)
    AftWinW := AftWinW2
  
  WinMove, , , %AftWinX%, , %AftWinW%
return

; https://sites.google.com/site/agkh6mze/strage 窓調査.ahk
GetScrollInfoAll(hwnd, type, ByRef nMin="", ByRef nMax="", ByRef nPage="", ByRef nPos="", ByRef nTrackPos="") {
    VarSetCapacity(SCROLLINFO, 7*4, 0x00)
    NumPut(28, SCROLLINFO, 0, "Int")
    NumPut(0x17, SCROLLINFO, 4, "Int") ; SIF_RANGE & SIF_PAGE & SIF_POS & SIF_TRACKPOS = 0x17
    nMin:="", nMax:="", nPage:="", nPos:="", nTrackPos:=""
    if (!DllCall("user32.dll\GetScrollInfo", "UInt", hwnd, "Int",type, "Ptr", &SCROLLINFO, "Int"))
      Return false
    nMin := NumGet(SCROLLINFO, 8, "Int")
    nMax := NumGet(SCROLLINFO, 12, "Int")
    nPage := NumGet(SCROLLINFO, 16, "Int")
    nPos := NumGet(SCROLLINFO, 20, "Int")
    nTrackPos := NumGet(SCROLLINFO, 24, "Int")
    Return true
}

 横スクロールバーの範囲を取得して、ウィンドウサイズをそれ+縦スクロールバーの幅に拡縮してるだけ。

 たまにちゃんと働かんことがあるのだが、何度か繰り返す運用でカバー。


[PR]
by lordnoesis | 2013-05-21 19:41 | テクノロジ | Trackback | Comments(0)

AutoHotKeyで、Everythingの検索結果からEverythingを呼び出してみた。

 EverythingSearchの検索結果で項目を選択してF4を押すと、選択項目のパスを新しいウィンドウ(仮名「結果ウィンドウ」)で検索するAHKスクリプト。Explorerなどでも便利なので、適当に#IfWinActiveをいじってやってみよう!(手抜き)
 「結果ウィンドウ」は、可能な限り再利用される。ただし「結果ウィンドウ」で実行した場合は、さらに新たなウィンドウが呼び出され、今後はそちらが再利用対象になる。

 Everythingでフォルダパスを検索(=フォルダを選択してF4)した場合、結果はそのフォルダ以下のファイル一覧。ファイルパスを検索(=ファイルを選択してF4)した場合、結果はそのファイルのみ。
 フォルダパスでフォルダの中身を検索したり、ファイルパスを削って「同じフォルダの別のファイル」や「別フォルダの同じ名前のファイル」を検索したり、あるいは「F4を二度押して(ファイルのみのウィンドウを残して)、一時的なファイル備忘録として使う」など、可能性は無限大だ!

  EverythingPath := "C:\Program Files (x86)\Everything\Everything.exe"  ; Appごとに似て非なるルーチンがたくさんあるので、AutoExecuteセクションで変数に格納してる。

;--------------------------------------------------------------------------------------
; Everything
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class ahk_class EVERYTHING

$F4::
  Send, ^c
  sleep, 200
  SearchWord := Clipboard

;  if RegExMatch(SearchWord, "適当に整形すればいいと思うよ!",$)
;    SearchWord := $1

  WinGet, HwndA, ID, A
  if (WinExist("ahk_id " HwndEV " ahk_class EVERYTHING") && (HwndA != HwndEV)) {
    ControlSetText, Edit1, %SearchWord%
    WinActivate
  } else {
    Run, %EverythingPath% -search "%SearchWord%"
    Loop {
      WinGet, HwndEV, ID, %SearchWord% ahk_class EVERYTHING
      if (HwndEV && (HwndEV != HwndA))
        break
      Sleep, 200
    }
  }
  WinWaitActive, ahk_id %HwndEV%
  ControlSend, EVERYTHING_LISTVIEW1, ^{NumpadAdd}  ; カラム幅自動調整
return

 WinGet, OutputVar, MinMaxで、「結果ウィンドウ」を最大化してるウィンドウに固定しても便利。最大化したら他が見えない? AeroSnapや半画面化を使うんだ!

 気づいたこと。

  • WinExist関数の対象もLastFoundWindowになるぽ? 日本語リファレンスには記載ない。
  • ExcludeTitleって文字列以外(ahk_idとか)は使えないのかー。
  • Ctrl+NumpadAddはフォーカス箇所で動作が変わる。文字欄ならEverythingの「文字拡大」、SysListView32では標準の「カラム幅自動調整」。


[PR]
by lordnoesis | 2012-11-30 22:12 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる