従来、あふ本体にはスクリプト機能が存在しておらず、複雑な操作を実行したい場合にはAutoHotkeyと連携させる、などが必要でした。しかし、遂にあふ自体にスクリプト機能(&SCRIPTコマンド、オートメーションサーバ)が実装されました。本項の目的は有志によるスクリプトの情報集積です。
詳細はあふw同梱の AFXWAMS.txt を参照のこと。
「あふ」のキー設定等に &SCRIPT script.vbs などとして登録する。デフォルトでは VBScript だが、先頭行に LANG:JScript のように書けば言語を指定可能。
事前に登録が必要。「あふwの設定」の「about」タブにある「登録」ボタンを押すことで登録が可能。外部のスクリプトから
// test.js var obj = WScript.CreateObject("afxw.obj"); obj.MesPrint('Test message');
のような形で「あふ」を操作可能。ただし、(恐らく)どの「あふ」で実行するかを指定できないため一つしか「あふ」を立ち上げない、という場合以外では利用は難しい。
下のサンプルをみても、何がなんだかわからない/scriptで何ができるんだ?という完全初心者向け導入方法
【例】「hogehoge 25.zip」 → 「【コミック】 hogehoge 25巻.zip」 に改名したい
1.冒頭に「 【コミック】 」を付与 2.「巻」を
二つの改名を一気にできるのがスクリプトっぽいけど…*1
#LANG:VBScript '『ファイル名置換スクリプト』 '【注】1ファイルのみ対応、正規表現DLL導入済であること afxw.Exec ("®ren -MX s/(.+)/【コミック】 \1/gk") '第一の処理【コミック】を付与 afxw.Exec ("®ren -MX s/\.zip/巻.zip/gk") '第二の処理「巻」の付与
これを「rename_comic.vbs」として任意のフォルダに保存 menuファイル内に 例えば
"R:改名" &SCRIPT "D:\〜\AfxW32\〜\rename_comic.vbs"
と登録し、メニューから 「R:改名」を実行
1行目 | #LANG:VBScript | 省略可 上記 参照 |
2/3行目 | 「'」 注釈行 | 処理には影響を及ぼさない。メモ、注釈等に使用、なくても可、どの行においても可 |
4行目〜 | 実行部分 | 【基本書式】afxw.exec("〜") |
例)afxw.Exec ("&MELTTO $P") 自窓に解凍 | ||
afxw.Exec ("&MASK *.zip *.rar *.lzh *.7z") マスク指定 | ||
afxw.Exce ("D:\〜\○○○.exe $MF") 指定アプリ実行 etc |
このafxw.exce(" 〜")の〜部分にmenuで記述していたコマンドを転記する。以上。
うまくいけば順列に処理されます。最低限のスクリプトはこれで書けます。
ただし、このスクリプト(とすら呼べるのか)でいえば、せっかくの2段階処理なのに、1ファイルでしか処理できません。
複数行マークしても、最初の改名「【コミック】」は全ファイルに適用されますが、その置換後にマークが解除されて、「巻」はカーソル行にある別ファイルに付与されます。*2
そのような部分の処理こそ、条件指定・反復etcの複合が可能な『スクリプト』の本番です。
LANG:JScript // // shortcut.afx.js: shortcut handler for afxw // // Change the current folder path // &SCRIPT shortcut.afx.js -P "$P\$F" // Change the opposite folder path // &SCRIPT shortcut.afx.js -O "$P\$F" // var wsh = WScript.CreateObject("WScript.Shell"); var shortcut = wsh.CreateShortcut(WScript.Arguments.Item(1)); var fs = WScript.CreateObject("Scripting.FileSystemObject") var target = shortcut.TargetPath; if(fs.FolderExists(target)) { target = target + '\\'; } Afxw.MesPrint('&EXCD ' + WScript.Arguments.Item(0) + '"' + target + '"'); Afxw.Exec('&EXCD ' + WScript.Arguments.Item(0) + '"' + target + '"');
各種設定(1)の「ショートカットはリンク先を参照する」のチェックを外した上で、拡張子判別実行で lnk の ENTER に対して &SCRIPT shortcut.afx.js -P "$P\$F" SHIFT+ENTER に対して &SCRIPT shortcut.afx.js -O "$P\$F" のように設定すると、.lnk のリンク先がフォルダの場合、ENTER で自窓でそのフォルダを、SHIFT+ENTER で反対の窓でそのフォルダを開く。リンク先がファイルの場合は、そのファイルがあるフォルダを開きカーソルがそのファイル上に設定される。
https://gist.github.com/2067897
&SCRIPT afxselect.vbs 2 1 や wscript.exe afxselect.vbs 2 1 とすると奇数を選択(2つ組のうち1つ目を選択)
LANG:jscript var i = Afxw.Extract('$I3"新規テキストの編集"'); i = i.replace(/\\/g, "¥").replace(/\//g, "/").replace(/:/g, ":").replace(/\*/g, "*").replace(/"/g, "”").replace(/</g, "<").replace(/>/g, ">").replace(/\|/g, "|"); Afxw.Exec("&EDIT " + i);
Dim ao, WSH, wExec, sCmd, Result, aryResult Set WSH = CreateObject("WScript.Shell") Set ao = Createobject("afxw.obj") If WScript.Arguments.Count >= 1 Then sCmd = WScript.Arguments(0) For j = 1 To WScript.Arguments.Count -1 sCmd = sCmd & " " & WScript.Arguments(j) Next 'Set wExec = WSH.Exec(sCmd) Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) ''(3) Do While wExec.Status = 0 Loop Result = wExec.StdOut.ReadAll aryResult = Split(Result, vbCrLf) For cnt = 0 To UBound(aryResult) ao.MesPrint aryResult(cnt) next ao.MesOk End If Set wExec = Nothing Set WSH = Nothing Set ao = Nothing
WSCRIPT.exe "$~\script\cmdline.vbs" $IT"$K $P\$F" $I"コマンドライン" のような形で使用する
LANG: VBScript Option Explicit Dim wsh,input,cmdline,findexe,flag findexe = "C:\cygwin\bin\find.exe" Set wsh=Wscript.CreateObject("Wscript.Shell") input = InputBox("カレント以降で検索したいファイル名を入力してください。(正規表現可)","find","*") If input<>"" Then cmdline = Afxw.Extract(findexe + " $P -iname '" + input + "' -fprintf find.sz7 '%p\r\n'") flag = wsh.Run(cmdline,,True) afxw.Exec("&EXCD -Pfind.sz7") afxw.Exec("&S_ARC axpathlist.spi") Else afxw.MesPrint("検索文字列がありません。") End If afxw.MesOk()
$~\script\ を検索して $~\script.mnu に書き出す
Set fso = WScript.CreateObject("Scripting.FileSystemObject") scriptDIR = Afxw.Extract("$~\script\") scriptMENU = Afxw.Extract("$~\script.mnu") Set newMenu = fso.OpenTextFile(scriptMENU, 2, true, 0) newMenu.WriteLine("afx Scripts") Set dir = fso.GetFolder(scriptDIR) For Each file In dir.Files menuLine = """" + file.Name + """ &SCRIPT """ + scriptDIR + file.Name + """" newMenu.WriteLine(menuLine) Next Set fso = Nothing Set newMenu = Nothing Set dir = Nothing Afxw.Exec("&RELOAD LR") Afxw.Exec("&MENU " + scriptMENU)
'マスクの反転 Mask = Afxw.Extract("$*P") aryMask = Split(Mask, " ") For i = 0 To UBound(aryMask) Select Case Left(aryMask(i), 1) Case ":" aryMask(i) = Mid(aryMask(i), 2) Case "" Case Else aryMask(i) = ":" & aryMask(i) End Select Next InvMask = Join(aryMask) Afxw.Exec("&MASK " & InvMask)
//LANG:JScript // Uキー(&EXTRACT)で書庫の展開をするとマークが解除されてしまうので解除されないようにする // 複数のアーカイブファイルを展開した直後に削除する時に便利 // カレント窓にマークが1個でもあれば真 function ismark(){ a.exec("&tow"); var m = a.extract("$mO"); a.exec("&tow"); return "" != m; } var a = Afxw; var mark = a.extract("$MS"); var mflag = ismark(); a.exec("&extract"); if(mflag) a.exec("&mark " + mark);
#LANG:VBScript Afxw.Exec("&SENDKEY 0013") Afxw.MesPrint(Afxw.Extract("$F")) Afxw.Exec("&SENDKEY 2034") Afxw.MesPrint(Afxw.Extract("$F")) Afxw.Exec("&SUSIE")
一旦画像ビュアから抜け、て「CTRL+Page_Down」でカーソルを最下部にし、再度画像ビュアに戻っているだけです。
当然、最下部に画像ファイル以外のものがあったらシクるはずw
途中のAfxw.MesPrintは、外すと動作モードの遷移が発生しなかったので残してます。
なお、トップに移動は afx.key に以下で OK とのこと。
[GVIEW] K0000="2037&EXCD -P"$P\"