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)

AutoHotKey_Lで、マンガミーヤCEを便利にしてみた&「sz7」の読み込みに対応させたかった……。

 以前書いたマンガミーヤCE向けの「ホイールによるタブ移動」と「表示している書庫/画像のパス保存≒タブセッション保存」をクリンナップしつつ、パス保存で作ったパスリストの読み込み機能も実装してみた。

 あと、基本的なキー設定をすべてAHKでメニューID叩いて実現してみた。Win7だとキーカスタマイズができない問題があって、いちいちVMWareでXPを起動するのが面倒だったので、もう全部AHKでいいじゃん!みたいな。キー割り当てはソースを見れ。
 なお上下キーはページ移動だが、押しっぱなしにした場合の移動を、キーリピートに頼らず実現している(キーリピートだと早すぎる)。二連打でリミッター開放。

;--------------------------------------------------------------------------------------
; マンガミーヤCE MangaMeeyaCW
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class MainFrameDockWindow

MCE_MenuRepeat(MenuID) {
  PostMessage, 0x111, %MenuID%, 0, , A
  RegExMatch(A_ThisHotkey, "(\w+)", $)
  if (A_PriorHotkey == A_ThisHotkey ) && (150 > A_TimeSincePriorHotkey) {
    TipView("Turbo")
    WaitTime := 1
  } else {
    WaitTime := 100
  }
  KeyWait, %$1%, T0.5
  if ErrorLevel
    while GetKeyState($1, "P") {
      PostMessage, 0x111, %MenuID%, 0, , A
      Sleep, %WaitTime%
    }
  TipView("")
}


WheelUp::  ; タブバー上ならタブ移動
  MouseGetPos, , , , Ctrl
  if Ctrl
    PostMessage, 0x111, 20128, 0, , A
  else
    Send, ^+{Tab}
return

WheelDown::  ; タブバー上ならタブ移動
  MouseGetPos, , , , Ctrl
  if Ctrl
    PostMessage, 0x111, 20127, 0, , A
  else
    Send, ^{Tab}
return

Up::MCE_MenuRepeat("20092")  ; 戻る
Down::MCE_MenuRepeat("20091")  ; 進む

left::
Numpad1::
  send, ^+{Tab}  ; 右のタブ(ビューウィンドウ)
return

right::
Numpad3::
  send, ^{Tab}  ; 左のタブ(ビューウィンドウ)
return

^left::
Numpad4::
  PostMessage, 0x111, 20093, 0, , A  ; 1p進む
return

^right::
Numpad6::
  PostMessage, 0x111, 20094, 0, , A  ; 1p戻る
return

Numpad0::PostMessage, 0x111, 20151, 0, , A  ; 新規ビューウィンドウ

NumpadDot::PostMessage, 0x111, 20170, 0, , A  ; 画像情報表示

Space::  ; 見開き切替(1p/2p/自動見開き)
  MMCESW++
  if (1 == MMCESW) {
    PostMessage, 0x111, 20041, 0, , A
    TipView("1p")
  } else if (2 == MMCESW) {
    PostMessage, 0x111, 20042, 0, , A
    TipView("2p")
  } else {
    PostMessage, 0x111, 20044, 0, , A
    TipView("Auto")
    MMCESW := 0
  }
return

s::  ; 表示画像のパスをリストに保存(書庫内パス対応)
w::  ; パス保存後、タブ移動
  WinGet, AWinID, ID, A
  if (PreAWinID != AWinID)
    Prefix := A_Now
  PreAWinID := AWinID

  PostMessage, 0x111, 20151, 0, , A
  Sleep, 100
  PostMessage, 0x111, 20151, 0, , A

  WinGetText, WinTxt, A
  RegExMatch(WinTxt, "sJS)(?:([A-Z]:\\[\S ]+).*((?1))|((?1)))", $)
  if $3
    FileAppend, %$3%`n, MCE_%Prefix%.txt
  else
    FileAppend, %$1%`n%$2%`n, MCE_%Prefix%.txt
  SplashView($1 $3 "`n" $2)

  IfWinNotExist, MCE_%Prefix%.txt
    Run, MCE_%Prefix%.txt

  if ("w" == A_ThisLabel)
    Send, ^{Tab}
return

l::
  IfWinActive, A
  MsgBox, 262179, MangaMeeyaCEでパスリストを開く, クリップボードをパスリストと見なして開きますか?`n`n「いいえ」を選択した場合、パスリスト選択ダイアログを開きます。
  
  IfMsgBox, Cancel
    return
  IfMsgBox, Yes
    PathList := Clipboard
  IfMsgBox, No
  {
    FileSelectFile, ListPath, 3, .\, パスリストを開く, *.txt; *.sz7
    if !ListPath
      return
    FileRead, PathList, *t *P932 %ListPath%
    SplitPath, ListPath, , , ListExt
  }
  if !PathList
    return
  
  WinGet, MCE_PID, PID
  wmi := ComObjGet("winmgmts:")
  queryEnum := wmi.ExecQuery(""
    . "Select * from Win32_Process where ProcessId=" . MCE_PID)
    ._NewEnum()
  if queryEnum[process] {
    RegExMatch(process.CommandLine, """?([^""]+|\S+)""?", $)
    MCE_Path := $1
  }
  wmi := queryEnum := process := ""
  
  if ("sz7" == ListExt)
    MCE2sz7(PathList, MCE_Path)
  else {
    Loop, Parse, PathList, `n, %A_Space%%A_Tab%
    {
      Run, %MCE_Path% "%A_LoopField%"
      Sleep, 100
    }
  }
return

MCE2sz7(PathList, TrgPath, TrgHwnd = 0) {  ; ※sz7疑似展開機能は書庫内パス対応不可能
  if !TrgHwnd
    TrgHwnd := WinExist()
  
  Run, %TrgPath% "Dummy"
  Sleep, 100
  
  Loop, Parse, PathList, `n, \%A_Space%%A_Tab%
  {
    FileGetAttrib, FileAttrib, %A_LoopField%
    IfInString, FileAttrib, D  ; フォルダなら無視
      continue
    if (PrePath == A_LoopField)  ; ひとつ前と同じなら無視
      continue
    PrePath := A_LoopField
    
    if FileExist(A_LoopField) {  ; 実在するパス
      DropFiles(TrgHwnd, A_LoopField)
      Cnt++
    }
  }
  return, Cnt
}

 ソースみればわかるが、以前も作成スクリプトを書いたりしてたsz7の読み込みに、疑似的に対応してみた。というか、本当はコレがメイン。
 パスリスト読み込みは「n個のパスをn個のタブで開く機能」だが、sz7読み込みは「複数のパスをひとつのタブに開く機能」。ただし書庫内パスには非対応。CEの対応ファイルが"実在"していないとならない。

 CEはSusieプラグイン非対応なのでaxpathlist2.spiが使えないが、DnDの仕様をうまく利用すればいけるんじゃね?と思いやってみたが、「書庫はDnDでもリスト追加でなく新規に開く」「無理に書庫内パスを複数渡しても、読み込みエラー」という仕様の前に敗れ去る。無念。
 冷静に考えると(今時はメモリも有り余ってるのだし)、axpathlist2.spi入れた本家マンガミーヤを複数開いて、疑似的にタブ化すればいいよねっていう……。



オマケという名の夢の跡。
[PR]
by lordnoesis | 2012-11-09 20:54 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる