Finderのリスト表示で選択アイテムの階層にペースト、あるいは新規フォルダの作成を行う
些細なことかもしれないが、OS9以前からのMacOSの継続した仕様なのだが、個人的にはどうしても納得できない使い難い機能がある。
まずはFinderでリスト表示の時にフォルダを新規作成する状況を考えてみる。
- 以下の状況で「新規フォルダ」を作成した時、
- 自分としては、選択中の新規フォルダの中に「新規フォルダ」が追加されることを期待する。
- ところが現実は、リスト表示しているウィンドウの階層に「新規フォルダ」追加された。結構がっかりする。
- 特に、ウィンドウがスクロール可能な状況の場合、表示領域外で「新規フォルダ」が追加される可能性が高く、元の選択アイテムの位置に戻るのが面倒だったりする。
この状況は、ファイルやフォルダをコピー&ペーストする時も同じで、何らかのリストアイテムを選択していたとしても、リスト表示しているウィンドウの階層に対してのペースト処理になる。
GUIを操作する自分の感覚としては、選択されたアイテムに対して作用する処理を実行している気持ちなので、この仕様はすごく不自然に感じる。非常に使い難い。
やはり、Path Finderのように、リスト表示であっても選択アイテムに対して作用する処理になってもらいたいものだ。
目指すFinderの仕様
リスト表示であっても...
- ファイルを選択中は、そのファイルと同じ階層にペースト、あるいは新規フォルダの作成を行う。
- フォルダを選択中は、そのフォルダの中にペースト、あるいは新規フォルダの作成を行う。
- アイテムが複数選択されている場合は、アクティブなウィンドウに対しての操作になる。
- アイテムが選択されていない場合も、アクティブなウィンドウに対しての操作になる。
- アクティブなウィンドウが存在しない場合は、デスクトップに対しての操作になる。
- 新規フォルダを作成する時は、先にフォルダ名を入力してもらう。
選択アイテムの階層にペースト
- いつものAppleScript&Quicksilver作戦でやってみた。
--paste_at_selection.scpt tell application "Finder" if frontmost is false then --Finderがアクティブでない時は処理しない return else --activate end if try --クリップボードにファイルが含まれない時は処理しない «class hfs » of (the clipboard as record) on error beep return end try set current_folder to folder of front window -- ウィンドウがアクティブでなくても、一番上のウィンドウを返す set target_folder to insertion location -- ウィンドウがアクティブない場合、デスクトップを返す if (target_folder as alias) is not equal to (desktop as alias) then try --複数選択されていた場合、何も選択していない場合はエラーになる set target_folder to folder of (selection as alias) set target_class to class of (item 1 of (selection as list)) if target_class is folder then set target_folder to (selection as alias) tell application "System Events" key down command key code 124 key up command end tell end if on error set target_folder to current_folder end try end if try --アクセス権がない場合はエラーになる --set target of Finder window 1 to target_folder open target_folder tell application "System Events" delay 0.5 keystroke "v" using command down delay 0.5 end tell --set target of Finder window 1 to current_folder if target_class is folder then close window 1 on error if target_class is folder then close window 2 beep display dialog "コピーを完了できません。\nファイル名が重複している、または\nアクセス権がない可能性があります。" buttons {"OK"} default button {"OK"} with icon stop giving up after 10 end try end tell
選択アイテムの階層に新規フォルダを作成
- 不要な部分もあるが、上記ペースト時のスクリプトを流用してやってみた。
--new_folder_at_selection.scpt tell application "Finder" if frontmost is false then --Finderがアクティブでない時は処理しない beep return end if set current_folder to folder of front window -- ウィンドウがアクティブでなくても、一番上のウィンドウを返す set target_folder to insertion location -- ウィンドウがアクティブない場合、デスクトップを返す if (target_folder as alias) is not equal to (desktop as alias) then try --複数選択されていた場合、何も選択していない場合はエラーになる set target_folder to folder of (selection as alias) set target_class to class of (item 1 of (selection as list)) if target_class is folder then set target_folder to (selection as alias) tell application "System Events" key down command key code 124 key up command end tell end if on error set target_folder to current_folder end try end if set msg to "以下のパスで「新規フォルダ」を作成します。\n\n" & ((target_folder as alias) as text) & "「新規フォルダ」" display dialog msg default answer "" with title "新規フォルダ名の設定" try --アクセス権がない場合はエラーになる make new folder at target_folder with properties {name:text returned of result} on error beep display dialog "新規フォルダを作成できません。\nフォルダ名が重複している、または\nアクセス権がない可能性があります。" buttons {"OK"} default button {"OK"} with icon stop giving up after 10 end try end tell
上記スクリプトを保存して、Quicksilverのショートカットに割り当てて、些細な満足感を得た!
- control-option-command-V(選択アイテムの階層にペースト)
- control-option-command-N(選択アイテムの階層に新規フォルダを作成)
FinderがちょっとだけPath Finderに近づいた瞬間。(フォルダを選択時の挙動がちょっと違うけど、それは現状のFinderの挙動に合わせた結果)