2023年1月30日月曜日

フォルダ構造とバックアップの方法

バックアップの方法についてのメモ。一年に一度程度、バックアップをしようと思い立つのだが、そのたびにやり方を忘れているので備忘録に。

フォルダ構造

僕はフォルダ構造を以下のようにしている。これは10年以上変わっていない。

[D:\]
 ├ [bin]
 ├ [data]
 ├ [work]
 ├ [temp]
 └ [download]
  • bin:実行ファイル関係
  • data:内容が変化しないファイル。画像、音楽、書籍、論文等の完成済みのもの
  • work:内容が変化するファイル。作業中で未完成のもの
  • temp:一時的なファイル。書庫の解凍をしたり、試しにダウンロードした実行ファイルをここに置いたりする
  • download:ダウンロードしたファイル

過去の記事を読むと、

  • ファイラでいじりやすいように単純なフォルダ構造にする
  • バックアップしやすいようにバックアップが必要なフォルダとそうでないフォルダを分ける
  • 時間経過によって破綻しないフォルダ構造にする

あたりを意識していたようだ。

バックアップの区分

  • workフォルダ:普段からバックアップ
  • dataフォルダ:たまにバックアップ

と分ける。

普段からバックアップ

workフォルダにある自作のファイルは、一度失うと取り返しがつかず、深刻なダメージを受けてしまう。最低でも一日おき、できればリアルタイムでバックアップをしたい。そこで、ここにあるファイルはDropBox等を用いてバックアップする。

たまにバックアップ

dataフォルダにあるファイルは、年に一度程度、外付けHDDに保存する。この外付けHDDは普段はPCにはつなげず、別の場所に保管しておく。 もちろん、NASとかRAIDとかを駆使して、workフォルダもdataフォルダも定期的に保存できればそれがいいが、そこまでしなくてもいいかと現状では思っている。

バックアップの手順

バックアップ時は以下の手順を取る。

ファイル整理

まず、tempフォルダとworkフォルダを整理する。 tempにあるファイルは、基本全て削除してもいいはずなので、ざっと確認したのちに削除する。 workフォルダにあるファイルは、dataフォルダに移動する。この際にカテゴリ分けも行う。

[Data]
 ├ [写真]
 ├ [Music]
 ├ [拾った画像]
 ├ [書籍]
 └ [ドキュメント]
     ├ [2022]
     ├ [2021]
     ├ [2020]
     ├ [2019]
     ├ [2018]
     ├ [2017]
     └ [2016]

こうしてtempフォルダ、workフォルダが空になり、必要なファイルがdataフォルダに移動した段階で、dataフォルダのバックアップを行う。

バックアップツール

僕はPPxのDirMirrorか、fastcopyを利用してバックアップを行っている。 カーソル下フォルダを反対窓にミラーリングする場合は、それぞれ以下のようになる。

  • PPx
*file DirMirror -dest:%2
  • fastcopy
%OB D:\bin\FastCopy\fcp.exe /cmd=sync /auto_close /bufsize=1024 /error_stop %#FCD /to=%2\

2023年1月27日金曜日

zoxide+nyagosでディレクトリ移動

某所で一時期話題になっていたzoxideを使ってみる。ppbだと標準出入力の扱いがややこしいので、nyagosを利用する。まずは

をインストールする。scoopとかchocolatey みたいなパッケージ管理ソフトを使うと、パスも勝手に通してくれて便利。

次に以下をPPxフォルダに保存。

jumppath.lua

hoge = nyagos.eval("zoxide query -i")
nyagos.exec(arg[1] .. "PPBW.EXE -c *execute C,*jumppath \"" .. hoge .. "\"")

以下を編集して取込。

KC_main = {
LOADEVENT ,*ifmatch "o:e,a:d",%1 %: %Obcd zoxide add "%1"
}
Mes0411	= {
EXEF	= 
}

以下を実行。

%Oq *run -noppb -pos:%*windowrect(,l),%*windowrect(,t) nyagos -f %0jumppath.lua %0

参考

追記

2023-04-22:書庫内のパスを登録しないようにした。

2023-05-06:登録パスに空白があってもパス変更ができるように修正。

2023年1月26日木曜日

PPvをPPcの中央に順次移動

PPvを起動中のPPcの中央に順次移動できるようにする。

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

next_ppc_id.js

//!*script
// 引数:[A-Z]
// 受け取ったIDの次のPPCIDを返す
// 例:%*script(%0Script\next_ppc_id.js,C_A)
if (PPx.Arguments.Length < 1){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit();
}
var currentID = PPx.Arguments.Item(0);
var nextID = 0;
var ppclist = PPx.Extract('%*ppxlist(-C)').split( "," );
ppclist.pop();
// リストがなければ終了
if (ppclist.length < 1){
PPx.SetPopLineMessage("PPCがありません。");
PPx.Quit();
}
for(i = 0; i < ppclist.length; i++) {
if (ppclist[i]==currentID){
nextID = i;
}
}
// リスト最後なら最初にループ
if (nextID == ppclist.length-1) {
PPx.Result = ppclist[0];
} else {
PPx.Result = ppclist[nextID+1];
}
view raw next_ppc_id.js hosted with ❤ by GitHub

以下を編集して取込。

KV_main	= {	; PPcメイン窓
^\RIGHT	,*ifmatch 0,0%*getcust(_User:center_id) %: *setcust _User:center_id=%*rightstr("%*extract(C"%%n")", 1)
	*string o,currentid=C_%*getcust(_User:center_id) %: *string o,newid=%*script(%0Script\next_ppc_id.js,%so"currentid") %: *string o,handle=%%NC%*rightstr("%so"newid"", 1) %: *fitwindow %*extract("%so"handle""),%N,20 %: *setcust _User:center_id=%*rightstr("%so"newid"", 1)
^\LEFT	,*ifmatch 0,0%*getcust(_User:center_id) %: *setcust _User:center_id=%*rightstr("%*extract(C"%%n")", 1)
	*string o,currentid=C_%*getcust(_User:center_id) %: *string o,newid=%*script(%0Script\next_ppc_id.js,%so"currentid") %: *string o,handle=%%NC%*rightstr("%so"newid"", 1) %: *fitwindow %*extract("%so"handle""),%N,20 %: *setcust _User:center_id=%*rightstr("%so"newid"", 1)
}

PPc[A] PPc[B] PPc[C]の三つが起動していた場合、PPv上でCtrl+Shift+カーソル左右で、

PPc[A]→PPc[B]→PPc[C]→PPc[A]→…

という順序でPPc中央に移動する。

2023年1月19日木曜日

ホイール操作でPPv表示ファイル切り替え

PPvのホイール操作で、PPc上の前・次のファイルを表示する「_others:pppv」という設定がある。これをPPvの隠しメニューに登録する。以下を編集して取込。

HM_ppv    = {    ; PPv
pppv    , _AUTO,_DBLU , *RotateCustomize _others:pppv,1,0 %: %K"loadcust"
}

隠しメニューのpppvをクリックすると、「PPvのホイール操作によるPPcの前・次のファイル表示」がトグルで切り替わる。

2023年1月12日木曜日

PPxでhowmの「予定表・todo」を実装する

howmファイルを並び替えることで、howmの「予定表・todo」をPPxでできるようにする。 howmの浮沈方式を採用しているが、正確に再現しているわけではない。

準備

以下をScriptフォルダに保存する。title2comment_all.jsはmoeにあるのと同じものなので、既に持っている場合は不要。

  • title2comment_all.js
  • settitle.js
  • Done.js
  • todosort.js
//!*script
// howmファイルの一行目をコメントに
for (var a = PPx.Entry.AllEntry; !a.atEnd(); a.moveNext() ){
// フォルダを除外
if (a.Attributes & 16){
continue;
// .howmファイルへの処理
} else if (a.Name.match(/.howm$/i)){
var dir = PPx.Extract('%1');
var entryName = a.Name;
var f = dir + "\\" + entryName;
// 一行目を読み込む。文字化けする場合は"sjis"を"utf-8"に
var s = readFile(f, "sjis");
// 2~40字を切り取ったものをコメントに
a.Comment = s.slice( 2,40 );
}
}
// 「.」「..」00_INDEX.TXTにコメントを付ける
for (var i = 0; i < PPx.EntryAllCount; i++) {
if (PPx.Entry(i).Name == "." && PPx.Entry(i).Comment == ""){
PPx.Entry(i).Comment = "*";
} else if (PPx.Entry(i).Name == ".." && PPx.Entry(i).Comment == ""){
PPx.Entry(i).Comment = "**";
} else if (PPx.Entry(i).Name.toUpperCase() == "00_INDEX.TXT" && PPx.Entry(i).Comment == ""){
PPx.Entry(i).Comment = "***coment***";
}
}
// ファイルの一行目を読み込む関数
function readFile(fname, charset) {
if (charset == undefined) {
charset = "_autodetect_all";
}
var adTypeBinary = 1, adTypeText = 2;
var adReadAll = -1, adReadLine = -2;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.LoadFromFile(fname);
var text = s.ReadText(adReadLine);
s.Close();
return text;
}
//!*script
// howmファイルを作成する
// 第一引数:作成するフォルダ
// 第二引数:タイトル
// *script %0Script\makehowm.js,%1,homuhomu
// editor %*script(%0Script\makehowm.js,%1,%*now(date))
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var dirname = PPx.Arguments.Item(0);
var filename = PPx.Extract("%*nowdatetime(Y-N-D-HMS)")+".howm";
var filepath = fso.BuildPath(dirname,filename);
var str="= ";
// 引数が複数あればそれをつなげる
for (var i = 1; i < PPx.Arguments.length; i++) {
if (i==1){
str += PPx.Arguments.Item(i);
} else {
str += ","+PPx.Arguments.Item(i);
}
}
str += "\r\n\r\n\r\n["+PPx.Extract('%*now')+"]";
var file = fso.OpenTextFile(filepath, 2, true);
file.Write(str);
file.Close();
PPx.result = filename;
view raw settitle.js hosted with ❤ by GitHub
//!*script
// マークしたhowmファイルの一行目をDONEの状態に
// 例 " [2022-12-20]! シフト表出す"→" [2022-12-20]. [2022-12-21]! シフト表出す"
if (!(PPx.EntryMarkCount) && !(PPx.EntryAttributes & 16)) {
var charset = "sjis"; // 文字化けする場合は"sjis"を"utf-8"に
var dir = PPx.Extract('%1');
var entryName = PPx.EntryName;
var filepath = dir + "\\" + entryName;
// 一行目を読み込み、2~40字を切り取る
var title = readFile(filepath, charset).slice( 2,40 );
var newtitle = getDone(title);
writeFile(filepath,newtitle, charset)
// PPx.Echo("hoge");
}
for (var a = PPx.Entry.AllMark; !a.atEnd(); a.moveNext() ){
// フォルダを除外
if (a.Attributes & 16){
continue;
// .howmかつコメントのないファイルへの処理
} else if (a.Name.match(/.howm$/i)){
var charset = "sjis"; // 文字化けする場合は"sjis"を"utf-8"に
var dir = PPx.Extract('%1');
var entryName = a.Name;
var filepath = dir + "\\" + entryName;
// 一行目を読み込み、2~40字を切り取る
var title = readFile(filepath, charset).slice( 2,40 );
var newtitle = getDone(title);
writeFile(filepath,newtitle, charset)
}
}
// ファイルの一行目を読み込む関数
function readFile(filepath, charset) {
if (charset == undefined) {
charset = "sjis";
}
var adTypeBinary = 1, adTypeText = 2;
var adReadAll = -1, adReadLine = -2;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.LoadFromFile(filepath);
var text = s.ReadText(adReadLine);
s.Close();
return text;
}
// ファイルの一行目を書き換える関数
function writeFile(filepath, newtitle, charset) {
if (charset == undefined) {
charset = "sjis";
}
var strLine = "";
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile(filepath, 1);
strLine = "= "+newtitle+"\r\n";
f.ReadLine(); //空読みで一行目を飛ばす
while (!f.AtEndOfStream) {
strLine += f.ReadLine()+"\r\n"; //sに一行づつ読み込み
}
f.Close();
// 書き込み
var f2 = fso.OpenTextFile(filepath, 2);
f2.Write(strLine);
f2.Close();
}
// 識別子(@ ! + -)を".[タイムスタンプ]"に変換する関数
function getDone(name) {
var re = /(\[[0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\](@[1-9]*|-|\.|\+|\!)/;
var done = name.replace(re,"$1-$2-$3]. ["+PPx.Extract("%*now(date)")+"]"+"$4");
return done;
}
view raw Done.js hosted with ❤ by GitHub
//!*script
// howmっぽい「予定表・todo」を実現する拡張コメントソート用スクリプト
//
// 作成日:2023-01-12
// 更新日:2024-08-20
var EXT_COMMENT = 2; // 利用する拡張コメント
var P_COMMENTFILE = 10001; // コメントファイルの優先度
var BASE_DATE = 7; // 基準日。これをいじるとメモの浮き上がるタイミングを変えれる
var HIGHLIGHT_SCHEDULE = 7; // 予定のハイライト色
var HIGHLIGHT_DEADLINE = 6; // 締切のハイライト色
var HIGHLIGHT_REMINDER = 0; // リマインダのハイライト色
var HIGHLIGHT_TODO = 0; // todoのハイライト色
var HIGHLIGHT_DONE = 0; // 完了のハイライト色
var CHARACTER_SET = "sjis"; // 文字化けする場合は"sjis"を"utf-8"に
for (var a = PPx.Entry.AllEntry; !a.atEnd(); a.moveNext() ){
// フォルダを除外
if (a.Attributes & 16){
continue;
// 00_INDEX.TXTへの処理
} else if (a.Name == "00_INDEX.TXT") {
a.SetComment(EXT_COMMENT,P_COMMENTFILE);
// SEPARATORxxxxx.TXTへの処理
} else if (a.Name.indexOf("SEPARATOR")==0) {
var i = a.Name.match(/[0-9]{1,5}/)[0]; //1~5桁の数値
var now = new Date();
var today = Math.floor( now / 86400000 );
var sp = today-i;
a.SetComment(EXT_COMMENT,sp);
// howmファイルへの処理
} else if (a.Name.match(/.howm$/i)){
var dir = PPx.Extract('%1');
var entryName = a.Name;
var re = /\[([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\](@|-|\.|\+|\!)([0-9]*)\s/;
var f = dir + "\\" + entryName;
try{
var s = readFile(f, CHARACTER_SET).slice( 2,40 ); // 一行目読み込み
var strings = s.match(re);
var date = strings[1]+"/"+strings[2]+"/"+strings[3]; // 日付
var id = strings[4]; // 識別子
var num = strings[5]; // 設定値
var pr = getPriority(id,num,date);
a.SetComment(EXT_COMMENT,pr); // 優先度をセット
var hc = getHighlight(id,pr);
a.Highlight = hc; //ハイライト色をセット
}catch(_err){
null;
}
} else {
null;
}
}
// ファイルの一行目を読み込む関数
function readFile(fname, charset) {
if (charset == undefined) {
charset = "_autodetect_all";
}
var adTypeBinary = 1, adTypeText = 2;
var adReadAll = -1, adReadLine = -2;
var s = PPx.CreateObject("ADODB.Stream");
s.Type = adTypeText;
s.charset = charset;
s.Open();
s.LoadFromFile(fname);
var text = s.ReadText(adReadLine);
s.Close();
return text;
}
// ハイライト色の値を取得
function getHighlight(id,pr) {
var now = new Date();
var today = Math.floor( now / 86400000 );
var i = today - pr;
if (i > BASE_DATE){
return 0;
}
if (id == "@" ) {
return HIGHLIGHT_SCHEDULE;
} else if (id == "!") {
return HIGHLIGHT_DEADLINE;
} else if (id == "+" ) {
return HIGHLIGHT_TODO;
} else if (id == "-" ) {
return HIGHLIGHT_REMINDER;
} else {
return 0;
}
}
// 優先度を計算
function getPriority(id,num,day) {
var date = Math.floor( new Date(day).getTime() / 86400000 );
var now = new Date();
var today = Math.floor( now / 86400000 );
var timeStamp = new Date(day).getTime() - now;
var i = Math.floor( timeStamp / 86400000 )+1;
if (num) {
num = parseInt(num);
} else {
num = 0;
}
if (num){ // 設定値を考慮
var float_date = num;
} else {
var float_date = BASE_DATE;
}
if (id == "@"){
if (i>0){ //未来
return today - i;
} else if (i==0){ // 現在
return today;
} else if (i<0){ // 過去
var i2 = i+num; // 設定値を考慮
if (i2<0){
return 10000;
} else {
return today;
}
}
} else if (id == "!"){
if (i>0){
if (i<float_date) {
return today - i;
} else {
return 10002;
}
} else if (i==0) {
return today;
} else if (i<0) {
return today - i;
}
} else if (id == "+"){
if (i>0){
if (i<float_date) {
return today - i;
} else {
return 10002;
}
} else if (i==0) {
return today - 1;
} else if (i<0) {
return today - 1;
}
} else if (id == "-"){
if (i>0){
return 10002;
} else if (i==0) {
return today;
} else if (i<0) {
var i2 = i+num; // 設定値を考慮
if (i2<0){
return date - 1;
} else {
return today;
}
}
} else if (id == "."){
return 10000;
}
}
view raw todosort.js hosted with ❤ by GitHub

以下を編集して取込。

_Command	= {	; ユーザコマンド・関数
todo	= *script %0Script\settitle.js,%1,%*input("[%*now(date)]- " -title:"todo" -select:l) %: *setcust _User:todo=0
done	= *script %0\Script\Done.js
}

MC_celS    = {    ; エントリ表示 書式([;]メニュー)
todo	= B cF20,6 w50C u2,5 s1
}

KC_main = { ; PPcメイン窓
F6	,*script %0Script\title2comment_all.js %: *setcust XC_cwrt= 2
^R ,*comment "%ee%"コメントの編集"%{%*comment%|%}"
COMMENTEVENT2 ,*script %0Script\todoSort.js
}

実践

メモの作成

*todoを実行すると表示される一行編集に、内容を記入して[Enter]を押す。

すると、入力内容をタイトルにしたhowmファイルがフォルダ内に作成される。

書式は以下の通り。

種類 識別子 設定値
予定 @ [2023-01-15]@ 歯医者 予定が数日続く場合
締め切り ! [2023-01-15]! 手紙を書く 上昇するタイミング
todo + [2023-01-11]+ bluetoothアダプタ探す 上位に表示する日数
リマインダ - [2022-12-30]- ドライブの整理とバックアップ 上昇するタイミング
. [2022-12-23]. [2022-12-22]+ お金下ろす

ソート設定・表示設定

メモを「予定表・todo」形式で表示できるよう設定する。

  1. 「予定表・todo」用のフォルダで[F6]を押して、コメントファイルを作成する。
  2. [;]で表示形式メニューを表示し、「このパス以降」「todo」を選択する。
  3. 以下のコマンドを実行する。

*sortentry -thispath 27,1,0,B11111,1

Done!

完了した締切やtodoファイルをマークしたあと、*doneを実行する。すると、

[2022-12-24]- メガネの調整

が以下のようになり、優先度が最低まで下がる。

[2022-12-24]. [2023-01-04]- メガネの調整

その他

区切り線を追加したい場合

デフォルトでは、00_INDEX.TXTが完了済みのメモのすぐ上に来るようになっている。このファイルにカーソルをあわせて[Ctrl+R]を押して、「----------」とコメントを変更すれば、区切り線として機能させることができる。

さらに区切り線を追加したい場合は、SEPARATOR00000.TXTのようなファイルを作る。この数値部分をいじることて、表示の優先度を決めることができる。今日よりも7日前のメモと同じ優先度にしたいのであれば、SEPARATOR00007.TXT。14日前のメモと同じ優先度にしたいのであればSEPARATOR00014.TXTという具合だ。これらのファイルも、[Ctrl+R]からコメントを変更し、適当な区切り線を表示するようにしよう。

予定が数日ある場合

例えば飲み会が3日間続くのであれば

[2023-01-21]@3 飲み会

とする。 他の識別子についても、その後ろに設定値を付ければ挙動が変化するように一応実装はしてるが、うまく機能しないかもしれない。

ハイライト色

予定はハイライト7、締切はハイライト6を使っている。 ハイライト色を変えたい場合は、カスタマイザーを起動し、「色タブ - PPc エントリ背景/状態」から変更する。 todosort.jsをいじれば、ハイライト色を消したり、リマインダやtodoにもハイライト色をつけたりすることができる。

優先度について

1970年1月1日からの経過日数で計算している。

参考

2023年1月11日水曜日

PPvを単体で活用 - Everything編

PPvを単体で活用 - 表示ファイルの変更の続きです。今回はEverythingを利用してみる。

準備

Everything

  • voidtoolsからEverythingをダウンロード、インストールする。
  • 「ツール - オプション - ETP/FTPサーバ - ETP/FTPサーバを有効」にチェック
  • Everythingが起動してないとPPxから利用できないので、常時起動させておく
  • PPx

    TORO's Software library(Win32/Win64 PPx)からPPx Everything Search Moduleをダウンロード、インストールする

    以下のファイルをPPxフォルダに保存。補完候補ファイルとして利用する。

    everything_cmd.txt

    ext:jpg|jpeg|png|bmp|gif 
    ext:txt|cfg|ini|md|tex|js|html 
    dm:today ext:md|howm
    path:%0Doc ext:txt

    以下を編集して取込。動作を軽くするため、K_editのFIRSTEVENTで検索moduleをオフにしている。一行編集でもEverythingを使いたい場合は、この箇所を取り込まないように。

    KV_main	= {	; PPvメイン窓
    V	,*string o,name=%*input("" -title:"Everything Search" -k:"*completelist /set /file:%%0everything_cmd.txt") %: *ppc -r -bootid:x -single -k *whereis -text:"%so"name"" -type:5 %%: *mapkey use,K_syncwin %%: *ppvoption id %%*rightstr("%%n", 1) %%: *ppvoption sync on %%: *fitwindow %*extract("%%NV%*rightstr("%n", 1)"),%%NC,8
    }
    
    K_syncwin	= {
    ENTER	,*ifmatch "o:e,a:d+","%*name(CD,"%R","%1")" %: %K"@ENTER" %: *stop
    	%K"@Q
    }
    
    K_lied	= {
    FIRSTEVENT	,*completelist -module:off
    }

    やり方

    PPvで[V]を押すと一行編集が表示されるので、検索語を入力する。

    Everythingの検索結果を表示したPPcが、連動ビューONの状態で起動する。目的のファイルを見つけたら[ENTER]で閉じる。

    Everythingは拡張子で絞り込むこともできる。例えばテキストファイルを検索したい場合は、

    ext:txt|cfg|ini|md|tex|js|html  hogehoge

    画像ファイルを検索したい場合は、

    ext:jpg|jpeg|png|bmp|gif fugafuga

    とすればいい。

    また、時間を指定して検索することもできる。以下のようにすると、今日作成したmdファイルとhowmファイルを検索できる。

    dm:today ext:md|howm

    PPxフォルダにDocフォルダを作成、そこにPPXSCR.TXTやPPXWIN.TXTをいれておけば、カスタマイズをしていて「PPXSCR.TXTが見たい!」「PPXWIN.TXTはどこだ!」という際、以下で即座に表示できる。

    path:%0Doc ext:txt

    参考

    2023年1月3日火曜日

    PPvを単体で活用 - 表示ファイルの変更

    必要なときだけPPcを起動して、PPvの表示ファイルを切り替えられるようにする。これにより、PPcに紐付けられたビュアーとしてではない、PPv単体での活用が可能になる。

    以下を編集して取込。

    _Command	= {	; ユーザコマンド・関数
    opensyncwin	= *ppc -r -bootid:x -single -k *jumppath %*arg(1) %%: *mapkey use,K_syncwin %%: *ppvoption id %%*rightstr("%%n", 1) %%: *ppvoption sync on %%: *fitwindow %*extract("%%NV%*rightstr("%n", 1)"),%%NC,8
    }
    
    KV_main	= {	; PPvメイン窓
    O	,*opensyncwin %0
    }
    
    K_syncwin	= {
    ENTER	,*ifmatch "o:e,a:d+","%*name(CD,"%R","%1")" %: %K"@ENTER" %: *stop
    	%K"@Q
    }

    ユーザコマンド*opensyncwinにパスを渡すと、そのパスをPPcで表示する。ここではPPxフォルダのパスを渡している。

    操作は以下の通り。

    1. PPvを起動
    2. [O]を押すとPPcが連動ビューONで起動
    3. 目的のファイルを見つけたら[ENTER]でPPcが閉じる

    応用編

    *opensyncwinに渡すパスを変えてみよう。

    表示中のファイルパスを渡す

    PPvで表示中のファイルのパスを渡す。

    *opensyncwin %FCD

    ListFileを渡す

    予め作っておいたListFileを渡す。以下はPPxフォルダにあるforppv.txtを渡す場合。

    *opensyncwin %0forppv.txt

    ListFileは、*makelistfileを使うと作るのが簡単。

    例えば登録したいエントリをマークし、*makelistfile %0forppv.txt -basic -marked でListFileを作成することができる。 また、PPcでListFileを表示し、そこにエントリをコピーをすると、そのエントリを登録することができる。

    スクリプトで作成したListFileを渡す

    PPvの表示履歴を渡す。 以下をScriptフォルダに保存。

    ppvhistory.js

    //!*script
    // %hvnをListfile形式で一時ファイルに保存し、パスを返す
    // 例:*ppc -bootid:z -single %*script(%0\Script\ppvhistory.js)
    
    // 一時ファイルを作成
    var tempfile = PPx.Extract("%*temp\(\)ppvhis.txt");
    var strLine = ";ListFile\r\n";
    
    // %hvnを20まで取得
    for (var i = 0; i < 20; i++) {
      if (PPx.Extract("%hv"+i)!="") {
        strLine += PPx.Extract("%hv"+i)+ "\r\n";
      } else {
        break;
      }
    }
    
    // 一時ファイルに書き込み
    var fs = PPx.CreateObject("Scripting.FileSystemObject");
    var f = fs.OpenTextFile(tempfile, 2, true, -1); // unicodeで書き込み
    f.Write(strLine);
    f.Close();
    
    PPx.Result = tempfile;

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

    *opensyncwin %*script(%0\Script\ppvhistory.js)