2020年2月10日月曜日

PPxをアウトラインプロセッサに

僕は今まで、PPxとhowmを組み合わせてメモ環境を作っていた(参考:MoE)。
ここにさらに

1.エントリ順序の任意設定
2.レベルの実装

を追加して、PPxをアウトラインプロセッサとして使えるようにする。



実装は以下のようになる。

1.エントリ上で特定のキーを押すことで、エントリ位置の入れ替えやレベルの変更を可能に
2.コメントファイル作成時、エントリ順で記載する。行頭の空白も保存
3.コメントファイルの記載順序で拡張コメントソート

準備


以下の2つのファイルをScriptフォルダに保存。

MakeOutlineComment.js

//!*script
// カレントディレクトリに一行目とファイルパスを対応させたコメントファイル(00_INDEX.txt)を作成
// アウトラインプロセッサ用。行頭の空白を維持し、エントリの順番通りに書き出す

var strLine = "\r\n";
var fs = PPx.CreateObject("Scripting.FileSystemObject");

for (var i = 0; i < PPx.EntryAllCount; i++) {
  // エントリがディレクトリの時の処理
  if (PPx.Entry(i).Attributes & 16) {
    if (PPx.Entry(i).Name == "."){
      strLine += PPx.Entry(i).Name + "\t*\r\n";
    } else if (PPx.Entry(i).Name == "..") {
      strLine += PPx.Entry(i).Name + "\t**\r\n";
    } else if (PPx.Entry(i).Comment=="") {
      strLine += PPx.Entry(i).Name + "\t" + PPx.Entry(i).Name + "\r\n";
    } else {
      strLine += PPx.Entry(i).Name + "\t" + PPx.Entry(i).Comment + "\r\n";
    }
  // エントリがhowmのときの処理
  } else if (PPx.Entry(i).Name.match(/.howm$/i)) {
    // ファイルの一行目を取得
    var f = fs.OpenTextFile(PPx.Entry(i).Name, 1);
    var title = f.ReadLine().slice( 2 );
    // コメントの最初に空白があればそれを反映
    if (PPx.Entry(i).Comment.match(/^ +/)) {
      var heading = PPx.Entry(i).Comment.match(/^ +/);
      strLine += PPx.Entry(i).Name + "\t" + heading + title + "\r\n";
    } else {
      strLine += PPx.Entry(i).Name + "\t" + title + "\r\n";
    }
    f.Close();
  }
}
if (strLine == "\r\n"){
  PPx.Quit();
} else {
  strLine += '00_INDEX.txt\t *** COMMENT FILE ***';
}

// 00_INDEX.txtに書き込み
var f2 = fs.OpenTextFile("00_INDEX.txt", 2, true, -1); // unicodeで書き込み
f2.Write(strLine);
f2.Close();

OutlineSort.js

//!*script
// 拡張コメントソート用。拡張コメント1を利用。
// 00_INDEX.txtの記載順に連番を付ける。

var fs = PPx.CreateObject("Scripting.FileSystemObject");
if (!fs.FileExists("00_INDEX.txt")) {
  PPx.Quit();
}

// ゼロ埋め
function zeroPadding(num,length){
    return ('0000000000' + num).slice(-length);
}

var array = {};

var stream         = new ActiveXObject("ADODB.Stream");
    stream.type    = 2;
stream.charset = "Unicode";
stream.open();
stream.loadFromFile("00_INDEX.txt");

var i = 1;
var firstLine = '';
while(!stream.EOS){
  firstLine = stream.readText('-2').split("\t")[0];
  array[firstLine]=i;
  i +=1;
}
stream.close();

for (var i = 0; i < PPx.EntryAllCount; i++) {
  if (PPx.Entry(i).Name.match(/.howm$/i)) {
    var num = zeroPadding(parseInt(array[PPx.Entry(i).Name]),4);
    PPx.Entry(i).SetComment(1,num);
  }
}


以下を編集して取込。

KC_main = { ; PPcメイン窓
^\LEFT ,*comment "%*regexp("%*comment","s/^\s?(.*)/$1/")"
^\RIGHT ,*comment " %*comment"
^\DOWN = @DEL @INS @DOWN
^\UP = @UP @DEL @INS
F7 ,*script %0Script\MakeOutlineComment.js
COMMENTEVENT1 ,*script %0Script\OutlineSort.js
}
MC_sort = {
拡張ソート&1 = 24,-1,-1,B11111,1
}
XC_cwrt = 0


対象フォルダでSを押してソートメニューを出し、拡張ソート1を選択する。


やりかた


1.エントリ位置やレベル調整をカーソルキーで行う:

Ctrl+Shift+カーソル上下:エントリ位置変更
Ctrl+Shift+カーソル左右:エントリレベル変更



2.F7を押して現在のエントリ状態を保存する:

COMMENTIVENT1に設定しているMakeOutlineComment.jsが実行され、現在のエントリ状態をコメントファイルに保存する。
それ以降は、フォルダを再読み込み時にOutlineSort.jsが実行され、保存時と同じ並びでソートされる。

2020年2月7日金曜日

一行編集でブックマーク

僕は、一行ごとにコマンドを記入したl_cmd.txtを%*imputで読み込ませて、一行編集をランチャとして用いている(参考:つかさのほえほえ日記: 一行編集でランチャ改)。
今回は、任意のパスをl_cmd.txtに直接書き込み、一行編集からジャンプできるようにする。
コマンドプロンプトのコマンドだとエスケープが超面倒そうなので、busyboxを使用。

_Command = { ; ユーザコマンド・関数
setbookmark = *string o,hoge= *execute C,*jumppath %"パスを入力してください"%{%*extract(C"%%FCD")%} %%m%"コメントを入力してください"%{%*extract(C"%%FC")%} %:
 %Ob %0busybox64.exe echo %so"hoge" >> %0l_cmd.txt
}


l_cmd.txtに以下の行を追加。

*setbookmark

やりかた


1.PPcで、ブックマークしたいフォルダにカーソルをあわせた後、一行編集から*setbookmarkを実行。パスとコメントを入力する。これで、l_cmd.txtに登録される


2.ブックマークを開きたいときは、一行編集から絞り込んでジャンプ



ブックマークを消したい場合はl_cmd.txtを直接開いて編集する。ちなみに

editor %0l_cmd.txt

みたいなコマンドをl_cmd.txtに書き込んでおき、一行編集から実行できるようにしておくと便利。

2020年2月2日日曜日

拡張コメントでゼロ埋めソート

音楽ファイルや画像ファイルの連番が

1-ゆらゆら.flac
2-新しい友達 II.flac
3-トムソンガゼルになりたかった.flac
4-新しい友達.flac
5-大観覧車.flac
6-君と仲良くなるためのメロディ.flac
7-灯台.flac
8-あの日に帰りたい.flac
9-へんないきもの.flac
10-ホラーすぎる彼女です.flac
11-マジカル走れ走れYO!.flac
12-ロードムービー.flac

となっている場合、名前順ソートだと

1-ゆらゆら.flac
10-ホラーすぎる彼女です.flac
11-マジカル走れ走れYO!.flac
12-ロードムービー.flac
2-新しい友達 II.flac
3-トムソンガゼルになりたかった.flac
4-新しい友達.flac
5-大観覧車.flac
6-君と仲良くなるためのメロディ.flac
7-灯台.flac
8-あの日に帰りたい.flac
9-へんないきもの.flac

と順序が崩れてしまう。拡張コメントを利用して、順序どおりにソートするようにする。
以下を編集して取込。

_Command = {
zeropadding = *ifmatch "option:e,attribute:d+" %: *return 9999
  *ifmatch "!/^\d/",%FC %: *return 9999
  *string o,hoge=%*regexp(%FBC,"s/^(\d+).*/0000$1/") %: *return %*regexp(%so"hoge","s/^0*(\d{4})/$1/")
}
KC_main = {
COMMENTEVENT1 , *comment 1,all extract,%%*zeropadding
}

zero-paddingは、冒頭の数値をゼロ埋めして返すコマンド。例えば「1-ゆらゆら.flac」を与えると「0001」が返ってくる。数値がなければ一律に「9999」を返す。
次に、ソートを実行したいフォルダで、以下を実行。

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

すると、COMMENTEVENT1が呼び出され、各項目にzeropaddingによる拡張コメントが追加された後に、拡張コメントを用いたソートがなされる。

追記 2020-02-07


拡張コメントを利用しなくても、デフォルトでできるみたいだ。

ソートメニューから「詳細」を選択し、数値順を選ぶ。