やりたいのは、今いるフォルダを軸にしたフォルダ移動。
具体的には
- 親フォルダへの移動
- 隣り合ったフォルダへの移動
などができればいい。これをスクリプトを用いて実現する。
ちなみにファイル名の補完については、デフォルトでも一行編集で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の連携 - つかさのほえほえ日記)
問題として対象化したことだし、 これからぼちぼちいければいいかな、と。






