やりたいのは、今いるフォルダを軸にしたフォルダ移動。
具体的には
- 親フォルダへの移動
- 隣り合ったフォルダへの移動
などができればいい。これをスクリプトを用いて実現する。
ちなみにファイル名の補完については、デフォルトでも一行編集で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+↓で隣り合ったフォルダ
のパスに切り替えることができる。
たとえば隣り合ったフォルダに行きたい時には、
- Gで一行編集(今いるフォルダパスが入力されているはず)を表示
- Ctrl+↑あるいはCtrl+↓でジャンプしたいサブフォルダのパスにして
- Enterで移動
上の階層のフォルダに行きたい時は
- Gで一行編集(今いるフォルダパスが入力されているはず)を表示
- Ctrl+←でそのフォルダがあるフォルダに行き
- フォルダ名の一部を入力、TabやInsで補完してEnter
思ったこととか
改善点とかもっと適切なやり方は他にあると思っている。
この手の問題意識はずっと前から持ってて、そもそもほえほえ日記を作ったきっかけが、あふ+fenrirでステップイン・ステップアウトする方法を思いついて、どこかに書いてみたかったからだったりする。(あふとfenrirの連携 - つかさのほえほえ日記)
問題として対象化したことだし、 これからぼちぼちいければいいかな、と。