2024年3月17日日曜日

ユーザコマンドでパスによる判別実行

特定のファイル/フォルダをパスで判別し、特定のソフトに投げられるようにする。例えばMusicフォルダ以下のフォルダは音楽再生ソフトに投げ、Pictureフォルダ以下のフォルダは画像再生ソフトに投げる、というように。 かつては、「ポチエス」名称による関連付け専用版や、fenrirの機能を使って皆が実現してたやつですね。

準備

以下を編集して取込。

_Command = {
pathdetect = *ifmatch "/D:\\Data\\Music/",%*arg(1) %: %Ob D:\bin\AIMP5\AIMP.exe  %*arg(1) %: *stop
 *ifmatch "/D:\\Data\\Picture/",%*arg(1) %: %Ob D:\bin\NeeView\NeeView.exe %*arg(1) %: *stop
 %Z %*arg(1)
}

やり方

*pathdetect %FCD

とすれば、パスに応じて違うソフトに投げることができる。今回の例であれば、D:\Data\Music以下のフォルダはAIMP5に。D:\Data\Picture以下のフォルダはNeeViewで開くことになる。

2024年3月9日土曜日

一行編集でfenrirっぽいディレクトリ移動

一行編集で、編集中のディレクトリパスの階層を、上がったり下がったりできるようにする。fenrirの挙動を参考にした。

準備

以下をScriptフォルダに保存する。

//!*script
// 指定ディレクトリ以下のディレクトリ/ファイルを列挙した一時ファイルを作成、パスを返す
//
// 第一引数 : ディレクトリ
//
// 一時ファイルの構成
// 一行目:受け取ったディレクトリパス
// 二行目以下:指定ディレクトリ以下のディレクトリ名+ファイル名
// 引数がなければ終了
if (PPx.Arguments.Length < 1){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit(-1);
}
var pdir = PPx.Arguments(0);
var tempfile = PPx.Extract("%*temp(name,f)");
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var dir = fso.GetFolder(pdir);
var strLine = pdir + "\r\n";
var stream = PPx.CreateObject("ADODB.Stream");
stream.type = 2; // -1:Binary, 2:Text
stream.charset = 'UTF-8';
stream.lineseparator = 10; // ' -1 CrLf , 10 Lf , 13 Cr
// ディレクトリを取得
var enmFolders = PPx.Enumerator(dir.SubFolders);
for(; !enmFolders.atEnd(); enmFolders.moveNext()){
strLine += enmFolders.item().Name + "\\\r\n";
}
// ファイルを取得
// var enmFile = PPx.Enumerator(dir.Files)
// for (; !enmFile.atEnd(); enmFile.moveNext()){
// strLine += enmFile.item().Name + "\r\n";
// }
// 書き込み
writeFile(tempfile,strLine,"UTF-8");
// 書き込み用関数
function writeFile(fname, text, charset) {
if (charset == undefined) {
charset = "_autodetect_all";
}
var adTypeBinary = 1, adTypeText = 2;
var adSaveCreateNotExist = 1, adSaveCreateOverWrite = 2;
var adWriteLine = 1;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.WriteText(text, adWriteLine);
s.SaveToFile(fname, adSaveCreateOverWrite);
s.Close();
}
PPx.Result = tempfile;
view raw getsubdir.js hosted with ❤ by GitHub

以下を編集して取込。

-|K_listmode=

K_listmode = {
ENTER    ,*ifmatch -1,%*sendmessage(%N-L,392,0,0) %: %K"@DOWN @ENTER" %: *stop
    %K"@ENTER"
LEFT    ,*dirmode %*name(D,%*getcust(_User:dirpath))
RIGHT    ,*ifmatch -1,%*sendmessage(%N-L,392,0,0) %: %K"@DOWN"
    *dirmode %*name(CD,"%*edittext",%*getcust(_User:dirpath))
}

_Command    = {
dirmode	= *setcust _User:dirpath=%*arg(1)
	*completelist -file:"%*script(%0Script\getsubdir.js,%*arg(1))" -history:e
	*replace ""
jump2listpath    = *setcust _User:dirpath=
    *string o,name=%*input("" -title:"jump2pathlist" -mode:e -k:"*completelist -file:%%*arg(1) -match:6  %%: *mapkey use,K_listmode")
    *ifmatch "o:e,a:d","%so"name"" %: *jumppath "%so"name"" %: *stop
    *ifmatch !0,0%*getcust(_User:dirpath) %: *jumppath "%*getcust(_User:dirpath)\%so"name""
}

やり方

ディレクトリパスを羅列した、以下のようなファイルを用意する。手動で作ってもいいし、zoxideやfenrirscanを利用して作ってもいい。

D:\bin
D:\Data
D:\work
C:\Program Files\7-Zip
C:\Program Files\Ablaze Floorp
C:\Program Files\AMD
C:\Program Files\BraveSoftware
C:\Program Files\Calibre2
C:\Program Files\Common Files
C:\Program Files\CrystalDiskInfo
C:\Program Files\EBWin4(x64)
C:\Program Files\Epic Games
C:\Program Files\Git
C:\Program Files\Internet Explorer

作成したファイルのパスを引数にして、*jump2listpathを実行する。

*jump2listpath %0data\path

すると、このファイルを補完候補リストとした一行編集が起動する。

キーバインドは以下の通り。

  • [RIGHT] サブディレクトリ表示
  • [LEFT] 階層を一つ上へ
  • [ENTER] パスをアクティブなPPcで開く

参考