2019年1月30日水曜日

PPc上からPPvを操作

連動ビュー使用時、PPc上からPPvを操作する方法。
PageUpだとか検索だとかいった操作をPPvで行う場合、一々そちらにフォーカスを移すという動作が面倒なので、やってみた。

_others = { ; その他設定
SyncViewID = Y
}

KC_main = { ; PPcメイン窓
PUP ,*ifmatch /.+/,%NVY %: %KVY"PUP" %: *stop
 %K"@PUP"
PDOWN ,*ifmatch /.+/,%NVY %: %KVY"PDOWN" %: *stop
 %K"@PDOWN"
F ,*ifmatch /.+/,%NVY %: %KVY"F" %: *stop
 %K"@F"
'[' ,*ifmatch /.+/,%NVY %: %KVY"[" %: *stop
 %K"@'['"
']' ,*ifmatch /.+/,%NVY %: %KVY"]" %: *stop
 %K"@']'"
'=' ,*ifmatch /.+/,%NVY %: %KVY"=" %: *stop
 %K"@'='"
}


このように、


  1. 連動ビュー用のPPvIDを決めておき
  2. *ifmatchでそのIDのPPvが存在してるか否かを判別。起動してればPPvを操作、してなければPPcを操作


とすればいい。

2019年1月20日日曜日

MakeComment.jsの自動実行!



僕はPPxとXyzzyでメモ環境を作っている(Memo on the Electron)。今回は、メモのタイトル表示に使うMakeComment.jsを自動実行する話。

準備


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

MakecommentA.js

//!*script
//カレントディレクトリに一行目とファイルパスを対応させたコメントファイル(00_INDEX.txt)を作成


var strLine = "\r\n";
var currentDir = PPx.Extract('%1');
var fs = PPx.CreateObject("Scripting.FileSystemObject");

// すべてのhowmファイルにコメントがついていれば終了
for (var i = 0; i < PPx.EntryAllCount; i++) {
  if (PPx.Entry(i).Name.match(/.howm$/i) && PPx.Entry(i).Comment.match(/^$/i))
    break;
  else if (i == PPx.EntryAllCount - 1)
    PPx.Quit();
}

for (var i = 0; i < PPx.EntryAllCount; i++) {
  var fullpath = fs.BuildPath(currentDir,PPx.Entry(i).Name);
  // ファイルあるいはフォルダが存在しない場合の処理
  if (!(fs.FolderExists(fullpath) || fs.FileExists(fullpath))) {
    continue;
  }
  // .あるいは..の処理
  else if (PPx.Entry(i).Name == "."){
    str = PPx.Entry(i).Name + "\t*\r\n";
    strLine =  strLine + str;
  } else if (PPx.Entry(i).Name == ".."){
    str = PPx.Entry(i).Name + "\t**\r\n";
    strLine =  strLine + str;
  }
  // サイズが0のファイルとディレクトリは読み込まない
  else if (PPx.Entry(i).Size == 0) {
    if (PPx.Entry(i).Comment != ""){
      str = PPx.Entry(i).Name + "\t" + PPx.Entry(i).Comment + "\r\n";
      strLine =  strLine + str;
    } else {
      str = PPx.Entry(i).Name + "\t" + PPx.Entry(i).Name + "\r\n";
      strLine =  strLine + str;
    }
  }
  // 拡張子がhowmのファイルを読み込む
  else if (PPx.Entry(i).Name.match(/.howm$/i)) {
    var entryName = PPx.Entry(i).Name;
    var objItem = currentDir + "\\" + entryName;
    // ファイルの内容を取得
    objInFile = fs.OpenTextFile(objItem, 1);
    // ファイル名+Tab+一行目の最初二文字~40字を切り取ったもの+改行をstrに代入
    var title = objInFile.ReadLine().slice( 2,40 );
    if (title == "") title = "-blank-"
    str = entryName + "\t" + title + "\r\n";
    strLine =  strLine + str;
    objInFile.Close();
  }
}

if (strLine == "\r\n"){
  PPx.Quit();
} else {
  strLine = strLine + '00_INDEX.txt\t *** COMMENT FILE ***';
}

// カレントディレクトリに00_INDEX.txtを作成
strCreateFile = fs.BuildPath(currentDir,"00_INDEX.txt");
fs.CreateTextFile(strCreateFile);

// 00_INDEX.txtに書き込み
objOutFile = fs.OpenTextFile(strCreateFile, 2);
objOutFile.Write(strLine);
objOutFile.Close();

// F5で更新
PPx.Execute("%K\"@[F5]\"")


最初に、コメント無しのhowmファイルがあるかどうかをチェック。なければ終了するようにする。フォルダを読み込むたびに、不要にコメントファイルを作成すると鬱陶しいからだ。

フォルダ設定


このスクリプトを自動実行したいフォルダに行き、以下のコマンドを実行。

*diroption -thisbranch


ディレクトリ別の設定メニューが表示されるので、「実行」を選択。


出てきた一行編集ウィンドウに、

*script %0\Script\MakeCommentA.js

と入力する。これで、そのディレクトリ以下でこのスクリプトを自動実行するようになる。



スクリプトの最後にF5で更新しているが、「すべてのhowmファイルにコメントがついていれば終了」がスクリプト内にあるから無限ループにはならない…はず?

参考


MakeComment.jsの自動実行? - つかさのほえほえ日記

2019年1月15日火曜日

フォルダ履歴ジャンプメニュー(動的)




PPcでフォルダ履歴メニューを表示し、選択したらパス移動する。
5年前にも同じことをしていたようなのだが、今回はスクリプトを使い、メニューを動的にした。履歴がない場合はその項目を表示しない。

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

dirhistorymenu.js

//!*script
// ディレクトリ履歴メニューを作成

PPx.Execute("*setcust -|M_hoehoe ="); // メニューの削除
for (var i = 0; i < 10; i++) {
  var name = PPx.Extract("%*dirhistory("+i+")");
  if (name){
    PPx.Execute("*setcust M_hoehoe:"+name.replace('\\t','\\\\t')+"="+name); // メニューの登録。\t は桁揃えになるので置換
    }
}

以下のコマンドを実行。

*script %0Script\dirhistorymenu.js %: *execute ,%%j%%M_hoehoe,%1

*executeをかませているのは、ショートカットにマクロ文字を使うため。

参考


フォルダ履歴ジャンプメニュー - つかさのほえほえ日記