2014年5月9日金曜日

PPvをPPcと連動(ID一対一対応をやめる)

あいさつ


僕は、連動ビューをPPv中心にできるよう設定している。PPv上でカーソル操作をすれば、それにあわせてPPcのカーソルが動き、対応するファイルをPPvで表示。PPcを中心にするデフォルトの連動ビューの逆ですね。
その際、PPcとPPvのIDを一対一対応させていた(PPcとPPvのIDを一対一対応させる)。だが、最近この一対一対応があまり有効に機能せず、むしろ制限になっている気がしてきている。

メリット


IDを対応させることのメリットとして最初に想定していたのは

  1. 複数のPPvそれぞれで連動ビューが可能
  2. 連動ビューを一時中断した後の再開が可能

の2つ。

だが、僕の使い方で連動ビューが有効に機能するためには、窓の位置関係として





このように重なっていることが必須。間に別のウィンドウが挟まってはダメなわけだ。そしてこれは、窓を複数開くことで必ず崩れてしまう。





崩れた場合、連動ビューをしても、他のウィンドウに隠れている部分でPPcのカーソルが動いているのが少し見えるだけ。こうなるともう連動ビューの意味が無い。PPvからの連動ビューは、アクティブなPPcからPPvを起動したその瞬間にしか機能しないのだ。

というわけで、基本的に連動ビューというのは、一度そのPPvからフォーカスをはずしたなら使えなくなると考えるべき。だとすると、最初の頃想定していたメリットというのはほとんどないことになってしまう。

  1. 複数のPPcを開いたとするなら、その時点で少なくとも一対のPPc-PPvの関係は崩れているはず。
  2. 一時中断したのなら、その間にした作業によって、同じく窓間の関係は崩れているだろう。

デメリット


ID一対一対応のデメリットは、使えるPPvの数が限定されてしまうこと。この方法だと、PPvの数は必ずPPcの数以下になってしまうわけだ。そして、それゆえにPPvの用途が限定されてしまう。例えば、複数のPPvを見比べるということができない。

というわけで、IDの一対一対応をやめることにする。

やり方


以下を編集して取込。

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

KV_main = { ; PPvメイン窓
ENTER ,%K"@Q"
Q ,*script %0\Script\PPvClose.js
P ,*launch %0\PPVW.EXE "%1\\%R"
LEFT ,*execute C,*cursor 6, -1 %: %KC"@N"
RIGHT ,*execute C,*cursor 6, 1 %: %KC"@N"
UP ,%KC "@UP @N"
DOWN ,%KC "@DOWN @N"
}

基本的には一対一対応させる前と同じ(PPvのファイル切り替えをカーソル上下左右で)。Enterを押せば、PPcのIDに関係なく、そのたび新しいIDのPPvを起動。PPv上のカーソル操作は、アクティブなPPcと連動させる。

追加の機能として、

  • PPvでPを押せば新たにPPvを起動
  • Enterを押せばPPvを閉じる
  • Qを押せば、PPvを閉じて別のPPvにフォーカスを当てる

ようにした。

想定動作


例えば画像ファイルを閲覧したいとする。画像フォルダに行ってEnterを押し、PPv[A]を起動。カーソルを上下左右させて、よさげな画像が無いか探す。



これだ!というのを見つけたらPを押す。すると、先ほどと同じファイルパスでPPv[B]が新たに起動。次はこのPPvで連動ビューを続ける。



またよさげな画像を見つけたら、またPを押す。



これを繰り返すことで、PPvを並列することができる。




過去に書いたスクリプトで関連してそうなのを複数表示したいだとか、過去に書いたメモを複数表示したいとか、そういうのに使えそう。

PPvClose.js


Qに登録したPPvClose.jsは、PPvを閉じたあとに別IDのPPvにフォーカスを当てるスクリプト。
PPvからカーソル移動をすると、PPvを閉じた時のフォーカスがPPcに移ってしまう。これだとまずい場合があるので、これを用意した。

PPvClose.js

//!*script

// 逆順にたどる。Z to A
// 実行元のPPvIDを文字コードに変換
var useppv = PPx.Extract('%n').slice(1).charCodeAt(0);

PPx.Execute("%K\"@Q\"");

// 実行元PPvよりアルファベット順で前のPPvがあればフォーカスを移す
for (var i = useppv -1 ; i > 64; i--) {
  ppvid = String.fromCharCode(i);
  if (PPx.Extract('%NV' + ppvid).match(/.+/)) {
    PPx.Execute("*focus V" + ppvid);
    PPx.Quit(-1);
  }
}

// 実行元PPvよりアルファベット順で後ろのPPvがあればフォーカスを移す
for (var i = 90; i > useppv; i--) {
  ppvid = String.fromCharCode(i);
  if (PPx.Extract('%NV' + ppvid).match(/.+/)) {
    PPx.Execute("*focus V" + ppvid);
    PPx.Quit(-1);
  }
}

0 件のコメント:

コメントを投稿