2023年8月20日日曜日

PPvの位置を一行編集で保存・再現

PPvの位置を一行編集で保存・再現できるようにする。コメントを付けることで、一行編集での検索をしやすくしている。

準備

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

seq.js

//!*script
// id1:subid id2:subid id3:subid ... と順番に調べ、データ未登録の数値を返す
// 「PPvの位置を一行編集で保存・再現」用スクリプト
// 第一引数 : id
// 第二引数 : subid
// 第二引数は省略可。このとき、id1 id2 id3 ... と順番に調べ、データ未登録の数値を返す
// 例:*linemessage %*script(%0Script\seq.js,S_ppvpos,l)
// 引数が一つのみのとき
if (PPx.Arguments.Length == 1){
var id = PPx.Arguments(0);
for (var i = 0; i < 100; i++) {
if (!PPx.Extract("%*getcust\(id"+i+"\)")){
PPx.Result = i;
break;
}
}
// 引数が二つあるとき
} else if (PPx.Arguments.Length == 2){
var id = PPx.Arguments(0);
var subid = PPx.Arguments(1);
for (var i = 0; i < 100; i++) {
if (!PPx.Extract("%*getcust\("+id+i+":"+subid+"\)")){
PPx.Result = i;
break;
}
}
// それ以外の場合は終了
} else {
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit();
}
view raw seq.js hosted with ❤ by GitHub

getwinpos.js

//!*script
// 位置情報を記録したS_xxxを一時ファイルに保存。ファイルパスを返す
// 「PPvの位置を一行編集で保存・再現」用スクリプト
// 第一引数 : S_xxx
// 位置情報はS_xxx+連番(S_xxx1 S_xxx2 S_xxx3 ...)に保存されている想定
// 例:*ppv %*script(%0Script\getwinpos.js,S_ppvpos)
// 引数がなければ終了
if (PPx.Arguments.Length < 1){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit();
}
var id = PPx.Arguments(0);
// 一時ファイルを作成
var tempfile = PPx.Extract("%*temp(name,f)");
var stream = new ActiveXObject("ADODB.Stream");
stream.type = 2;
stream.charset = 'UNICODE';
stream.open();
for (var i = 0; true; i++) {
var l = PPx.Extract("%*getcust\("+id+i+":l\)");
var t = PPx.Extract("%*getcust\("+id+i+":t\)");
var w = PPx.Extract("%*getcust\("+id+i+":w\)");
var h = PPx.Extract("%*getcust\("+id+i+":h\)");
var comment = PPx.Extract("%*getcust\("+id+i+":comment\)");
var str = l+","+t+","+w+","+h+" ;"+comment;
if (l){
stream.WriteText(str,1);
} else {
break;
}
}
stream.saveToFile(tempfile,2);
stream.close();
PPx.Result = tempfile;
view raw getwinpos.js hosted with ❤ by GitHub

editwinpos.js

//!*script
// getwinpos.jsで生成したウィンドウの位置情報を編集
// 「PPvの位置を一行編集で保存・再現」用スクリプト
// 第一引数 : S_xxx
// 第二引数 : getwinpos.jsで生成したファイルのパス
// 例:*script %0Script\editwinpos.js,S_ppvpos,%*script(%0Script\getwinpos.js,S_ppvpos)
// _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
// 使用するエディタのパスを指定。空にしておくとPPeを使用
// 例 : var editor = 'D:\\bin\\xyzzy\\xyzzy.exe';
var editor = '';
// _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
// 引数がなければ終了
if (PPx.Arguments.Length < 2){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit();
}
var id = PPx.Arguments(0);
var filepath = PPx.Arguments(1);
if(editor && editor != ''){
// 指定エディタでファイルを編集
var command = '%Obsq \"' + editor + '\" \"' + filepath + '\"';
PPx.Execute(command);
}else{
// PPeで編集
PPx.Execute('*edit \"' + filepath + '\"');
}
var stream = new ActiveXObject("ADODB.Stream");
stream.type = 2;
stream.open();
stream.loadFromFile(filepath);
// 編集したファイルをもとにユーザデータを上書き
var num=0;
while(!stream.EOS){
var str = stream.readText('-2');
PPx.Execute("*setcust "+id+num+":l="+str.split(",")[0]);
PPx.Execute("*setcust "+id+num+":t="+str.split(",")[1]);
PPx.Execute("*setcust "+id+num+":w="+str.split(",")[2]);
PPx.Execute("*setcust "+id+num+":h="+str.split(",")[3]);
PPx.Execute("*setcust "+id+num+":comment="+str.split(" ;")[1]);
num = ++num;
}
stream.close();
// 不要なユーザデータの削除
for (var i = num; i < 30; i++) {
if (PPx.Extract("%*getcust\("+id+i+":l\)")){
PPx.Execute("*deletecust \""+id+i+"\"");
} else {
break;
}
}
view raw editwinpos.js hosted with ❤ by GitHub

以下を編集して取込。

_Command	= {	; ユーザコマンド・関数
savewindowpos	= *setcust %*arg(1):l=%*windowrect(,l)
	*setcust %*arg(1):t=%*windowrect(,t)
	*setcust %*arg(1):w=%*windowrect(,w)
	*setcust %*arg(1):h=%*windowrect(,h)
	*setcust %*arg(1):comment=%*arg(2)
}

やり方

位置の登録

PPvで以下のコマンドを実行する。

*savewindowpos S_ppvpos%*script(%0Script\seq.js,S_ppvpos,l),%"コメントを記入してください"%E

S_ppvpos0に位置と大きさとコメントが保存される。 次にこのコマンドを実行するとS_ppvpos1に、さらにその次はS_ppvpos2に ... と、位置情報はS_ppvpos+連番に保存される。

位置の再現

PPvで以下のコマンドを実行する。

*string o,name=%*input("" -title:"PPvの位置を変更" -mode:e -k:"*completelist /set /file:%%*script(%%0Script\getwinpos.js,S_ppvpos) -match:6 ") %: *windowposition %N,%so"name"

登録したユーザデータを補完候補ファイルにした一行編集が起動する。

登録した情報の編集

以下のコマンドを実行する。

*script %0Script\editwinpos.js,S_ppvpos,%*script(%0Script\getwinpos.js,S_ppvpos)

一行ごとに位置情報が記載されたテキストファイルがPPEで開く。編集、保存してからPPEを閉じると、編集内容がユーザデータに反映される。

2023-08-21追記

色々ミスがあったので全面的に修正。

0 件のコメント:

コメントを投稿