2014年11月26日水曜日

ブックマークをリストファイルにして保存

あいさつ


これまで、PPcでのフォルダブックマークと、PPvでのファイルブックマークの方法を考察してきた。


今回はその応用編。ブックマークをファイルに保存して、再利用できるようにする。

準備(両者共通)


  • file2alias.js
  • alias2file.js

の二つをScriptフォルダに保存する。

file2alias.jsはリストファイルを読みとり、エイリアスに登録するスクリプトで、alias2file.jsはエイリアスをリストファイルにして保存するスクリプト。

ちなみにリストファイルというのは
;ListFile
D:\Work\画像フォルダ\ひだまりスケッチ\kulSc26Vu4BA6C577.jpg
D:\Work\画像フォルダ\ひだまりスケッチ\0dd01f46.jpg
D:\Work\画像フォルダ\輪るピングドラム\2dffa763.jpg
D:\Work\画像フォルダ\輪るピングドラム\3b0de06d.jpg
D:\Work\画像フォルダ\輪るピングドラム\4d45aa4d.jpg

こんな書式のテキストファイルで、仮想ディレクトリとして扱うためのもの。


普通にテキストファイルにするよりもこうしておいたほうが、後々何か使い道ありそうかも、と思ってこのようにしている(一行目に;ListFileって付けるだけだし)。

file2alias.js

//!*script
// リストファイルの内容をエイリアスにセットする
// 第一引数:リストファイルのパス
// 第二引数:エイリアス

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var s = new ActiveXObject('ADODB.Stream');
var i = 0;
var fn = PPx.Arguments.Item(0);
var cmd = PPx.Arguments.Item(1);

// エイリアスをリセット
for (var i2 = 0; i2 < 30; i2++) {
  PPx.Execute("*alias "+cmd + i2 + " = ");
}

// ファイルを読み取り
s.type = 2;
s.charset = 'utf-16';
s.open();
s.loadFromFile(fn);

// エイリアスを順次セット
while(!s.EOS){
  hoge = s.readText(-2);
  if (hoge != "" && hoge != ";ListFile") {
    PPx.Execute("*alias "+cmd + i + " = " +hoge);
    i++;
  }
}
s.close();

alias2file.js

//!*script
// エイリアスをリストファイルに保存する
// 第一引数:リストファイルのパス
// 第二引数:エイリアス

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var strLine = ";ListFile";
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var fn = PPx.Arguments.Item(0);
var cmd = PPx.Arguments.Item(1);

// エイリアスを展開し一つにまとめる
for (var i = 0; i < 30; i++) {
  if (PPx.Extract("%'"+ cmd + i + "'")){
    strLine = strLine + "\r\n" +PPx.Extract("%'" +cmd + i + "'");
  } else {
    break;
  }
}

// ファイルに書き込み
objFileSys.CreateTextFile(fn);
var sw = new ActiveXObject("ADODB.Stream");
sw.Type = 2;
sw.charset = "utf-16";
sw.Open();
sw.WriteText(strLine,1);
sw.SaveToFile( fn, 2 );
sw.Close();

フォルダブックマークの場合


ここからは個別の話に。それぞれで、メニューを作成、表示するためのスクリプトを作成して、ブックマークをファイルに保存、再利用を実現する。

まず、PPxフォルダにbookmarkフォルダを作成。

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

bookmarkmenu.js

//!*script
// フォルダのブックマーク用メニュー

fs = PPx.CreateObject("Scripting.FileSystemObject");
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var fn = PPx.Extract('%0')+"bookmark";

// フォルダの有無をチェック
if (objFileSys.FolderExists(fn) == false) {
    PPx.Echo(fn+"は存在しません");
    PPx.Quit(-1);
}

// メニューの削除
PPx.Execute("*setcust -|M_hoehoe =");

// 静的メニューの登録
PPx.Execute('*setcust M_hoehoe:ブックマークをファイルに保存=*script %%0\Script\\alias2file.js,'+fn+'\\%%"ブックマークをファイルに保存"%%{%%|.txt%%},bookmark');
PPx.Execute('*setcust M_hoehoe:ブックマークフォルダへ移動=%%j '+ fn);
PPx.Execute('*setcust M_hoehoe:--  =');

// フォルダリストを取得し動的メニューの登録
objFolder = objFileSys.GetFolder(fn);
e = new Enumerator(objFolder.Files); 
for( ; !e.atEnd(); e.moveNext()) {
  PPx.Execute('*setcust M_hoehoe:'+e.item().Name+'=*script %%0\\Script\\file2alias.js,'+fn+"\\"+e.item().Name+",bookmark");
}

// メニューを開く
PPx.Execute("%M_hoehoe,1");

以下を編集して取り込み。

K_bookmark = { ** comment **
',' , *script %0\Script\bookmarkmenu.js
}

使い方


PPc上でC_s ,(Ctrl+Sを押してからカンマを押す)。メニューが表示される。



「ブックマークをファイルに保存」を選択すると、一行編集が出るので、保存したい名前を入力してEnter。


保存したブックマークを使いたいときは、メニュー下部のファイルから適当なものを選択。すると、エイリアスがそのファイルの内容に置き換わる。

ファイルブックマークの場合


まずは、PPxフォルダにClipフォルダを作成。

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

clipmenu.js

//!*script
// PPv用ブックマークメニュー

fs = PPx.CreateObject("Scripting.FileSystemObject");
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");
var fn = PPx.Extract('%0')+"Clip";

// フォルダの有無をチェック
if (objFileSys.FolderExists(fn) == false) {
    PPx.Echo(fn+"は存在しません");
    PPx.Quit(-1);
}

// メニューの削除
PPx.Execute("*setcust -|M_hoehoe =");

// 静的メニューの登録
PPx.Execute('*setcust M_hoehoe:ブックマークをファイルに保存=*script %%0\Script\\alias2file.js,'+fn+'\\%%"ブックマークをファイルに保存"%%{%%|.txt%%},clip');
PPx.Execute('*setcust M_hoehoe:クリップフォルダへ移動=*execute C,*jumppath '+ fn);
PPx.Execute('*setcust M_hoehoe:--  =');

// フォルダリストを取得し動的メニューの登録
objFolder = objFileSys.GetFolder(fn);
e = new Enumerator(objFolder.Files); 
for( ; !e.atEnd(); e.moveNext()) {
  PPx.Execute('*setcust M_hoehoe:'+e.item().Name+'=*script %%0\\Script\\file2alias.js,'+fn+"\\"+e.item().Name+",clip");
}

// メニューを開く
PPx.Execute("%M_hoehoe,1");

以下を編集して取込
K_clip = { ** comment **
',' , *script %0\Script\clipmenu.js
}

使い方


PPv上でC_s ,(Ctrl+Sを押してからカンマを押す)。メニューが表示される。


「ブックマークをファイルに保存」を選択すると、一行編集が出るので、保存したい名前を入力してEnter。

保存したブックマークを使いたいときは、メニュー下部のファイルから適当なものを選択。すると、エイリアスがそのファイルの内容に置き換わる。

想定している使い方とか

 
フォルダであれば、個々の作業ごとに必要なフォルダを登録して再利用するだとか、各所にある画像フォルダをまとめておくとかだろうか。

ファイルであれば、個々の作業で閲覧することになるファイルをまとめておく、とかが考えられる。

他には、リストファイルを作成されるのを利用する方法もありそう。画像なりメモファイルなりを探してる途中、気になるものがあればブックマーク。あとでそれをリストファイル化し、仮想ディレクトリ内でゆっくり選別するとか。

2014年11月25日火曜日

フォルダのブックマーク(PPxで一時ブックマーク改)


あいさつ


PPxで一時ブックマークで行ったフォルダブックマークを

  • setalias.js
  • resetalias.js
  • RotateExecute3.js

の、PPvメインの連動ビューで使った3つのスクリプトで作りなおす。*setが*aliasに変わったこと以外は、やれることはほぼ同じ。
ではなぜ、わざわざ作りなおしたのかというと、次回あたりでやりたい「ブックマークをファイルにして保存」の準備に必要だから。

スクリプト


以下の3つのスクリプトをScriptフォルダに保存。PPvメインの連動ビューのものと全く同じなので流用できる。

setalias.js
//!*script
// 第一引数 : エイリアス
// 第二引数 : マクロ

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var cmd = PPx.Arguments.Item(0);
var macro = PPx.Arguments.Item(1);

// 既に登録されていたら登録しない
for (var i = 0; i < 30; i++) {
  if (PPx.Extract("%'"+cmd + i + "'") == PPx.Extract(macro)){
    PPx.SetPopLineMessage("既に登録されてます");
    PPx.Quit();
  }
}

// エイリアスに登録
for (var i = 0; i < 30; i++) {
  if (!PPx.Extract("%'"+cmd + i + "'")){
    PPx.Execute("*alias "+cmd+i+" = "+macro);
    PPx.SetPopLineMessage(cmd+i+"に登録しました");
    break;
  }
}

resetalias.js

//!*script
// 第一引数 : エイリアス

// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var cmd = PPx.Arguments.Item(0);

// cmd0からcmd30までをリセット
for (var i = 0; i < 30; i++) {
  PPx.Execute("*alias "+cmd+i+" = ");
}

PPx.SetPopLineMessage(cmd +"をリセットしました");

RotateExecute3.js
//!*script
// 第一引数: 識別子
// 第二引数: エイリアス

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var id = PPx.Arguments.Item(0);
var command = PPx.Arguments.Item(1);

// command0があるかどうかをチェック
if (!PPx.Extract("%'"+command+"0'")){
  PPx.SetPopLineMessage("コマンドが空です");
  PPx.Quit(-1);
}

// 数値に1を足す
if (!PPx.Extract("%'"+id+"'")){
  PPx.Execute("*set "+id+" = 0");
}else {
  var i = parseInt(PPx.Extract("%'"+id+"'")) + 1;
  PPx.Execute("*set "+id+" = "+ i);
}
var i2 = PPx.Extract("%'"+id+"'");

// commandを実行
if (PPx.Extract("%'"+command+ i2 + "'")){
  PPx.Result = PPx.Extract("%'"+command+ i2 + "'");
}else{
  PPx.Execute("*set "+id+" = 0");
  PPx.Result = PPx.Extract("%'"+command+"0'");
}

設定


以下を編集して取込。
-|K_bookmark =

KC_main = { ; PPcメイン窓
^S ,*setnextkey K_bookmark
}

K_bookmark = { ** comment **
S , *script %0\Script\setalias.js,bookmark,%%1
R , *script %0\Script\resetalias.js,bookmark
^S , %j %*script("%0\Script\rotateExecute3.js","homu","bookmark")
}

使い方


C_s s(Ctrl+Sを押したあとSを押す)で、カレントフォルダをブックマークに登録できる。このとき、左上に登録したエイリアスが表示される。bookmark0、bookmark1、bookmark2と、1つずつ数値が増えているのがわかると思う。






C_s C_s(Ctrl+Sを二回押し)で、ブックマークしたフォルダに順次移動。登録した順に、bookmark0、bookmark1…と切り替わり、最後まで行くとまたbookmark0に戻る。





ブックマークをリセットしたいときは、C_s r(Ctrl+Sを押したあとRを押す)

2014年11月20日木曜日

PPvメインの連動ビュー(ブックマークをローテート)


あいさつ


ブックマークした画像ファイルやテキストファイルを、専用のPPvで開くようにします。

PPv[A]上でC_s C_s。PPv[Z]がフォーカス移動無しで起動、ブックマークしたファイルを開く



C_s C_sを押すたびに、PPv[Z]にブックマークファイルが表示される



という仕組みです。

PPcとPPvの対応関係についても考える必要があるので、それを含めて調整します。PPvをPPcと連動(ID一対一対応をやめる)から色々と変更してます。

スクリプト


必要なのは

  • setalias.js
  • resetalias.js
  • RotateExecute3.js
  • togglemark.js

の4つ。

setalias.js

//!*script
// 第一引数 : エイリアス
// 第二引数 : マクロ

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var cmd = PPx.Arguments.Item(0);
var macro = PPx.Arguments.Item(1);

// 既に登録されていたら登録しない
for (var i = 0; i < 30; i++) {
  if (PPx.Extract("%'"+cmd + i + "'") == PPx.Extract(macro)){
    PPx.SetPopLineMessage("既に登録されてます");
    PPx.Quit();
  }
}

// エイリアスに登録
for (var i = 0; i < 30; i++) {
  if (!PPx.Extract("%'"+cmd + i + "'")){
    PPx.Execute("*alias "+cmd+i+" = "+macro);
    PPx.SetPopLineMessage(cmd+i+"に登録しました");
    break;
  }
}

*script %0\Script\setalias.js,clip,%%FCDというように引数を2つ取る。第一引数がエイリアスで第二引数がマクロ。Clip0、Clip1、Clip2…と順番に、マクロを展開したものを登録する。

resetalias.js

//!*script
// 第一引数 : エイリアス

// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var cmd = PPx.Arguments.Item(0);

// cmd0からcmd30までをリセット
for (var i = 0; i < 30; i++) {
  PPx.Execute("*alias "+cmd+i+" = ");
}

PPx.SetPopLineMessage(cmd +"をリセットしました");

*script %0\Script\resetalias.js,clipというように引数を一つ取る。引数は初期化したいエイリアス。引数をclipにすると、Clip0~Clip30までを初期化する。

RotateExecute3.js

//!*script
// 第一引数: 識別子
// 第二引数: エイリアス

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var id = PPx.Arguments.Item(0);
var command = PPx.Arguments.Item(1);

// command0があるかどうかをチェック
if (!PPx.Extract("%'"+command+"0'")){
  PPx.SetPopLineMessage("コマンドが空です");
  PPx.Quit(-1);
}

// 数値に1を足す
if (!PPx.Extract("%'"+id+"'")){
  PPx.Execute("*set "+id+" = 0");
}else {
  var i = parseInt(PPx.Extract("%'"+id+"'")) + 1;
  PPx.Execute("*set "+id+" = "+ i);
}
var i2 = PPx.Extract("%'"+id+"'");

// commandを実行
if (PPx.Extract("%'"+command+ i2 + "'")){
  PPx.Result = PPx.Extract("%'"+command+ i2 + "'");
}else{
  PPx.Execute("*set "+id+" = 0");
  PPx.Result = PPx.Extract("%'"+command+"0'");
}

%*script(rotateExecute3.js,id,command)

と引数を2つ付ける。第一引数は数値をカウントするための識別子で、第二引数はエイリアス。実行するたびに、

command0 command1 command2…

と、第二引数に数字を付け足したエイリアスを順次戻り値として返す。最後のエイリアスを実行したら、またcommand0に戻るという仕組み。


togglemark.js

//!*script

PPx.Entry.Mark = -1;

Space時のマークトグルをどう再現したらいいかわからないので新たに作った。多分もっと良いやり方がある。

設定


以下を編集して取込。

-|K_clip =

K_clip = { ** comment **
S , *script %0\Script\setalias.js,clip,%%FCD
^S , %Oa %0\PPVW.EXE -bootid:z -r %*script("%0\Script\rotateExecute3.js","hoge","clip")
R , *script %0\Script\resetalias.js,clip
}

KV_main = { ; PPvメイン窓
LEFT ,*execute C,*cursor 6,-1,4,B0000,0,B0000 %: *execute C,*ppv -bootid:A -r %%*name(CD,"%%R","%%1")
RIGHT ,*execute C,*cursor 6, 1,4,B0000,0,B0000 %: *execute C,*ppv -bootid:A -r %%*name(CD,"%%R","%%1")
UP ,*execute C,*cursor 2,-1,4,B0000,5,B0000 %: *execute C,*ppv -bootid:A -r %%*name(CD,"%%R","%%1")
DOWN ,*execute C,*cursor 2, 1,4,B0000,5,B0000 %: *execute C,*ppv -bootid:A -r %%*name(CD,"%%R","%%1")
SPACE ,*execute C,*script %0\Script\togglemark.js %: *execute C,*cursor 2, 1,4,B0000,5,B0000 %: *execute C,*ppv -bootid:A -r %%*name(CD,"%%R","%%1")
\SPACE ,*execute C,*script %0\Script\togglemark.js %: *execute C,*cursor 2,-1,4,B0000,5,B0000 %: *execute C,*ppv -bootid:A -r %%*name(CD,"%%R","%%1")
Q ,*closeppx VZ
ENTER ,*closeppx V*
^S ,*setnextkey K_clip
}

E_cr = { ; [Enter]用判別
:JPEG ,
:BMP ,
:XJS ,
:XVBS ,
PNG ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
JPG ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
JPEG ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
BMP ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
GIF ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
TXT ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
CPP ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
H ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
C ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
L ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
EL ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
HTML ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
HTM ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
XYZZY ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
EMACS ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
SCM ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
INI ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
VBS ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
JS ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
PY ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
PYW ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
HOWM ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
CFG ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
KIF ,*launch %0\PPVW.EXE -bootid:A -r %*name(CD,"%R","%1")
}

これで、

  • PPcで画像ファイルやテキストファイルにカーソルをあわせてEnterを押すと、PPv[A]で表示
  • PPv[A]上でカーソルを動かすと、それに連動してアクティブPPcのカーソルが動き、対応するファイルを表示する
  • PPv[A]上でC_s sで表示ファイルをブックマーク
  • C_s C_sでPPv[Z]にブックマークファイルを順次PPv[Z]に表示。PPv[Z]が無い場合はそれを起動。PPv[Z]にフォーカスは当てない
  • QでPPv[Z]を閉じる
  • EnterでPPvを全て閉じる

となる。

使い方


PPcで画像ファイルやテキストファイルにカーソルをあわせてEnterを押すと、PPv[A]が起動。PPv[A]上でカーソルを動かすとそれにあわせてPPcのカーソルが動き、それにあわせてPPv[A]に表示されるファイルも変わる



PPv[A]で閲覧中、気になるファイルを見つけたらC_s sでブックマーク




ブックマークしたファイルを閲覧したいときは、C_s C_s。PPv[Z]がフォーカス無しで起動し、ブックマークファイル(Clip0に登録されているもの)を開く



C_s C_sとするたびに、PPv[Z]にブックマークしたファイルが順次(Clip1、Clip2…)表示される。最後までいくと、またClip0に戻る。



もう十分だと思ったら、Qを押してPPv[Z]を消す



Enterを押すと、PPv[Z]とPPv[A]が共に閉じる


テキストファイルもブックマークできるし、ブックマークにテキストファイルと画像ファイルを混在させることももちろんできる。


追記 2014/11/24


スクリプトを全体的に変更、それにあわせて設定も変更。

画像ファイルやテキストファイルをブックマーク


あいさつ


画像ファイルやテキストファイルなど、PPvで表示したファイルをブックマーク。あとで順次表示できるようにする。
以前やったPPxで一時ブックマークと同じ仕組み。

スクリプト


必要なのは、

  • setclip.js
  • resetclip.js
  • RotateExecute2.js

の3つ。RotateExecute2.jsはPPxで一時ブックマークのと全く同じだが、一応こっちにも載せておく。

setclip.js

//!*script

for (var i = 0; i < 9; i++) {
  if (PPx.Extract("%'clip" + i + "'") == PPx.Extract("*ppv -r %FCD")){
    PPx.SetPopLineMessage("既に登録されてます");
    PPx.Quit();
  }
}

for (var i = 0; i < 9; i++) {
  if (!PPx.Extract("%'clip" + i + "'")){
    PPx.Execute("*alias clip"+i+" = *ppv -r %FCD");
    PPx.SetPopLineMessage("登録しました");
    break;
  }
}

resetclip.js

//!*script

PPx.Execute("*alias clip0 = ");
PPx.Execute("*alias clip1 = ");
PPx.Execute("*alias clip2 = ");
PPx.Execute("*alias clip3 = ");
PPx.Execute("*alias clip4 = ");
PPx.Execute("*alias clip5 = ");
PPx.Execute("*alias clip6 = ");
PPx.Execute("*alias clip7 = ");
PPx.Execute("*alias clip8 = ");
PPx.Execute("*alias clip9 = ");

PPx.SetPopLineMessage("クリップをリセットしました");

RotateExecute2.js

//!*script

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var id = PPx.Arguments.Item(0);
var command = PPx.Arguments.Item(1);

// command0があるかどうかをチェック
if (!PPx.Extract("%'"+command+"0'")){
  PPx.SetPopLineMessage("コマンドが空です");
  PPx.Quit();
}

// 数値に1を足す
if (!PPx.Extract("%'"+id+"'")){
  PPx.Execute("*set "+id+" = 0");
}else {
  var i = parseInt(PPx.Extract("%'"+id+"'")) + 1;
  PPx.Execute("*set "+id+" = "+ i);
}
var i2 = PPx.Extract("%'"+id+"'");

// commandを実行
if (PPx.Extract("%'"+command+ i2 + "'")){
  PPx.Execute(PPx.Extract("%'"+command+ i2 + "'"));
}else{
  PPx.Execute("*set "+id+" = 0");
  PPx.Execute(PPx.Extract("%'"+command+"0'"));
}

登録


以下を編集して取込。
-|K_clip =
-|M_clip =

M_clip = { ** comment **
現在のファイルを登録 = *script %0\Script\setclip.js
クリップをリセット = *script %0\Script\resetclip.js
--  =
&A:%*regexp("%'clip0'","s/^.*\s(.*)/$1/") = *execute ,%'clip0'
&B:%*regexp("%'clip1'","s/^.*\s(.*)/$1/") = *execute ,%'clip1'
&C:%*regexp("%'clip2'","s/^.*\s(.*)/$1/") = *execute ,%'clip2'
&D:%*regexp("%'clip3'","s/^.*\s(.*)/$1/") = *execute ,%'clip3'
&E:%*regexp("%'clip4'","s/^.*\s(.*)/$1/") = *execute ,%'clip4'
&F:%*regexp("%'clip5'","s/^.*\s(.*)/$1/") = *execute ,%'clip5'
&G:%*regexp("%'clip6'","s/^.*\s(.*)/$1/") = *execute ,%'clip6'
&H:%*regexp("%'clip7'","s/^.*\s(.*)/$1/") = *execute ,%'clip7'
&I:%*regexp("%'clip8'","s/^.*\s(.*)/$1/") = *execute ,%'clip8'
&J:%*regexp("%'clip9'","s/^.*\s(.*)/$1/") = *execute ,%'clip9'
}

KV_main = { ; PPcメイン窓
^S ,*setnextkey K_clip
}

K_clip = { ** comment **
S , *script %0\Script\setclip.js
^S , *script %0\Script\RotateExecute2.js,hoge,clip
R , *script %0\Script\resetclip.js
',' , %M_clip
}

使い方


気に入った画像あるいはテキストファイルを見つけたら、PPv上でC_s s(Ctrl+Sを押したあとにS)で登録。


  これもあとで見よう。C_s s


別の場所でよさげな画像を見つけた。C_s s


ブックマークしたファイルを見返したいと思ったら、PPvを開いてからC_s C_s(Ctrl+Sを二度押す)。そのたびに、さっきブックマークしたファイルが順に表示される。


思ったこととか


ブックマーク表示用のPPvを別に用意しておく、というのもありそうですね。

PPv[A]でC_s C_s。すると、ブックマーク表示用のPPv[Z]をフォーカス移動無しで実行。ブックマークしたファイルを開く。



C_s C_sを押すたびに、PPv[Z]が順にブックマークファイルを表示する。






これを実現するには、さらに少し準備が必要。なのでまた次回。

2014年11月19日水曜日

PPxのリネームパターン私的まとめ


僕がPPxでリネームするときには、いくつかパターンがある。いつも「あれ?どうすればいんだっけ?」みたいに迷うので、整理のためメモ。特に新しいことはしてない。

  1. 普通にリネーム
  2. 外部ソフトに投げて一括リネーム
  3. バラバラのファイル名を統一する
  4. 頭に連番を付ける
  5. ダイアログでマークファイルを順次リネーム
くらいがありそう。

普通にリネーム





Rを押して行うリネーム。一つのファイルをリネームしたいときに。
カーソル状態他は、X_eselでいじれるらしい。僕は選択を外し、拡張子前にカーソルがいくようにしている。


外部ソフトに投げて一括リネーム




複数のファイルを一括リネームするときは、マークしてLiNameに投げる。好きなエディタでリネームできて便利。
まとめサイト他にあるBatchRename.jsを使ってもいいかも。

バラバラのファイル名を統一する




ファイル名がバラバラなのを統一したいときは、マークしてからShift+Rを押して一括リネームする。

s/.+\.(.+)/file\\.$1

とすればおk。拡張子はそのままで、それを除いたファイル名がfile+連番になる。
連番の桁数やどの数値から始めるかもリネームダイアログで調整可能。

頭に連番を付ける




一括リネームで、次のようにすればおk。マークした順番に連番を振るので、音楽ファイルの並び順を調整したいときとかに使えるかもしれない。


s/^/\\_

ダイアログでマークファイルを順次リネーム




PPXSCR.TXTに載っているサンプルを使う。

//!*script

var oldalst = PPx.Extract("%*getcust(XC_alst)");
PPx.Execute("*customize XC_alst=1,1,1,1,1");
PPx.EntryFirstMark;
do {
   if ( PPx.Execute("%K\"@R") != 0 ) break;
   PPx.EntryMark = 0;
}while( PPx.EntryFirstMark != 0 );
PPx.Execute("*customize XC_alst=" + oldalst);

2014年11月18日火曜日

動的メニューの考察


現在の設定に応じ、メニューを動的に変更する方法について考えてみる。
僕は普段、Ctrl+Enterに「拡張子判別実行」%K"@Zを割り当てている。その時は、



と「実行時にカーソルを下げる(1)」メニュー項目を表示。選択すれば、Ctrl+Enterへの割当が「拡張子判別実行をしてからカーソルを下げる」%K"@Z @DOWNに切り替わる。

もし、現在の設定で、Ctrl+Enterへの割当が「拡張子判別実行をしてからカーソルを下げる」%K"@Z @DOWNになっていれば、





と「実行時にカーソルを下げない(1)」メニュー項目を表示。選択すれば、Ctrl+Enterへの割当が「拡張子判別実行」%K"@Zに切り替わる。

スクリプト


//!*script

// メニューの削除
PPx.Execute("*setcust -|M_hoehoe =");

// メニュー項目の登録
if (PPx.Extract("%*getcust(KC_main:^ENTER)")=="@Z @DOWN"){
  PPx.Execute('*setcust M_hoehoe:実行時にカーソルを下げない(&1)=*setcust KC_main:^ENTER=@Z');
} else {
  PPx.Execute('*setcust M_hoehoe:実行時にカーソルを下げる(&1)=*setcust KC_main:^ENTER=@Z @DOWN');
}

// メニューを開く
PPx.Execute("%M_hoehoe");

思ったこととか


登録すべき適当なコマンドが他に思いつかない…。「その時々で切り替えれば便利な設定」って結構ある気がするんだけどな。
このやり方を応用すれば、「あふモード」「だいなモード」みたいに、その時々でキーバインドその他の設定を大きく、一挙に切り替えるということもできるかもという妄想。ただ俺の使い方だとあまり有用性はなさそうだ。「画像管理モード」とか「テキスト閲覧モード」とかなら案外便利…?

2014年11月15日土曜日

PPxで一時ブックマーク


あいさつ


つかさです。
今回は一時ブックマーク。実は以前にもやったことがあるのだが(PPxでブックマーク)、すぐに使わなくなった。「ブックマークをするキー」と「ブックマークへ移動するキー」で2つのキーを潰す必要があるという理由と、一々メニューを開いてそこに移動、というのが緩慢すぎるという理由による。
これを解決する方法を思いついたので試してみる。

やりたいこと


何かの作業をするために、複数のフォルダを行き来することが必要な場合がある。
利用するフォルダが2つだけなら、2窓で左右それぞれに表示すれば十分であり、特に考えることはない。だが、これが3つ、4つとなったら対応できなくなる。そのたびに一々階層を戻って表示、というのも面倒だ。
おそらく、こういう時のためにタブというものがあり、それを使えと言われそうな気がするが、今回はパス。今までのやり方の延長でやれるなら、それで済ましてしまいたいのだ。

そこで、

  • 特定のキーを押せば現在のフォルダをブックマーク
  • 別のキーを押せば、ブックマークしたフォルダを順番に表示する

仕組みを作ってみる。

スクリプト


以下の3つのスクリプトをScriptフォルダに保存。

setbookmark.js
//!*script

for (var i = 0; i < 9; i++) {
  if (PPx.Extract("%'bookmark" + i + "'") == PPx.Extract("*jumppath %1")){
    PPx.SetPopLineMessage("既に登録されてます");
    PPx.Quit();
  }
}

for (var i = 0; i < 9; i++) {
  if (!PPx.Extract("%'bookmark" + i + "'")){
    PPx.Execute("*set bookmark"+i+" = *jumppath %1");
    PPx.SetPopLineMessage("登録しました");
    break;
  }
}

ブックマーク登録用のスクリプト。これを実行すると、bookmark0、bookmark1、bookmark2…というように、空のブックマークに現在のパスを順次登録していく。すでに登録されてたら登録しない。


rotateExecute2.js
//!*script

// 引数がなければ終了
if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

var id = PPx.Arguments.Item(0);
var command = PPx.Arguments.Item(1);

// command0があるかどうかをチェック
if (!PPx.Extract("%'"+command+"0'")){
  PPx.SetPopLineMessage("コマンドが空です");
  PPx.Quit();
}

// 数値に1を足す
if (!PPx.Extract("%'"+id+"'")){
  PPx.Execute("*set "+id+" = 0");
}else {
  var i = parseInt(PPx.Extract("%'"+id+"'")) + 1;
  PPx.Execute("*set "+id+" = "+ i);
}
var i2 = PPx.Extract("%'"+id+"'");

// commandを実行
if (PPx.Extract("%'"+command+ i2 + "'")){
  PPx.Execute(PPx.Extract("%'"+command+ i2 + "'"));
}else{
  PPx.Execute("*set "+id+" = 0");
  PPx.Execute(PPx.Extract("%'"+command+"0'"));
}

*RotateExecuteに似た何か。引数を2つ取る。引数が足りない場合は何もしない。

rotateExecute2.js,id,command

第一引数は現在何番目を実行したかを記憶する識別子。

これを実行すると、

command0 command1 command2…

というように、第二引数に数字を付け足したマクロを順次実行していく。最後のマクロを実行したら、またcommand0に戻るという仕組み。

これを利用することで、

bookmark0 bookmark1 bookmark2…

というように、先に登録したブックマークを順次実行することが可能になる。

resetbookmark. js
//!*script

PPx.Execute("*set bookmark0 = ");
PPx.Execute("*set bookmark1 = ");
PPx.Execute("*set bookmark2 = ");
PPx.Execute("*set bookmark3 = ");
PPx.Execute("*set bookmark4 = ");
PPx.Execute("*set bookmark5 = ");
PPx.Execute("*set bookmark6 = ");
PPx.Execute("*set bookmark7 = ");
PPx.Execute("*set bookmark8 = ");
PPx.Execute("*set bookmark9 = ");

PPx.SetPopLineMessage("ブックマークをリセットしました");

登録したブックマークをリセットするスクリプト。

登録


以下を編集して取込。
-|K_bookmark =
-|M_bookmark =

M_bookmark = { ** comment **
現在のディレクトリを登録 = *script %0\Script\setbookmark.js
ブックマークをリセット = *script %0\Script\resetbookmark.js
--  =
&A:%*regexp("%'bookmark0'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark0'
&B:%*regexp("%'bookmark1'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark1'
&C:%*regexp("%'bookmark2'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark2'
&D:%*regexp("%'bookmark3'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark3'
&E:%*regexp("%'bookmark4'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark4'
&F:%*regexp("%'bookmark5'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark5'
&G:%*regexp("%'bookmark6'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark6'
&H:%*regexp("%'bookmark7'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark7'
&I:%*regexp("%'bookmark8'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark8'
&J:%*regexp("%'bookmark9'","s/^.*\s(.*)/$1/") = *execute ,%'bookmark9'
}

KC_main = { ; PPcメイン窓
^S ,*setnextkey K_bookmark
}

K_bookmark = { ** comment **
S , *script %0\Script\setbookmark.js
^S , *script %0\Script\RotateExecute2.js,homu,bookmark
R , *script %0\Script\resetbookmark.js
',' , %M_bookmark
}

  • C_s s    ブックマークに登録
  • C_s C_s    ブックマークに移動
  • C_s r    ブックマークをリセット
  • C_s ","    ブックマークメニューを開く

となる。

PPxを終了してもリセットしたくないなら


*setのかわりに*aliasを使うと、PPxを終了しても、登録したブックマークがリセットされない(参考:PPxでブックマーク)。どっちがいいのかは難しいところ。

2014年10月19日日曜日

一時コマンド+たまに使うコマンドメニュー


挨拶


「普段は使わないが、たまに使いたくなるコマンド」というものがある。

  • カーソル下のフォルダの階層を減らしたい(*chopdir %FCD)
  • カーソル下のファイルの文字数をカウントしたい(*script %0\Script\wordcount.js)
  • 両窓でファイルを比較したい(*comparemark 23,B00111,0)

などなど。これらについては、一々どこかのキーに割り振っても、普段使わないからどうせ忘れてしまう。

また、これらを小物メニューとしてまとめて何かのキーに割り振る、というのもしたくない。例えば*chopdirは、使用する必要があるときは連続で使用したい場合が多い。マトリョーシカみたいにフォルダの中にフォルダが入っている状況で、それを整理したい時など。このようなときは、そのフォルダをワンキーでチョップしまくりたい。一々メニューを出して選択して、を繰り返すのは億劫だ。

そこで、これまでは、一時コマンドにこれらのコマンドを登録して使う、ということをしていた(参考:一時的にキーにコマンドを登録)。だが、一々コマンドを思い出すなり調べるなりしてから打ち込む、というプロセスを挟む必要があるのが面倒だった。

そこで


このプロセスをメニューで省略することにする。

一時的にキーにコマンドを登録 では、

1.C-z z(Ctrl+Zを押したあとZを押す)で一行編集を出し、コマンドをセット



2.C-z C-z(Ctrl+Zを二回押し)でセットしたコマンドを実行

の二段階により、一時的に使用したいコマンドを実行していた。

ここに今回新たに、

  • たまに使うコマンドを集めたメニューを作成、それを選択すれば一時コマンドにセットされる

プロセスを追加する。これで、よく使うコマンドを一々思い出して打ち込む必要が無くなる。

メニューで選択して一時コマンドをセット、連続して実行してる時は、その時々の状況に応じて、火属性のカード、あるいは水属性のカードをメインウェポンのデッキに装着。すると、メインウェポンからはそれに応じた攻撃魔法が出るようになるので、パシュパシュ打ち込む、みたいなのをイメージしてる(カッコイイ)。

やりかた


以下を編集して取込

-|K_launcher =
-|M_launchmenu =

M_launchmenu = { ** comment **
&addmenu = *set name=%"登録名を入力してください"%{test%} %: *setcust M_launchmenu:%'name'=*alias temp_cmd = %'temp_cmd'
-- = 
&chopdir = *alias temp_cmd = *chopdir %%FCD
文字数カウント = *alias temp_cmd = *script %%0\Script\wordcount.js
ファイルの比較 = *alias temp_cmd = *comparemark 23,B00111,0
}

KC_main = { ; PPcメイン窓
^Z ,*setnextkey K_launcher
}

K_launcher = { ** comment **
Z ,*alias temp_cmd = %"一時コマンド"%{%'temp_cmd'%}
^Z ,*execute ,%'temp_cmd'
',' ,%M_launchmenu,a
}


M_launchmenuに、たまに使いたいコマンドを幾つか登録してます。このメニューに登録したコマンドをセットしたいときは、C_z,","(Ctrl+Zを押してから、","を押す)。するとメニューが出るので、適当なものを選択。



すると、一時コマンドのエイリアスがこれに置き換わります。C_z,z(Ctrl+Zを押してからZを押す)で一行編集を開けば、一時コマンドが置き換わってるのが分かるはず。例えばchopdirを選んだのなら



こうなる。

あとは、C_z,C_z(Ctrl+Zを二回押し)で実行するだけ。

また、addmenuで、今一時コマンドにセットしているコマンドを新たにメニューに追加できるようにしている。


追記 2014-10-23


一時コマンドに%0などのマクロが含まれていると、addmenu時にそれが展開されてしまうようだ。例えば

*script %0\Script\hoge.js


*script D:\PPx\Script\hoge.js

として登録されてしまう。
これを避けるためには、addmenuの箇所を以下のようにかえる。
&addmenu = *set name=%"登録名を入力してください"%{test%} %: *setcust M_launchmenu:%'name'=*alias temp_cmd = %*regexp(%'temp_cmd',"s/%%/%%%%/")

%を%%に置換しているだけ。

2014年10月15日水曜日

文字数のカウント

カーソル上のテキストファイルの文字数をカウントするスクリプト。文字数を気にする類の文章を書いている時に使えるかもしれない。

やり方


以下をScriptフォルダに保存

wordcount.js

//!*script

var objItem = PPx.Extract("%FCD");
var objFileSys = new ActiveXObject("Scripting.FileSystemObject");

// .txtか.howm以外なら終了
if (!objFileSys.GetExtensionName(objItem).match(/txt$|howm$/i)) {
  PPx.Quit();
}

objInFile = objFileSys.OpenTextFile(objItem, 1);
PPx.Execute("*linemessage " + objInFile.ReadAll().length);
objInFile.Close();


以下のコマンドを適当なキーに登録する。

*script %0\Script\wordcount.js


PPc上で実行すれば、情報行に文字数が表示される。




PPv上でも実行可能。


2014年10月3日金曜日

PPvのフォントサイズ変更を記憶

PPvでは、INSキーを押すとフォントサイズが拡大し、DELを押すと縮小する。これは一時的であり、一度PPvを終了すると元の大きさに戻ってしまう。
そこで、終了しても変更したフォントサイズを記憶するようにする。


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

fontfix.js

//!*script 
// 第一引数がpならPPvのフォントを大きく
// 第一引数がmならPPvのフォントを小さく


// 引数がなければ終了
if (PPx.Arguments.Length < 1){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

// 現在のフォントサイズを取得
var hoge = PPx.Extract("%*getcust\(F_fix\)").split( "," );
var i = parseInt(hoge[0]);

// フォントサイズの箇所を入れ替える
hoge.shift();
if (PPx.Arguments.Item(0) == "m"){
  hoge.unshift(i + 1);
} else if (PPx.Arguments.Item(0) == "p"){
  hoge.unshift(i - 1);
} else {
  hoge.unshift(i);
}

// 部分カスタマイズを実行
PPx.Execute("*setcust F_fix =" + hoge);


以下を編集して取込。

KV_page = { ; PPvテキスト(ページ)追加設定
INS ,%K"@INS" %: *script %0\Script\fontfix.js,p
DEL ,%K"@DEL" %: *script %0\Script\fontfix.js,m
}

2014年9月21日日曜日

フォルダを作成してそこにマークしたファイルを移動


カレントフォルダにフォルダを作成し、そこにマークしたファイルを移動する。

ファイル整理をしてるときに使えるかも。画像ファイルのカテゴリー分けとか、文書やメモの分類とか、そういう時ですね。


やり方



以下を編集して取込

KC_main = { ; PPcメイン窓
&M ,*set name=%1\%"ディレクトリ作成"%{%*nowdatetime(Y-N-D-HMS)%} %: *makedir "%'name'" %: *file !Move,,"%'name'"
}


Alt+Mを押すと一行編集が出るので、フォルダ名を入力してEnter



すると、フォルダを作成し、そこにマークファイルが移動する


2014年9月11日木曜日

PPxをポータブル化


あいさつ


PPxをポータブルで使う方法。ポータブル化して、USBにいれておけば出先で使えて何かと便利かもしれない。

僕のUSBメモリの中身はこんなの。とりあえずファイラとエディタが使えれば満足。




基本


UNICODE版の場合は、「ユーザ名\AppData\Roaming\TOROID\PPx」にある「PPWC~.DAT」と「PPWH~.DAT」をPPxフォルダにコピーし、それぞれ「PPWCDEF.DAT」「PPWHDEF.DAT」とリネームする。

これが面倒だという場合は、PPxフォルダに空ファイルでPPWCDEF.DAT(Multibyte版ならPPXCDEF.DAT)を作成するだけでもいい。ただし、設定が初期化されるので、カスタマイザーの「テキストに書出」でPPX.CFGを作成してあらかじめ設定を保存しておく。

PPxフォルダに空ファイルのPPWCDEF.DATがある状態で、PPxを起動すると


このようなダイアログが出て、設定が初期化されるので、カスタマイザーの「テキストの取込」で先に作成したPPX.CFGを取り込む。



ファイルタブの下を見ると、Customize fileの場所がPPxフォルダのPPWCDEF.DATになってるはず。

外部ソフト


USBメモリに入れている他のソフトを使いたい、という場合。
例えば僕は、Emacsをポータブル化してPPxと同階層に置いている。

ルート
├─CatMemoNote
├─emacs
├─Palemoon-Portable
└─PPx2window

ドライブ名は環境によって変わることになるが、

%*name(H,%0)

で取得できる。ので、次のようにしてエディタのパスを指定する。

A_exec    = {    ; エイリアス
editor    = %*name(H,%0)\emacs\bin\runemacs.exe
}


壁紙の設定


PPxフォルダに壁紙用の画像(kabegami.jpg)を入れ、それを壁紙にするようにする。


以下を編集して取込。

KC_main = {
FIRSTEVENT , *customize X_bg:Path=%0\kabegami.jpg
}

2014年9月2日火曜日

PPvでいろいろな設定

あいさつ


最近はこのようにしてPPvを使っている。

最大化。左右に表示。そして、基本的にはPPv上で作業できるようにする。




これに追加して、さらにPPv上から出来る作業を増やしてみる。

移動とコピー



マークしたファイルを反対窓に移動、あるいはコピーする。


KV_main = { ; PPvメイン窓
M ,*file Move,%*extract(C"%%@*8FCDN"),%*extract(C"%%2") %: *execute C,*jumppath /savelocate /entry:"%R" /refreshcache
C ,*file Copy,%*extract(C"%%@*8FCDN"),%*extract(C"%%2")
}


反対窓でマークしたファイルを現在窓に移動とコピー



反対窓でマークしたファイルを現在窓に移動/コピー

でやったことをPPvからする。


KV_main = { ; PPvメイン窓
\M ,*file move,%*extract(~"%%@*8FCDN"),%*extract(C"%%1")
\C ,*file copy,%*extract(~"%%@*8FCDN"),%*extract(C"%%1")
}


カーソル上の拡張子でマスク





KV_main = { ; PPvメイン窓
I ,*execute C,*maskentry *.%T
}

PPcのマーククリア


両窓で更新する。
KV_main    = {    ; PPvメイン窓
^F5    ,*execute C,*jumppath /savelocate /entry:"%R" /refreshcache %: *execute ~,*jumppath /savelocate /entry:"%R" /refreshcache
}


2画面のとき両窓それぞれのファイル表示





右窓からPPvを表示している状態。ここでCtrl+Tabを押すと


左窓にカーソルが移り、PPvが左窓カーソル下のファイルを表示する。


TabView.js

//!*script 

if (PPx.GetComboItemCount == 0){
  PPx.Quit();
} else {
  PPx.Execute('%KC"@TAB" %: %K~"@N"');
}

KV_main = { ; PPvメイン窓
^TAB ,*script %0\Script\TabView.js
}


サムネイル表示トグル



一覧表示とサムネイル表示でトグルする。



KV_main = { ; PPvメイン窓
',' ,*execute C,*RotateExecute id,*viewstyle 一覧1(&L),*viewstyle サムネイル1(&T)
}

F6でのMakeComment.js


現在窓でMakeComment.jsを実行する。


KV_main = { ; PPvメイン窓
F6 ,*execute C,*script %0\Script\MakeComment.js
}

フォルダジャンプ



C_x dでhowmフォルダにジャンプする。
他の2ストロークキーと一緒に登録。

-|K_ppv =

KV_main = { ; PPvメイン窓
^X ,*setnextkey K_ppv
}

K_ppv = { ; 2ストローク目
D ,*execute C,*jumppath "G:\howm" %: %KC "@N"
H ,%Ob D:\bin\xyzzy\xyzzy.exe -e (howm-create2dir) G:\howm
^Z ,%KC"@BS @N"
^X ,*script %0\Script\PPvChangeDir.js
}

フォルダの作成


現在窓にフォルダを作成する。




KV_main = { ; PPvメイン窓
K ,*set name=%1\%"ディレクトリ作成"%{%*nowdatetime(Y-N-D-HMS)%} %: *execute C,*makedir "%'name'" %: *execute C,*jumppath "%'name'" /entry
}

コメントの変更



Ctrl+Rでカーソル下のファイルのコメントを編集する。



KV_main = { ; PPvメイン窓
^R ,*set name=%"コメントの編集"%{%*extract(C"%%*comment")%} %: *execute C,*comment "%'name'"
}

2014年8月30日土曜日

PPxで画像管理ソフト的な動きをする(同階層のフォルダを閲覧)


あいさつ



画像ファイルやメモファイルを閲覧しているとき、隣り合ったフォルダを順番に移動したい、という場合がある。

画像フォルダ
├─gununu
├─てさ部
├─ひだまりスケッチ
└─輪るピングドラム

こんな風に画像ファイルをフォルダ分けして保存しているとして、ひだまりフォルダを閲覧してるけど隣のピングドラムフォルダを閲覧したい、あるいは何か気に入ったファイルがないか、画像フォルダ内のフォルダを順番に閲覧したい、という場合です。

これを、 2画面PPxで、左右の窓で役割を分担することで行う。

やり方



以下を編集して取込

E_preview = { ** comment **
:DIR ,*execute ~,*jumppath %FCD
}

E_preview2 = { ** comment **
:DIR ,*execute C,*jumppath %FCD %: %KC "@N"
}

KC_main = { ; PPcメイン窓
^UP ,%K "@UP" %: %ME_preview
^DOWN ,%K "@DOWN" %: %ME_preview
}

KV_main = { ; PPcメイン窓
^UP ,%K~ "@UP" %: *execute ~,%%ME_preview2
^DOWN ,%K~ "@DOWN" %: *execute ~,%%ME_preview2
}

左窓(反対窓にカーソル下のフォルダの内容を表示)



左窓で、内容を順次表示させたいフォルダがあるフォルダを開きます。以下は、画像フォルダにあるフォルダの内容を順次確認したい、という場合。



左窓でCtrl+カーソルキー下を押す。すると、左窓カーソル下のフォルダの内容が、右窓に表示される。





このように、隣り合っているフォルダの内容を簡単に閲覧することができる。



ビューア(PPvからフォルダ切り替え)


先のやり方で気になったファイルをgununuフォルダに見つけ、右窓に行って画像ファイルをPPvで閲覧しているとする(参考:PPvをPPcと連動(ID一対一対応をやめる))。その時に、「ぐぬぬ画像はもういいや、同じ階層の別フォルダの画像ファイルを見たい」と思ったら、PPv上でCtrl+カーソル下を押す。

すると左窓のカーソルが下がり、左窓カーソル下のフォルダの内容が右窓に表示される。かつPPvの表示ファイルも切り替わる。







さっき左窓でやってたことをPPv上からやってるだけですね。


テキストファイルの場合


画像管理の他には、テキストファイルで書いたメモの閲覧にも使えそう。フォルダ分けしてあるメモを、順次見ていくことができる。





1画面と2画面


今回やったのは、2画面という特性がないとできないことだった。他には、「左右窓で同ファイルが無いか調べてマーク」というのも2画面で無いと不可能ですね。

ファイル移動やコピーが直感的にできて楽、という以外にも、2画面ということ自体を生かしたカスタマイズが他にもあるかもしれない。意識的に追求してみてもいいかも、と思った。

ちなみに、1画面でこれを実現しようとするなら、次のようなスクリプトを使う。

//!*script

fs = PPx.CreateObject("Scripting.FileSystemObject");
fn = PPx.Extract("%1");
currentDir = fs.GetFolder(fn);

// 同階層のフォルダリストを取得
e = new Enumerator(currentDir.ParentFolder.SubFolders); 
flds = new Array(); 
for( ; !e.atEnd(); e.moveNext()) {
  fuga = fs.GetFolder(fs.BuildPath(currentDir.ParentFolder.Path, e.item().Name));
  if (fuga.Attributes <= 17) flds.push(e.item().Name);
} 

// アルファベット順にソート
flds.sort(function(a, b){return a.toLowerCase()>b.toLowerCase()?1:-1;}); 

// カレントフォルダがリストの何番目かを計算
for(i=0; i < flds.length; i++) {
  if( flds[i] == currentDir.Name ) break;
} 

// 次のフォルダのフォルダ名をリストから取得
nextDir = flds[Math.min(i+1, flds.length-1)];

// カレントフォルダがリスト最後なら最初にループ
if (nextDir == currentDir.Name)nextDir = flds[0];
hoge = fs.GetParentFolderName( fn );

// パスを変更
PPx.Execute("*jumppath \"" + fs.BuildPath(hoge, nextDir) + "\"");

2chにあったやつほぼそのままです(Paper Plane xUI Part.4の219)。サブフォルダの一覧を取得し、同階層の次のフォルダを表示するスクリプト。ただ、PPcのソート状態を反映させることなどは無理で、少し使い勝手が悪い。