2014年1月29日水曜日

PPxでステップイン・ステップアウトをしたい② 一行編集の利用


やりたいのは、今いるフォルダを軸にしたフォルダ移動。
具体的には

  • 親フォルダへの移動
  • 隣り合ったフォルダへの移動

などができればいい。これをスクリプトを用いて実現する。
ちなみにファイル名の補完については、デフォルトでも一行編集でTabキーやInsキーで可能。


やり方


以下の4つのファイルをScriptフォルダに保存。2chのPaper Plane xUI Part.4にあったスクリプトを参考にした。

GoParentDir.js
//!*script

fs = PPx.CreateObject("Scripting.FileSystemObject"); 
fn = PPx.Extract("%*edittext");

if( !fs.FolderExists(fn) ) PPx.Quit(1); 
//  パスから親の階層のパスを取得
currentDir = fs.GetFolder(fn);
if( currentDir.IsRootFolder ) PPx.Quit(1);

if( currentDir.ParentFolder.IsRootFolder ){
  PPx.Execute("*replace \"" + fs.GetParentFolderName( currentDir ) + "\"");
} else {
  PPx.Execute("*replace \"" + fs.GetParentFolderName( currentDir ) + "\\\"");
}

PPx.Execute("%K\"@^PDOWN\"");

GoSubDir.js
//!*script


fs = PPx.CreateObject("Scripting.FileSystemObject");
// 一行編集の内容を取得
fn = PPx.Extract("%*edittext");

// サブフォルダのリストを取得
if( !fs.FolderExists(fn) ) PPx.Quit(1); 
currentDir = fs.GetFolder(fn);
e = new Enumerator(currentDir.SubFolders); 
flds = new Array(); 
for( ; !e.atEnd(); e.moveNext()) {
  fuga = fs.GetFolder(fs.BuildPath(fn, e.item().Name));
  if (fuga.Attributes <= 17) flds.push(e.item().Name);
}
// 名前順でソート
flds.sort(function(a, b){return a.toLowerCase()>b.toLowerCase()?1:-1;}); 

// 一行編集の内容を最初のサブフォルダに置き換え
PPx.Execute("*replace \"" + fs.BuildPath(fn, flds[0]) + "\"");
PPx.Execute("%K\"@^PDOWN\"");

NextDir.js
//!*script


fs = PPx.CreateObject("Scripting.FileSystemObject");
// 一行編集の内容を取得
fn = PPx.Extract("%*edittext");
currentDir = fs.GetFolder(fn);

// 親フォルダがルートフォルダなら終了
if( currentDir.IsRootFolder ) PPx.Quit(1);

// 同階層のフォルダのリストを取得
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)];

// 一行編集の内容を置き換え
PPx.Execute("*replace \"" + fs.BuildPath(fs.GetParentFolderName( fn ), nextDir) + "\"");
PPx.Execute("%K\"@^PDOWN\"");

PrevDir.js
//!*script


fs = PPx.CreateObject("Scripting.FileSystemObject");
// 一行編集の内容を取得
fn = PPx.Extract("%*edittext");

// フォルダが存在しなければ終了
if( !fs.FolderExists(fn) ) PPx.Quit(1); 
currentDir = fs.GetFolder(fn);
// 親フォルダがルートフォルダなら終了
if( currentDir.IsRootFolder ) PPx.Quit(1);

// 同階層のフォルダのリストを取得
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.max(i-1, 0)];

// 一行編集の内容を置き換え
PPx.Execute("*replace \"" + fs.BuildPath(fs.GetParentFolderName( fn ), nextDir) + "\"");
PPx.Execute("%K\"@^PDOWN\"");


以下を編集して取込。
KC_main = { ; PPcメイン窓
G ,%j%ee%"パスを変更"%{%1%|%}
}

K_edit = { ; 一行編集
^LEFT ,*script %0\Script\GoParentDir.js
^RIGHT ,*script %0\Script\GoSubDir.js
^UP ,*script %0\Script\PrevDir.js
^DOWN ,*script %0\Script\NextDir.js
}


これで、一行編集上で

  • Ctrl+←で親フォルダ
  • Ctrl+→でサブフォルダ
  • Ctrl+↑ or Ctrl+↓で隣り合ったフォルダ

のパスに切り替えることができる。

たとえば隣り合ったフォルダに行きたい時には、

  1. Gで一行編集(今いるフォルダパスが入力されているはず)を表示
  2. Ctrl+↑あるいはCtrl+↓でジャンプしたいサブフォルダのパスにして
  3. Enterで移動


上の階層のフォルダに行きたい時は

  1. Gで一行編集(今いるフォルダパスが入力されているはず)を表示
  2. Ctrl+←でそのフォルダがあるフォルダに行き
  3. フォルダ名の一部を入力、TabやInsで補完してEnter
といった感じ

思ったこととか


改善点とかもっと適切なやり方は他にあると思っている。
この手の問題意識はずっと前から持ってて、そもそもほえほえ日記を作ったきっかけが、あふ+fenrirでステップイン・ステップアウトする方法を思いついて、どこかに書いてみたかったからだったりする。(あふとfenrirの連携 - つかさのほえほえ日記
問題として対象化したことだし、 これからぼちぼちいければいいかな、と。

0 件のコメント:

コメントを投稿