僅以此項(xiàng)目向Go2Shell致敬、也祝Github10周年生日快樂,整個(gè)項(xiàng)目開源于Github,直接想用的朋友可以去百度網(wǎng)盤下載。
背景
在macOS系統(tǒng)中,Finder(中文被官方譯為訪達(dá))扮演著文件管理器的角色。在大多數(shù)場(chǎng)景下,F(xiàn)inder還是挺好用的,但是有一點(diǎn)讓我很抓狂,那就是我在Finder視圖中發(fā)現(xiàn)了一個(gè)文件或文件夾,想去它的父級(jí)目錄時(shí)比較麻煩,因?yàn)镕inder工具欄左邊的< >按鈕經(jīng)常是灰色的,而且也只是能記錄著你之前訪問過的文件路徑歷史,有點(diǎn)類似于safari里訪問過網(wǎng)頁(yè)的歷史。
Finder(訪達(dá))的工具欄截圖 (< >為灰色),藍(lán)色指南針為GoBACKSPACE
macOS的Finder只幫你記錄了按時(shí)間先后訪問過的文件地址,這意味著按<鍵并不一定意味著去父級(jí)文件夾,它只表示是你之前訪問過的文件夾。 更多情況下,<和>按鍵是灰色的,不讓按的狀態(tài)。
而GoBACKSPACE的出現(xiàn)將徹底改變這一現(xiàn)狀,GoBACKSPACE可以做到的就是讓你在文件的絕對(duì)路徑關(guān)系之間瀏覽文件。主要需要解決的絕對(duì)路徑去父文件夾的功能,因?yàn)槿プ游募A只需要靠雙擊操作即可。我覺得絕對(duì)路徑關(guān)系是更符合我思考的一種方式。去父文件夾這件事還是經(jīng)常發(fā)生的,比如你在一個(gè)項(xiàng)目視圖下,想去父目錄將整個(gè)項(xiàng)目刪除或AirDrop分享給其他人;搜索到了一張照片,想將該目錄下所有照片打包等…
由于GoBACKSPACE和Finder之間的關(guān)系緊密,把它做成一個(gè)類似Go2Shell那樣的插件是更好的選擇;考慮到GoBACKSPACE的開發(fā)初衷是幫助用戶更好的在不同文件夾間切換,因此這里選用了一個(gè)指南針作為logo,乍一看跟safari的圖標(biāo)好像,估計(jì)上架時(shí)會(huì)被蘋果噴。看著旁邊的Go2Shell,竟毫無違和感。
希望至此,讀者已經(jīng)明白了我為什么要開發(fā)GoBACKSPACE。
使用方法
首先要下載這個(gè)軟件,我將安裝文件打包上傳到了百度網(wǎng)盤,無需密碼即可下載。
為了幫助讀者將GoBACKSPACE添加到Finder工具欄,我做了一個(gè)Gif如下。
將GoBACKSPACE添加到Finder工具欄的方法
一次添加即可,無需重復(fù)添加,使用它的時(shí)候,需要兩個(gè)步驟:
- 步驟1:點(diǎn)擊icon
- 步驟2:沒有步驟2!!
插件的最終效果demo
核心功能的實(shí)現(xiàn)
本項(xiàng)目的需求是我個(gè)人的真實(shí)需求,實(shí)現(xiàn)的時(shí)候參考了PathToGo這個(gè)項(xiàng)目,該項(xiàng)目返回上層使用了AppleScript,蘋果自己的腳本語(yǔ)言,并使用Swift與之進(jìn)行交互,返回腳本執(zhí)行成功與否;并根據(jù)腳本的執(zhí)行情況給用戶彈toast,以免在最頂層目錄時(shí),不能繼續(xù)往父級(jí)目錄前進(jìn)給用戶帶來困擾。
tell application "Finder"
set currentPath to POSIX path of (target of window 1 as alias)
set myArray to my theSplit(currentPath, "/")
set lengthOfArray to the length of myArray
set the_path to "" as string
if lengthOfArray ≤ 3 then
return "fail"
else
set lengthOfNewArray to (lengthOfArray - 2)
set parentPath to items 2 through lengthOfNewArray of myArray
repeat with anItem in parentPath
set the_path to the_path & "/" & anItem
end repeat
set the_path to the_path & "/"
-- go2Parent(the_path)
set the_folder to (POSIX file the_path) as alias
tell application "Finder"
activate
if window 1 exists then
set target of window 1 to the_folder
else
reveal the_folder
end if
end tell
return "OK"
end if
return myArray
end tell
on theSplit(theString, theDelimiter)
-- save delimiters to restore old settings
set oldDelimiters to AppleScript's text item delimiters
-- set delimiters to delimiter to be used
set AppleScript's text item delimiters to theDelimiter
-- create the array
set theArray to every text item of theString
-- restore the old setting
set AppleScript's text item delimiters to oldDelimiters
-- return the result
return theArray
end theSplit
AppleScript的邏輯是將當(dāng)前Finder視圖的路徑返回,然后將這個(gè)路徑以”/”進(jìn)行分割,并根據(jù)返回?cái)?shù)組的長(zhǎng)度,去掉最后兩個(gè)元素,形成新的路徑,讓AppleScript控制Finder將當(dāng)前頁(yè)面替換為新的文件夾路徑,由于AppleScript的原生性,體驗(yàn)還是非常順滑的。
Toast的出現(xiàn)和消除添加了動(dòng)畫,且動(dòng)畫的時(shí)間都是可以設(shè)置的,實(shí)現(xiàn)于ToastWindowController.swift文件中,感興趣的讀者可以去將項(xiàng)目clone下來看看,我覺得這個(gè)部分可以單獨(dú)抽出去成為一個(gè)小輪子,也來源于PathToGO。