Finderのリスト表示で選択アイテムの階層にペースト、あるいは新規フォルダの作成を行う

些細なことかもしれないが、OS9以前からのMacOSの継続した仕様なのだが、個人的にはどうしても納得できない使い難い機能がある。
まずはFinderでリスト表示の時にフォルダを新規作成する状況を考えてみる。

  • 以下の状況で「新規フォルダ」を作成した時、

  • 自分としては、選択中の新規フォルダの中に「新規フォルダ」が追加されることを期待する。

  • ところが現実は、リスト表示しているウィンドウの階層に「新規フォルダ」追加された。結構がっかりする。
  • 特に、ウィンドウがスクロール可能な状況の場合、表示領域外で「新規フォルダ」が追加される可能性が高く、元の選択アイテムの位置に戻るのが面倒だったりする。


この状況は、ファイルやフォルダをコピー&ペーストする時も同じで、何らかのリストアイテムを選択していたとしても、リスト表示しているウィンドウの階層に対してのペースト処理になる。

GUIを操作する自分の感覚としては、選択されたアイテムに対して作用する処理を実行している気持ちなので、この仕様はすごく不自然に感じる。非常に使い難い。

やはり、Path Finderのように、リスト表示であっても選択アイテムに対して作用する処理になってもらいたいものだ。

目指すFinderの仕様

リスト表示であっても...

  • ファイルを選択中は、そのファイルと同じ階層にペースト、あるいは新規フォルダの作成を行う。
  • フォルダを選択中は、そのフォルダの中にペースト、あるいは新規フォルダの作成を行う。
  • アイテムが複数選択されている場合は、アクティブなウィンドウに対しての操作になる。
  • アイテムが選択されていない場合も、アクティブなウィンドウに対しての操作になる。
  • アクティブなウィンドウが存在しない場合は、デスクトップに対しての操作になる。
  • 新規フォルダを作成する時は、先にフォルダ名を入力してもらう。

選択アイテムの階層にペースト

  --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
      • 上記スクリプトスクリプトエディタにコピーした時、¥(半角 円マーク)を、\(半角 バックスラッシュ)に置き換える必要ありです。(2箇所)

選択アイテムの階層に新規フォルダを作成

  • 不要な部分もあるが、上記ペースト時のスクリプトを流用してやってみた。
  --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
      • 上記スクリプトスクリプトエディタにコピーした時、¥(半角 円マーク)を、\(半角 バックスラッシュ)に置き換える必要ありです。(2箇所)


上記スクリプトを保存して、Quicksilverのショートカットに割り当てて、些細な満足感を得た!

  • control-option-command-V(選択アイテムの階層にペースト)
  • control-option-command-N(選択アイテムの階層に新規フォルダを作成)

FinderがちょっとだけPath Finderに近づいた瞬間。(フォルダを選択時の挙動がちょっと違うけど、それは現状のFinderの挙動に合わせた結果)