GoBACKSPACE————致敬Go2Shell的macOS Finder外掛

zhihaozhang發表於2018-04-18

僅以此專案向Go2Shell致敬、同時慶祝Github10週年生日快樂,整個專案開源於Github,直接想用的朋友可以去百度網盤下載。

背景

在macOS系統中,Finder(中文被官方譯為訪達)扮演著檔案管理器的角色。在大多數場景下,Finder還是挺好用的,但是有一點讓我很抓狂,那就是我在Finder檢視中發現了一個檔案或資料夾,想去它的父級目錄時比較麻煩,因為Finder工具欄左邊的< >按鈕經常是灰色的,而且也只是能記錄著你之前訪問過的檔案路徑歷史,有點類似於safari裡訪問過網頁的歷史。

GoBACKSPACE————致敬Go2Shell的macOS Finder外掛

Finder(訪達)的工具欄截圖 (< >為灰色),藍色指南針為GoBACKSPACE

macOS的Finder只幫你記錄了按時間先後訪問過的檔案地址,這意味著按<鍵並不一定意味著去父級資料夾,它只表示是你之前訪問過的資料夾。 更多情況下,<和>按鍵是灰色的,不讓按的狀態。

而GoBACKSPACE的出現將徹底改變這一現狀,GoBACKSPACE可以做到的就是讓你在檔案的絕對路徑關係之間瀏覽檔案。主要需要解決的絕對路徑去父資料夾的功能,因為去子資料夾只需要靠雙擊操作即可。我覺得絕對路徑關係是更符合我思考的一種方式。去父資料夾這件事還是經常發生的,比如你在一個專案檢視下,想去父目錄將整個專案刪除或AirDrop分享給其他人;搜尋到了一張照片,想將該目錄下所有照片打包等…

由於GoBACKSPACE和Finder之間的關係緊密,把它做成一個類似Go2Shell那樣的外掛是更好的選擇;考慮到GoBACKSPACE的開發初衷是幫助使用者更好的在不同資料夾間切換,因此這裡選用了一個指南針作為logo,乍一看跟safari的圖示好像,估計上架時會被蘋果噴。看著旁邊的Go2Shell,竟毫無違和感。

希望至此,讀者已經明白了我為什麼要開發GoBACKSPACE。

使用方法

首先要下載這個軟體,我將安裝檔案打包上傳到了百度網盤,無需密碼即可下載。

為了幫助讀者將GoBACKSPACE新增到Finder工具欄,我做了一個Gif如下。

GoBACKSPACE————致敬Go2Shell的macOS Finder外掛

將GoBACKSPACE新增到Finder工具欄的方法

一次新增即可,無需重複新增,使用它的時候,需要兩個步驟:

  • 步驟1:點選icon
  • 步驟2:沒有步驟2!!

App icon

外掛的最終效果demo

核心功能的實現

本專案的需求是我個人的真實需求,實現的時候參考了PathToGo這個專案,該專案返回上層使用了AppleScript,蘋果自己的指令碼語言,並使用Swift與之進行互動,返回指令碼執行成功與否;並根據指令碼的執行情況給使用者彈toast,以免在最頂層目錄時,不能繼續往父級目錄前進給使用者帶來困擾。


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的邏輯是將當前Finder檢視的路徑返回,然後將這個路徑以”/”進行分割,並根據返回陣列的長度,去掉最後兩個元素,形成新的路徑,讓AppleScript控制Finder將當前頁面替換為新的資料夾路徑,由於AppleScript的原生性,體驗還是非常順滑的。

Toast的出現和消除新增了動畫,且動畫的時間都是可以設定的,實現於ToastWindowController.swift檔案中,感興趣的讀者可以去將專案clone下來看看,我覺得這個部分可以單獨抽出去成為一個小輪子,也來源於PathToGO。

參考

相關文章