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でブックマーク)。どっちがいいのかは難しいところ。

0 件のコメント:

コメントを投稿